X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lnet%2Futils%2Fportals.c;h=fb031ae1b52070b5511587d573a8ed281d4a6920;hb=a70eb6ff289cd2984f1e5af94e65cdc882606a23;hp=2d1a0b5ec7be5e28d74c93410483653626809ebc;hpb=83e9a4ea8214c250207c0d107aeedb254f9d4181;p=fs%2Flustre-release.git diff --git a/lnet/utils/portals.c b/lnet/utils/portals.c index 2d1a0b5..fb031ae 100644 --- a/lnet/utils/portals.c +++ b/lnet/utils/portals.c @@ -36,16 +36,32 @@ #include #include +#ifdef __CYGWIN__ + +#include + +#warning assuming little endian + +#define __cpu_to_le64(x) ((__u64)(x)) +#define __le64_to_cpu(x) ((__u64)(x)) +#define __cpu_to_le32(x) ((__u32)(x)) +#define __le32_to_cpu(x) ((__u32)(x)) +#define __cpu_to_le16(x) ((__u16)(x)) +#define __le16_to_cpu(x) ((__u16)(x)) + +#endif /* __CYGWIN__ */ + #include #include #include #include +#include #include "parser.h" unsigned int portal_debug; unsigned int portal_printk; unsigned int portal_stack; - +unsigned int portal_cerror; static unsigned int g_nal = 0; @@ -62,13 +78,49 @@ typedef struct static name2num_t nalnames[] = { {"any", 0}, {"tcp", SOCKNAL}, - {"toe", TOENAL}, {"elan", QSWNAL}, {"gm", GMNAL}, + {"ib", IBNAL}, {"scimac", SCIMACNAL}, {NULL, -1} }; +static cfg_record_cb_t g_record_cb; + +int +ptl_set_cfg_record_cb(cfg_record_cb_t cb) +{ + g_record_cb = cb; + return 0; +} + +int +pcfg_ioctl(struct portals_cfg *pcfg) +{ + int rc; + + if (pcfg->pcfg_nal ==0) + pcfg->pcfg_nal = g_nal; + + if (g_record_cb) { + rc = g_record_cb(PORTALS_CFG_TYPE, sizeof(*pcfg), pcfg); + } else { + struct portal_ioctl_data data; + PORTAL_IOC_INIT (data); + data.ioc_pbuf1 = (char*)pcfg; + data.ioc_plen1 = sizeof(*pcfg); + /* XXX liblustre hack XXX */ + data.ioc_nal_cmd = pcfg->pcfg_command; + data.ioc_nid = pcfg->pcfg_nid; + + rc = l_ioctl (PORTALS_DEV_ID, IOC_PORTAL_NAL_CMD, &data); + } + + return (rc); +} + + + static name2num_t * name2num_lookup_name (name2num_t *table, char *str) { @@ -154,7 +206,7 @@ ptl_parse_time (time_t *t, char *str) return (0); memset (&tm, 0, sizeof (tm)); - n = sscanf (str, "%d-%d-%d %d:%d:%d", + n = sscanf (str, "%d-%d-%d-%d:%d:%d", &tm.tm_year, &tm.tm_mon, &tm.tm_mday, &tm.tm_hour, &tm.tm_min, &tm.tm_sec); if (n != 6) @@ -227,8 +279,9 @@ ptl_ipaddr_2_str (__u32 ipaddr, char *str) int ptl_parse_nid (ptl_nid_t *nidp, char *str) { - __u32 ipaddr; - long lval; + __u32 ipaddr; + char *end; + unsigned long long ullval; if (!strcmp (str, "_all_")) { *nidp = PTL_NID_ANY; @@ -240,15 +293,10 @@ ptl_parse_nid (ptl_nid_t *nidp, char *str) return (0); } - if (sscanf (str, "%li", &lval) == 1) - { - *nidp = (ptl_nid_t)lval; - return (0); - } - - if (sscanf (str, "%lx", &lval) == 1) - { - *nidp = (ptl_nid_t)lval; + ullval = strtoull(str, &end, 0); + if (*end == 0) { + /* parsed whole string */ + *nidp = (ptl_nid_t)ullval; return (0); } @@ -391,7 +439,7 @@ int jt_ptl_network(int argc, char **argv) int jt_ptl_print_autoconnects (int argc, char **argv) { - struct portal_ioctl_data data; + struct portals_cfg pcfg; char buffer[64]; int index; int rc; @@ -400,24 +448,21 @@ jt_ptl_print_autoconnects (int argc, char **argv) return -1; for (index = 0;;index++) { - PORTAL_IOC_INIT (data); - data.ioc_nal = g_nal; - data.ioc_nal_cmd = NAL_CMD_GET_AUTOCONN; - data.ioc_count = index; - - rc = l_ioctl (PORTALS_DEV_ID, IOC_PORTAL_NAL_CMD, &data); + PCFG_INIT (pcfg, NAL_CMD_GET_AUTOCONN); + pcfg.pcfg_count = index; + + rc = pcfg_ioctl (&pcfg); if (rc != 0) break; - printf (LPX64"@%s:%d #%d buffer %d nonagle %s xchg %s " - "affinity %s eager %s share %d\n", - data.ioc_nid, ptl_ipaddr_2_str (data.ioc_id, buffer), - data.ioc_misc, data.ioc_count, data.ioc_size, - (data.ioc_flags & 1) ? "on" : "off", - (data.ioc_flags & 2) ? "on" : "off", - (data.ioc_flags & 4) ? "on" : "off", - (data.ioc_flags & 8) ? "on" : "off", - data.ioc_wait); + printf (LPX64"@%s:%d #%d buffer %d " + "nonagle %s affinity %s eager %s share %d\n", + pcfg.pcfg_nid, ptl_ipaddr_2_str (pcfg.pcfg_id, buffer), + pcfg.pcfg_misc, pcfg.pcfg_count, pcfg.pcfg_size, + (pcfg.pcfg_flags & 1) ? "on" : "off", + (pcfg.pcfg_flags & 2) ? "on" : "off", + (pcfg.pcfg_flags & 4) ? "on" : "off", + pcfg.pcfg_wait); } if (index == 0) @@ -428,18 +473,17 @@ jt_ptl_print_autoconnects (int argc, char **argv) int jt_ptl_add_autoconnect (int argc, char **argv) { - struct portal_ioctl_data data; + struct portals_cfg pcfg; ptl_nid_t nid; __u32 ip; int port; - int xchange_nids = 0; int irq_affinity = 0; int share = 0; int eager = 0; int rc; if (argc < 4 || argc > 5) { - fprintf (stderr, "usage: %s nid ipaddr port [ixse]\n", argv[0]); + fprintf (stderr, "usage: %s nid ipaddr port [ise]\n", argv[0]); return 0; } @@ -467,9 +511,6 @@ jt_ptl_add_autoconnect (int argc, char **argv) while (*opts != 0) switch (*opts++) { - case 'x': - xchange_nids = 1; - break; case 'i': irq_affinity = 1; break; @@ -486,21 +527,18 @@ jt_ptl_add_autoconnect (int argc, char **argv) } } - PORTAL_IOC_INIT (data); - data.ioc_nal = g_nal; - data.ioc_nal_cmd = NAL_CMD_ADD_AUTOCONN; - data.ioc_nid = nid; - data.ioc_id = ip; - data.ioc_misc = port; + PCFG_INIT(pcfg, NAL_CMD_ADD_AUTOCONN); + pcfg.pcfg_nid = nid; + pcfg.pcfg_id = ip; + pcfg.pcfg_misc = port; /* only passing one buffer size! */ - data.ioc_size = MAX (g_socket_rxmem, g_socket_txmem); - data.ioc_flags = (g_socket_nonagle ? 0x01 : 0) | - (xchange_nids ? 0x02 : 0) | - (irq_affinity ? 0x04 : 0) | - (share ? 0x08 : 0) | - (eager ? 0x10 : 0); - - rc = l_ioctl (PORTALS_DEV_ID, IOC_PORTAL_NAL_CMD, &data); + pcfg.pcfg_size = MAX (g_socket_rxmem, g_socket_txmem); + pcfg.pcfg_flags = (g_socket_nonagle ? 0x01 : 0) | + (irq_affinity ? 0x02 : 0) | + (share ? 0x04 : 0) | + (eager ? 0x08 : 0); + + rc = pcfg_ioctl (&pcfg); if (rc != 0) { fprintf (stderr, "failed to enable autoconnect: %s\n", strerror (errno)); @@ -513,7 +551,7 @@ jt_ptl_add_autoconnect (int argc, char **argv) int jt_ptl_del_autoconnect (int argc, char **argv) { - struct portal_ioctl_data data; + struct portals_cfg pcfg; ptl_nid_t nid = PTL_NID_ANY; __u32 ip = 0; int share = 0; @@ -559,15 +597,13 @@ jt_ptl_del_autoconnect (int argc, char **argv) } } - PORTAL_IOC_INIT (data); - data.ioc_nal = g_nal; - data.ioc_nal_cmd = NAL_CMD_DEL_AUTOCONN; - data.ioc_nid = nid; - data.ioc_id = ip; - data.ioc_flags = (share ? 1 : 0) | + PCFG_INIT(pcfg, NAL_CMD_DEL_AUTOCONN); + pcfg.pcfg_nid = nid; + pcfg.pcfg_id = ip; + pcfg.pcfg_flags = (share ? 1 : 0) | (keep_conn ? 2 : 0); - - rc = l_ioctl (PORTALS_DEV_ID, IOC_PORTAL_NAL_CMD, &data); + + rc = pcfg_ioctl (&pcfg); if (rc != 0) { fprintf (stderr, "failed to remove autoconnect route: %s\n", strerror (errno)); @@ -580,7 +616,7 @@ jt_ptl_del_autoconnect (int argc, char **argv) int jt_ptl_print_connections (int argc, char **argv) { - struct portal_ioctl_data data; + struct portals_cfg pcfg; char buffer[64]; int index; int rc; @@ -589,19 +625,21 @@ jt_ptl_print_connections (int argc, char **argv) return -1; for (index = 0;;index++) { - PORTAL_IOC_INIT (data); - data.ioc_nal = g_nal; - data.ioc_nal_cmd = NAL_CMD_GET_CONN; - data.ioc_count = index; + PCFG_INIT (pcfg, NAL_CMD_GET_CONN); + pcfg.pcfg_count = index; - rc = l_ioctl (PORTALS_DEV_ID, IOC_PORTAL_NAL_CMD, &data); + rc = pcfg_ioctl (&pcfg); if (rc != 0) break; - printf (LPX64"@%s:%d\n", - data.ioc_nid, - ptl_ipaddr_2_str (data.ioc_id, buffer), - data.ioc_misc); + printf (LPX64"@%s:%d:%s\n", + pcfg.pcfg_nid, + ptl_ipaddr_2_str (pcfg.pcfg_id, buffer), + pcfg.pcfg_misc, + (pcfg.pcfg_flags == SOCKNAL_CONN_ANY) ? "A" : + (pcfg.pcfg_flags == SOCKNAL_CONN_CONTROL) ? "C" : + (pcfg.pcfg_flags == SOCKNAL_CONN_BULK_IN) ? "I" : + (pcfg.pcfg_flags == SOCKNAL_CONN_BULK_OUT) ? "O" : "?"); } if (index == 0) @@ -609,82 +647,9 @@ jt_ptl_print_connections (int argc, char **argv) return 0; } -int -exchange_nids (int cfd, ptl_nid_t my_nid, ptl_nid_t *peer_nid) -{ - int rc; - ptl_hdr_t hdr; - ptl_magicversion_t *hmv = (ptl_magicversion_t *)&hdr.dest_nid; - - LASSERT (sizeof (*hmv) == sizeof (hdr.dest_nid)); - - memset (&hdr, 0, sizeof (hdr)); - - hmv->magic = __cpu_to_le32 (PORTALS_PROTO_MAGIC); - hmv->version_major = __cpu_to_le16 (PORTALS_PROTO_VERSION_MAJOR); - hmv->version_minor = __cpu_to_le16 (PORTALS_PROTO_VERSION_MINOR); - - hdr.src_nid = __cpu_to_le64 (my_nid); - hdr.type = __cpu_to_le32 (PTL_MSG_HELLO); - - /* Assume there's sufficient socket buffering for a portals HELLO header */ - rc = sock_write (cfd, &hdr, sizeof (hdr)); - if (rc != 0) { - perror ("Can't send initial HELLO"); - return (-1); - } - - /* First few bytes down the wire are the portals protocol magic and - * version, no matter what protocol version we're running. */ - - rc = sock_read (cfd, hmv, sizeof (*hmv)); - if (rc != 0) { - perror ("Can't read from peer"); - return (-1); - } - - if (hmv->magic != __cpu_to_le32 (PORTALS_PROTO_MAGIC)) { - fprintf (stderr, "Bad magic %#08x (%#08x expected)\n", - __le32_to_cpu (hmv->magic), PORTALS_PROTO_MAGIC); - return (-1); - } - - if (hmv->version_major != __cpu_to_le16 (PORTALS_PROTO_VERSION_MAJOR) || - hmv->version_minor != __cpu_to_le16 (PORTALS_PROTO_VERSION_MINOR)) { - fprintf (stderr, "Incompatible protocol version %d.%d (%d.%d expected)\n", - __le16_to_cpu (hmv->version_major), - __le16_to_cpu (hmv->version_minor), - PORTALS_PROTO_VERSION_MAJOR, - PORTALS_PROTO_VERSION_MINOR); - } - - /* version 0 sends magic/version as the dest_nid of a 'hello' header, - * so read the rest of it in now... */ - LASSERT (PORTALS_PROTO_VERSION_MAJOR == 0); - rc = sock_read (cfd, hmv + 1, sizeof (hdr) - sizeof (*hmv)); - if (rc != 0) { - perror ("Can't read rest of HELLO hdr"); - return (-1); - } - - /* ...and check we got what we expected */ - if (hdr.type != __cpu_to_le32 (PTL_MSG_HELLO) || - PTL_HDR_LENGTH (&hdr) != __cpu_to_le32 (0)) { - fprintf (stderr, "Expecting a HELLO hdr with 0 payload," - " but got type %d with %d payload\n", - __le32_to_cpu (hdr.type), - __le32_to_cpu (PTL_HDR_LENGTH (&hdr))); - return (-1); - } - - *peer_nid = __le64_to_cpu (hdr.src_nid); - return (0); -} - int jt_ptl_connect(int argc, char **argv) { - ptl_nid_t peer_nid; - struct portal_ioctl_data data; + struct portals_cfg pcfg; struct sockaddr_in srvaddr; __u32 ipaddr; char *flag; @@ -693,17 +658,17 @@ int jt_ptl_connect(int argc, char **argv) int rxmem = 0; int txmem = 0; int bind_irq = 0; - int xchange_nids = 0; + int type = SOCKNAL_CONN_ANY; int port; int o; int olen; if (argc < 3) { - fprintf(stderr, "usage: %s ip port [xi]\n", argv[0]); + fprintf(stderr, "usage: %s ip port [xibctr]\n", argv[0]); return 0; } - if (!g_nal_is_compatible (argv[0], SOCKNAL, TOENAL, 0)) + if (!g_nal_is_compatible (argv[0], SOCKNAL, 0)) return -1; rc = ptl_parse_ipaddr (&ipaddr, argv[1]); @@ -725,8 +690,28 @@ int jt_ptl_connect(int argc, char **argv) bind_irq = 1; break; - case 'x': - xchange_nids = 1; + case 'I': + if (type != SOCKNAL_CONN_ANY) { + fprintf(stderr, "Can't flag type twice\n"); + return -1; + } + type = SOCKNAL_CONN_BULK_IN; + break; + + case 'O': + if (type != SOCKNAL_CONN_ANY) { + fprintf(stderr, "Can't flag type twice\n"); + return -1; + } + type = SOCKNAL_CONN_BULK_OUT; + break; + + case 'C': + if (type != SOCKNAL_CONN_ANY) { + fprintf(stderr, "Can't flag type twice\n"); + return -1; + } + type = SOCKNAL_CONN_CONTROL; break; default: @@ -787,36 +772,20 @@ int jt_ptl_connect(int argc, char **argv) if (getsockopt (fd, IPPROTO_TCP, TCP_NODELAY, &nonagle, &olen) != 0) fprintf (stderr, "Can't get nagle: %s\n", strerror (errno)); - if (!xchange_nids) - peer_nid = ipaddr; - else { - PORTAL_IOC_INIT (data); - data.ioc_nal = g_nal; - rc = l_ioctl(PORTALS_DEV_ID, IOC_PORTAL_GET_NID, &data); - if (rc != 0) { - fprintf (stderr, "failed to get my nid: %s\n", - strerror (errno)); - close (fd); - return (-1); - } - - rc = exchange_nids (fd, data.ioc_nid, &peer_nid); - if (rc != 0) { - close (fd); - return (-1); - } - } - printf("Connected host: %s NID "LPX64" snd: %d rcv: %d nagle: %s\n", argv[1], - peer_nid, txmem, rxmem, nonagle ? "Disabled" : "Enabled"); - - PORTAL_IOC_INIT(data); - data.ioc_fd = fd; - data.ioc_nal = g_nal; - data.ioc_nal_cmd = NAL_CMD_REGISTER_PEER_FD; - data.ioc_nid = peer_nid; - data.ioc_flags = bind_irq; - - rc = l_ioctl(PORTALS_DEV_ID, IOC_PORTAL_NAL_CMD, &data); + printf("Connected host: %s snd: %d rcv: %d nagle: %s type: %s\n", + argv[1], txmem, rxmem, nonagle ? "Disabled" : "Enabled", + (type == SOCKNAL_CONN_ANY) ? "A" : + (type == SOCKNAL_CONN_CONTROL) ? "C" : + (type == SOCKNAL_CONN_BULK_IN) ? "I" : + (type == SOCKNAL_CONN_BULK_OUT) ? "O" : "?"); + + PCFG_INIT(pcfg, NAL_CMD_REGISTER_PEER_FD); + pcfg.pcfg_nal = g_nal; + pcfg.pcfg_fd = fd; + pcfg.pcfg_flags = bind_irq; + pcfg.pcfg_misc = type; + + rc = pcfg_ioctl(&pcfg); if (rc) { fprintf(stderr, "failed to register fd with portals: %s\n", strerror(errno)); @@ -824,7 +793,7 @@ int jt_ptl_connect(int argc, char **argv) return -1; } - printf("Connection to "LPX64" registered with socknal\n", peer_nid); + printf("Connection to %s registered with socknal\n", argv[1]); rc = close(fd); if (rc) @@ -835,7 +804,7 @@ int jt_ptl_connect(int argc, char **argv) int jt_ptl_disconnect(int argc, char **argv) { - struct portal_ioctl_data data; + struct portals_cfg pcfg; ptl_nid_t nid = PTL_NID_ANY; __u32 ipaddr = 0; int rc; @@ -845,7 +814,7 @@ int jt_ptl_disconnect(int argc, char **argv) return 0; } - if (!g_nal_is_compatible (NULL, SOCKNAL, TOENAL, 0)) + if (!g_nal_is_compatible (NULL, SOCKNAL, 0)) return 0; if (argc >= 2 && @@ -860,13 +829,11 @@ int jt_ptl_disconnect(int argc, char **argv) return -1; } - PORTAL_IOC_INIT(data); - data.ioc_nal = g_nal; - data.ioc_nal_cmd = NAL_CMD_CLOSE_CONNECTION; - data.ioc_nid = nid; - data.ioc_id = ipaddr; + PCFG_INIT(pcfg, NAL_CMD_CLOSE_CONNECTION); + pcfg.pcfg_nid = nid; + pcfg.pcfg_id = ipaddr; - rc = l_ioctl(PORTALS_DEV_ID, IOC_PORTAL_NAL_CMD, &data); + rc = pcfg_ioctl(&pcfg); if (rc) { fprintf(stderr, "failed to remove connection: %s\n", strerror(errno)); @@ -878,7 +845,7 @@ int jt_ptl_disconnect(int argc, char **argv) int jt_ptl_push_connection (int argc, char **argv) { - struct portal_ioctl_data data; + struct portals_cfg pcfg; int rc; ptl_nid_t nid = PTL_NID_ANY; __u32 ipaddr = 0; @@ -888,7 +855,7 @@ int jt_ptl_push_connection (int argc, char **argv) return 0; } - if (!g_nal_is_compatible (argv[0], SOCKNAL, TOENAL, 0)) + if (!g_nal_is_compatible (argv[0], SOCKNAL, 0)) return -1; if (argc > 1 && @@ -902,13 +869,11 @@ int jt_ptl_push_connection (int argc, char **argv) fprintf(stderr, "Can't parse ipaddr: %s\n", argv[2]); } - PORTAL_IOC_INIT(data); - data.ioc_nal = g_nal; - data.ioc_nal_cmd = NAL_CMD_PUSH_CONNECTION; - data.ioc_nid = nid; - data.ioc_id = ipaddr; - - rc = l_ioctl(PORTALS_DEV_ID, IOC_PORTAL_NAL_CMD, &data); + PCFG_INIT(pcfg, NAL_CMD_PUSH_CONNECTION); + pcfg.pcfg_nid = nid; + pcfg.pcfg_id = ipaddr; + + rc = pcfg_ioctl(&pcfg); if (rc) { fprintf(stderr, "failed to push connection: %s\n", strerror(errno)); @@ -921,7 +886,7 @@ int jt_ptl_push_connection (int argc, char **argv) int jt_ptl_print_active_txs (int argc, char **argv) { - struct portal_ioctl_data data; + struct portals_cfg pcfg; int index; int rc; @@ -929,28 +894,26 @@ jt_ptl_print_active_txs (int argc, char **argv) return -1; for (index = 0;;index++) { - PORTAL_IOC_INIT (data); - data.ioc_nal = g_nal; - data.ioc_nal_cmd = NAL_CMD_GET_TXDESC; - data.ioc_count = index; - - rc = l_ioctl (PORTALS_DEV_ID, IOC_PORTAL_NAL_CMD, &data); + PCFG_INIT(pcfg, NAL_CMD_GET_TXDESC); + pcfg.pcfg_count = index; + + rc = pcfg_ioctl(&pcfg); if (rc != 0) break; - printf ("%p: %5s payload %6d bytes to "LPX64" via "LPX64" by pid %6d: %s,%s,%s\n", - data.ioc_pbuf1, - data.ioc_count == PTL_MSG_ACK ? "ACK" : - data.ioc_count == PTL_MSG_PUT ? "PUT" : - data.ioc_count == PTL_MSG_GET ? "GET" : - data.ioc_count == PTL_MSG_REPLY ? "REPLY" : "", - data.ioc_size, - data.ioc_nid, - data.ioc_nid2, - data.ioc_misc, - (data.ioc_flags & 1) ? "delayed" : "active", - (data.ioc_flags & 2) ? "forwarding" : "sending", - (data.ioc_flags & 4) ? "nblk" : "normal"); + printf ("%p: %5s payload %6d bytes to "LPX64" via "LPX64" by pid %6d: %s, %s, state %d\n", + pcfg.pcfg_pbuf1, + pcfg.pcfg_count == PTL_MSG_ACK ? "ACK" : + pcfg.pcfg_count == PTL_MSG_PUT ? "PUT" : + pcfg.pcfg_count == PTL_MSG_GET ? "GET" : + pcfg.pcfg_count == PTL_MSG_REPLY ? "REPLY" : "", + pcfg.pcfg_size, + pcfg.pcfg_nid, + pcfg.pcfg_nid2, + pcfg.pcfg_misc, + (pcfg.pcfg_flags & 1) ? "delayed" : "immediate", + (pcfg.pcfg_flags & 2) ? "nblk" : "normal", + pcfg.pcfg_flags >> 2); } if (index == 0) @@ -1043,7 +1006,7 @@ int jt_ptl_mynid(int argc, char **argv) int rc; char hostname[1024]; char *nidstr; - struct portal_ioctl_data data; + struct portals_cfg pcfg; ptl_nid_t mynid; if (argc > 2) { @@ -1071,12 +1034,10 @@ int jt_ptl_mynid(int argc, char **argv) return -1; } - PORTAL_IOC_INIT(data); - data.ioc_nid = mynid; - data.ioc_nal = g_nal; - data.ioc_nal_cmd = NAL_CMD_REGISTER_MYNID; + PCFG_INIT(pcfg, NAL_CMD_REGISTER_MYNID); + pcfg.pcfg_nid = mynid; - rc = l_ioctl(PORTALS_DEV_ID, IOC_PORTAL_NAL_CMD, &data); + rc = pcfg_ioctl(&pcfg); if (rc < 0) fprintf(stderr, "setting my NID failed: %s\n", strerror(errno)); @@ -1190,7 +1151,7 @@ jt_ptl_nagle (int argc, char **argv) int jt_ptl_add_route (int argc, char **argv) { - struct portal_ioctl_data data; + struct portals_cfg pcfg; ptl_nid_t nid1; ptl_nid_t nid2; ptl_nid_t gateway_nid; @@ -1225,16 +1186,17 @@ jt_ptl_add_route (int argc, char **argv) return (-1); } - PORTAL_IOC_INIT(data); - data.ioc_nid = gateway_nid; - data.ioc_nal = g_nal; - data.ioc_nid2 = MIN (nid1, nid2); - data.ioc_nid3 = MAX (nid1, nid2); + PCFG_INIT(pcfg, NAL_CMD_ADD_ROUTE); + pcfg.pcfg_nid = gateway_nid; + pcfg.pcfg_nal = ROUTER; + pcfg.pcfg_gw_nal = g_nal; + pcfg.pcfg_nid2 = MIN (nid1, nid2); + pcfg.pcfg_nid3 = MAX (nid1, nid2); - rc = l_ioctl(PORTALS_DEV_ID, IOC_PORTAL_ADD_ROUTE, &data); + rc = pcfg_ioctl(&pcfg); if (rc != 0) { - fprintf (stderr, "IOC_PORTAL_ADD_ROUTE failed: %s\n", strerror (errno)); + fprintf (stderr, "NAL_CMD_ADD_ROUTE failed: %s\n", strerror (errno)); return (-1); } @@ -1244,7 +1206,7 @@ jt_ptl_add_route (int argc, char **argv) int jt_ptl_del_route (int argc, char **argv) { - struct portal_ioctl_data data; + struct portals_cfg pcfg; ptl_nid_t nid; ptl_nid_t nid1 = PTL_NID_ANY; ptl_nid_t nid2 = PTL_NID_ANY; @@ -1288,16 +1250,17 @@ jt_ptl_del_route (int argc, char **argv) } } - PORTAL_IOC_INIT(data); - data.ioc_nal = g_nal; - data.ioc_nid = nid; - data.ioc_nid2 = nid1; - data.ioc_nid3 = nid2; - - rc = l_ioctl(PORTALS_DEV_ID, IOC_PORTAL_DEL_ROUTE, &data); + PCFG_INIT(pcfg, NAL_CMD_DEL_ROUTE); + pcfg.pcfg_nal = ROUTER; + pcfg.pcfg_gw_nal = g_nal; + pcfg.pcfg_nid = nid; + pcfg.pcfg_nid2 = nid1; + pcfg.pcfg_nid3 = nid2; + + rc = pcfg_ioctl(&pcfg); if (rc != 0) { - fprintf (stderr, "IOC_PORTAL_DEL_ROUTE ("LPX64") failed: %s\n", nid, strerror (errno)); + fprintf (stderr, "NAL_CMD_DEL_ROUTE ("LPX64") failed: %s\n", nid, strerror (errno)); return (-1); } @@ -1307,7 +1270,7 @@ jt_ptl_del_route (int argc, char **argv) int jt_ptl_notify_router (int argc, char **argv) { - struct portal_ioctl_data data; + struct portals_cfg pcfg; int enable; ptl_nid_t nid; int rc; @@ -1338,7 +1301,7 @@ jt_ptl_notify_router (int argc, char **argv) when = now.tv_sec; } else if (ptl_parse_time (&when, argv[3]) != 0) { fprintf(stderr, "Can't parse time %s\n" - "Please specify either 'YYYY-MM-DD HH:MM:SS'\n" + "Please specify either 'YYYY-MM-DD-HH:MM:SS'\n" "or an absolute unix time in seconds\n", argv[3]); return (-1); } else if (when > now.tv_sec) { @@ -1347,17 +1310,18 @@ jt_ptl_notify_router (int argc, char **argv) return (-1); } - PORTAL_IOC_INIT(data); - data.ioc_nal = g_nal; - data.ioc_nid = nid; - data.ioc_flags = enable; + PCFG_INIT(pcfg, NAL_CMD_NOTIFY_ROUTER); + pcfg.pcfg_nal = ROUTER; + pcfg.pcfg_gw_nal = g_nal; + pcfg.pcfg_nid = nid; + pcfg.pcfg_flags = enable; /* Yeuch; 'cept I need a __u64 on 64 bit machines... */ - data.ioc_nid3 = (__u64)when; + pcfg.pcfg_nid3 = (__u64)when; - rc = l_ioctl(PORTALS_DEV_ID, IOC_PORTAL_NOTIFY_ROUTER, &data); + rc = pcfg_ioctl(&pcfg); if (rc != 0) { - fprintf (stderr, "IOC_PORTAL_NOTIFY_ROUTER ("LPX64") failed: %s\n", + fprintf (stderr, "NAL_CMD_NOTIFY_ROUTER ("LPX64") failed: %s\n", nid, strerror (errno)); return (-1); } @@ -1369,7 +1333,7 @@ int jt_ptl_print_routes (int argc, char **argv) { char buffer[3][128]; - struct portal_ioctl_data data; + struct portals_cfg pcfg; int rc; int index; int gateway_nal; @@ -1380,18 +1344,19 @@ jt_ptl_print_routes (int argc, char **argv) for (index = 0;;index++) { - PORTAL_IOC_INIT(data); - data.ioc_count = index; + PCFG_INIT(pcfg, NAL_CMD_GET_ROUTE); + pcfg.pcfg_nal = ROUTER; + pcfg.pcfg_count = index; - rc = l_ioctl(PORTALS_DEV_ID, IOC_PORTAL_GET_ROUTE, &data); + rc = pcfg_ioctl(&pcfg); if (rc != 0) break; - gateway_nal = data.ioc_nal; - gateway_nid = data.ioc_nid; - nid1 = data.ioc_nid2; - nid2 = data.ioc_nid3; - alive = data.ioc_flags; + gateway_nal = pcfg.pcfg_gw_nal; + gateway_nid = pcfg.pcfg_nid; + nid1 = pcfg.pcfg_nid2; + nid2 = pcfg.pcfg_nid3; + alive = pcfg.pcfg_flags; printf ("%8s %18s : %s - %s, %s\n", nal2name (gateway_nal), @@ -1423,7 +1388,8 @@ lwt_control(int enable, int clear) } static int -lwt_snapshot(int *ncpu, int *totalsize, lwt_event_t *events, int size) +lwt_snapshot(cycles_t *now, int *ncpu, int *totalsize, + lwt_event_t *events, int size) { struct portal_ioctl_data data; int rc; @@ -1442,6 +1408,9 @@ lwt_snapshot(int *ncpu, int *totalsize, lwt_event_t *events, int size) LASSERT (data.ioc_count != 0); LASSERT (data.ioc_misc != 0); + if (now != NULL) + *now = data.ioc_nid; + if (ncpu != NULL) *ncpu = data.ioc_count; @@ -1551,14 +1520,13 @@ get_cycles_per_usec () int jt_ptl_lwt(int argc, char **argv) { -#define MAX_CPUS 8 int ncpus; int totalspace; int nevents_per_cpu; lwt_event_t *events; - lwt_event_t *cpu_event[MAX_CPUS + 1]; - lwt_event_t *next_event[MAX_CPUS]; - lwt_event_t *first_event[MAX_CPUS]; + lwt_event_t *cpu_event[LWT_MAX_CPUS + 1]; + lwt_event_t *next_event[LWT_MAX_CPUS]; + lwt_event_t *first_event[LWT_MAX_CPUS]; int cpu; lwt_event_t *e; int rc; @@ -1566,6 +1534,9 @@ jt_ptl_lwt(int argc, char **argv) double mhz; cycles_t t0; cycles_t tlast; + cycles_t tnow; + struct timeval tvnow; + int printed_date = 0; FILE *f = stdout; if (argc < 2 || @@ -1593,11 +1564,12 @@ jt_ptl_lwt(int argc, char **argv) return (0); } - if (lwt_snapshot(&ncpus, &totalspace, NULL, 0) != 0) + if (lwt_snapshot(NULL, &ncpus, &totalspace, NULL, 0) != 0) return (-1); - if (ncpus > MAX_CPUS) { - fprintf(stderr, "Too many cpus: %d (%d)\n", ncpus, MAX_CPUS); + if (ncpus > LWT_MAX_CPUS) { + fprintf(stderr, "Too many cpus: %d (%d)\n", + ncpus, LWT_MAX_CPUS); return (-1); } @@ -1612,11 +1584,14 @@ jt_ptl_lwt(int argc, char **argv) return (-1); } - if (lwt_snapshot(NULL, NULL, events, totalspace)) { + if (lwt_snapshot(&tnow, NULL, NULL, events, totalspace)) { free(events); return (-1); } + /* we want this time to be sampled at snapshot time */ + gettimeofday(&tvnow, NULL); + if (argc > 2) { f = fopen (argv[2], "w"); if (f == NULL) { @@ -1697,6 +1672,17 @@ jt_ptl_lwt(int argc, char **argv) if (t0 <= next_event[cpu]->lwte_when) { /* on or after the first event */ + if (!printed_date) { + cycles_t du = (tnow - t0) / mhz; + time_t then = tvnow.tv_sec - du/1000000; + + if (du % 1000000 > tvnow.tv_usec) + then--; + + fprintf(f, "%s", ctime(&then)); + printed_date = 1; + } + rc = lwt_print(f, t0, tlast, mhz, cpu, next_event[cpu]); if (rc != 0) break; @@ -1718,5 +1704,48 @@ jt_ptl_lwt(int argc, char **argv) free(events); return (0); -#undef MAX_CPUS } + +int jt_ptl_memhog(int argc, char **argv) +{ + static int gfp = 0; /* sticky! */ + + struct portal_ioctl_data data; + int rc; + int count; + char *end; + + if (argc < 2) { + fprintf(stderr, "usage: %s []\n", argv[0]); + return 0; + } + + count = strtol(argv[1], &end, 0); + if (count < 0 || *end != 0) { + fprintf(stderr, "Can't parse page count '%s'\n", argv[1]); + return -1; + } + + if (argc >= 3) { + rc = strtol(argv[2], &end, 0); + if (*end != 0) { + fprintf(stderr, "Can't parse gfp flags '%s'\n", argv[2]); + return -1; + } + gfp = rc; + } + + PORTAL_IOC_INIT(data); + data.ioc_count = count; + data.ioc_flags = gfp; + rc = l_ioctl(PORTALS_DEV_ID, IOC_PORTAL_MEMHOG, &data); + + if (rc != 0) { + fprintf(stderr, "memhog %d failed: %s\n", count, strerror(errno)); + return -1; + } + + printf("memhog %d OK\n", count); + return 0; +} +