From fc18cde619a948ccb359a9adabfd1cc0874135e4 Mon Sep 17 00:00:00 2001 From: eeb Date: Tue, 4 Oct 2005 15:07:49 +0000 Subject: [PATCH] * Added lctl commands... which_nid NID [NID...] prints the closest NID list_nids [all] lists local NIDs (all to include lo) * Stopped 'lctl network' from printing local NIDs when passed 0 args; this arg overloading was a bit hackish anyway. --- lnet/include/libcfs/darwin/kp30.h | 2 +- lnet/include/libcfs/kp30.h | 57 +++++++-------- lnet/include/libcfs/linux/kp30.h | 2 +- lnet/include/lnet/lnetctl.h | 2 + lnet/lnet/api-ni.c | 8 +++ lnet/lnet/lib-move.c | 8 ++- lnet/utils/portals.c | 148 +++++++++++++++++++++++++++++++------- lnet/utils/ptlctl.c | 4 +- 8 files changed, 172 insertions(+), 59 deletions(-) diff --git a/lnet/include/libcfs/darwin/kp30.h b/lnet/include/libcfs/darwin/kp30.h index fbfccd2..7188a4a 100644 --- a/lnet/include/libcfs/darwin/kp30.h +++ b/lnet/include/libcfs/darwin/kp30.h @@ -84,7 +84,7 @@ typedef struct { /* -------------------------------------------------------------------------- */ -#define IOCTL_PORTAL_TYPE struct libcfs_ioctl_data +#define IOCTL_LIBCFS_TYPE struct libcfs_ioctl_data #define LPU64 "%llu" #define LPD64 "%lld" diff --git a/lnet/include/libcfs/kp30.h b/lnet/include/libcfs/kp30.h index 1c89acc..84ebc74 100644 --- a/lnet/include/libcfs/kp30.h +++ b/lnet/include/libcfs/kp30.h @@ -414,36 +414,37 @@ extern int libcfs_ioctl_getdata(char *buf, char *end, void *arg); #define IOC_LIBCFS_TYPE 'e' #define IOC_LIBCFS_MIN_NR 30 /* libcfs ioctls */ -#define IOC_LIBCFS_PANIC _IOWR('e', 30, IOCTL_PORTAL_TYPE) -#define IOC_LIBCFS_CLEAR_DEBUG _IOWR('e', 31, IOCTL_PORTAL_TYPE) -#define IOC_LIBCFS_MARK_DEBUG _IOWR('e', 32, IOCTL_PORTAL_TYPE) -#define IOC_LIBCFS_LWT_CONTROL _IOWR('e', 33, IOCTL_PORTAL_TYPE) -#define IOC_LIBCFS_LWT_SNAPSHOT _IOWR('e', 34, IOCTL_PORTAL_TYPE) -#define IOC_LIBCFS_LWT_LOOKUP_STRING _IOWR('e', 35, IOCTL_PORTAL_TYPE) -#define IOC_LIBCFS_MEMHOG _IOWR('e', 36, IOCTL_PORTAL_TYPE) -#define IOC_LIBCFS_PING _IOWR('e', 37, IOCTL_PORTAL_TYPE) +#define IOC_LIBCFS_PANIC _IOWR('e', 30, IOCTL_LIBCFS_TYPE) +#define IOC_LIBCFS_CLEAR_DEBUG _IOWR('e', 31, IOCTL_LIBCFS_TYPE) +#define IOC_LIBCFS_MARK_DEBUG _IOWR('e', 32, IOCTL_LIBCFS_TYPE) +#define IOC_LIBCFS_LWT_CONTROL _IOWR('e', 33, IOCTL_LIBCFS_TYPE) +#define IOC_LIBCFS_LWT_SNAPSHOT _IOWR('e', 34, IOCTL_LIBCFS_TYPE) +#define IOC_LIBCFS_LWT_LOOKUP_STRING _IOWR('e', 35, IOCTL_LIBCFS_TYPE) +#define IOC_LIBCFS_MEMHOG _IOWR('e', 36, IOCTL_LIBCFS_TYPE) +#define IOC_LIBCFS_PING _IOWR('e', 37, IOCTL_LIBCFS_TYPE) /* lnet ioctls */ -#define IOC_LIBCFS_GET_NI _IOWR('e', 50, IOCTL_PORTAL_TYPE) -#define IOC_LIBCFS_FAIL_NID _IOWR('e', 51, IOCTL_PORTAL_TYPE) -#define IOC_LIBCFS_ADD_ROUTE _IOWR('e', 52, IOCTL_PORTAL_TYPE) -#define IOC_LIBCFS_DEL_ROUTE _IOWR('e', 53, IOCTL_PORTAL_TYPE) -#define IOC_LIBCFS_GET_ROUTE _IOWR('e', 54, IOCTL_PORTAL_TYPE) -#define IOC_LIBCFS_NOTIFY_ROUTER _IOWR('e', 55, IOCTL_PORTAL_TYPE) -#define IOC_LIBCFS_UNCONFIGURE _IOWR('e', 56, IOCTL_PORTAL_TYPE) -#define IOC_LIBCFS_PORTALS_COMPATIBILITY _IOWR('e', 57, IOCTL_PORTAL_TYPE) +#define IOC_LIBCFS_GET_NI _IOWR('e', 50, IOCTL_LIBCFS_TYPE) +#define IOC_LIBCFS_FAIL_NID _IOWR('e', 51, IOCTL_LIBCFS_TYPE) +#define IOC_LIBCFS_ADD_ROUTE _IOWR('e', 52, IOCTL_LIBCFS_TYPE) +#define IOC_LIBCFS_DEL_ROUTE _IOWR('e', 53, IOCTL_LIBCFS_TYPE) +#define IOC_LIBCFS_GET_ROUTE _IOWR('e', 54, IOCTL_LIBCFS_TYPE) +#define IOC_LIBCFS_NOTIFY_ROUTER _IOWR('e', 55, IOCTL_LIBCFS_TYPE) +#define IOC_LIBCFS_UNCONFIGURE _IOWR('e', 56, IOCTL_LIBCFS_TYPE) +#define IOC_LIBCFS_PORTALS_COMPATIBILITY _IOWR('e', 57, IOCTL_LIBCFS_TYPE) +#define IOC_LIBCFS_LNET_DIST _IOWR('e', 58, IOCTL_LIBCFS_TYPE) /* lnd ioctls */ -#define IOC_LIBCFS_REGISTER_MYNID _IOWR('e', 70, IOCTL_PORTAL_TYPE) -#define IOC_LIBCFS_CLOSE_CONNECTION _IOWR('e', 71, IOCTL_PORTAL_TYPE) -#define IOC_LIBCFS_PUSH_CONNECTION _IOWR('e', 72, IOCTL_PORTAL_TYPE) -#define IOC_LIBCFS_GET_CONN _IOWR('e', 73, IOCTL_PORTAL_TYPE) -#define IOC_LIBCFS_DEL_PEER _IOWR('e', 74, IOCTL_PORTAL_TYPE) -#define IOC_LIBCFS_ADD_PEER _IOWR('e', 75, IOCTL_PORTAL_TYPE) -#define IOC_LIBCFS_GET_PEER _IOWR('e', 76, IOCTL_PORTAL_TYPE) -#define IOC_LIBCFS_GET_TXDESC _IOWR('e', 77, IOCTL_PORTAL_TYPE) -#define IOC_LIBCFS_ADD_INTERFACE _IOWR('e', 78, IOCTL_PORTAL_TYPE) -#define IOC_LIBCFS_DEL_INTERFACE _IOWR('e', 79, IOCTL_PORTAL_TYPE) -#define IOC_LIBCFS_GET_INTERFACE _IOWR('e', 80, IOCTL_PORTAL_TYPE) -#define IOC_LIBCFS_GET_GMID _IOWR('e', 81, IOCTL_PORTAL_TYPE) +#define IOC_LIBCFS_REGISTER_MYNID _IOWR('e', 70, IOCTL_LIBCFS_TYPE) +#define IOC_LIBCFS_CLOSE_CONNECTION _IOWR('e', 71, IOCTL_LIBCFS_TYPE) +#define IOC_LIBCFS_PUSH_CONNECTION _IOWR('e', 72, IOCTL_LIBCFS_TYPE) +#define IOC_LIBCFS_GET_CONN _IOWR('e', 73, IOCTL_LIBCFS_TYPE) +#define IOC_LIBCFS_DEL_PEER _IOWR('e', 74, IOCTL_LIBCFS_TYPE) +#define IOC_LIBCFS_ADD_PEER _IOWR('e', 75, IOCTL_LIBCFS_TYPE) +#define IOC_LIBCFS_GET_PEER _IOWR('e', 76, IOCTL_LIBCFS_TYPE) +#define IOC_LIBCFS_GET_TXDESC _IOWR('e', 77, IOCTL_LIBCFS_TYPE) +#define IOC_LIBCFS_ADD_INTERFACE _IOWR('e', 78, IOCTL_LIBCFS_TYPE) +#define IOC_LIBCFS_DEL_INTERFACE _IOWR('e', 79, IOCTL_LIBCFS_TYPE) +#define IOC_LIBCFS_GET_INTERFACE _IOWR('e', 80, IOCTL_LIBCFS_TYPE) +#define IOC_LIBCFS_GET_GMID _IOWR('e', 81, IOCTL_LIBCFS_TYPE) #define IOC_LIBCFS_MAX_NR 81 diff --git a/lnet/include/libcfs/linux/kp30.h b/lnet/include/libcfs/linux/kp30.h index 5f9d13a..60bc8d5 100644 --- a/lnet/include/libcfs/linux/kp30.h +++ b/lnet/include/libcfs/linux/kp30.h @@ -295,7 +295,7 @@ extern int lwt_snapshot (cycles_t *now, int *ncpu, int *total_size, /* ------------------------------------------------------------------ */ -#define IOCTL_PORTAL_TYPE long +#define IOCTL_LIBCFS_TYPE long #ifdef __CYGWIN__ # ifndef BITS_PER_LONG diff --git a/lnet/include/lnet/lnetctl.h b/lnet/include/lnet/lnetctl.h index 1df3cbc..8e36474 100644 --- a/lnet/include/lnet/lnetctl.h +++ b/lnet/include/lnet/lnetctl.h @@ -34,6 +34,8 @@ int ptl_initialize(int argc, char **argv); int jt_ptl_network(int argc, char **argv); +int jt_ptl_list_nids(int argc, char **argv); +int jt_ptl_which_nid(int argc, char **argv); int jt_ptl_print_interfaces(int argc, char **argv); int jt_ptl_add_interface(int argc, char **argv); int jt_ptl_del_interface(int argc, char **argv); diff --git a/lnet/lnet/api-ni.c b/lnet/lnet/api-ni.c index 026a679..7cf45e9 100644 --- a/lnet/lnet/api-ni.c +++ b/lnet/lnet/api-ni.c @@ -1261,6 +1261,14 @@ LNetCtl(unsigned int cmd, void *arg) case IOC_LIBCFS_PORTALS_COMPATIBILITY: return the_lnet.ln_ptlcompat; + case IOC_LIBCFS_LNET_DIST: + rc = LNetDist(data->ioc_nid, &data->ioc_nid, &data->ioc_u32[1]); + if (rc < 0 && rc != -EHOSTUNREACH) + return rc; + + data->ioc_u32[0] = rc; + return 0; + default: ni = lnet_net2ni(data->ioc_net); if (ni == NULL) diff --git a/lnet/lnet/lib-move.c b/lnet/lnet/lib-move.c index c7e54d9..0224d4a 100644 --- a/lnet/lnet/lib-move.c +++ b/lnet/lnet/lib-move.c @@ -2147,8 +2147,12 @@ LNetDist (lnet_nid_t dstnid, lnet_nid_t *srcnidp, int *orderp) LNET_NETTYP(LNET_NIDNET(ni->ni_nid)) != LOLND)) { if (srcnidp != NULL) *srcnidp = dstnid; - if (orderp != NULL) - *orderp = 0; + if (orderp != NULL) { + if (LNET_NETTYP(LNET_NIDNET(dstnid)) == LOLND) + *orderp = 0; + else + *orderp = 1; + } LNET_UNLOCK(); return 0; } diff --git a/lnet/utils/portals.c b/lnet/utils/portals.c index c1ecb3d..53e11f3 100644 --- a/lnet/utils/portals.c +++ b/lnet/utils/portals.c @@ -273,35 +273,36 @@ int jt_ptl_network(int argc, char **argv) { struct libcfs_ioctl_data data; __u32 net = LNET_NIDNET(LNET_NID_ANY); - int set = argc >= 2; int count; int rc; - if (set && - (!strcmp(argv[1], "unconfigure") || - !strcmp(argv[1], "down"))) { + if (argc < 2) { + fprintf(stderr, "usage: %s |down\n", argv[0]); + return 0; + } + + if (!strcmp(argv[1], "unconfigure") || + !strcmp(argv[1], "down")) { LIBCFS_IOC_INIT(data); rc = l_ioctl(LNET_DEV_ID, IOC_LIBCFS_UNCONFIGURE, &data); if (rc == 0) { - printf ("lnet ready to unload\n"); + printf ("LNET ready to unload\n"); return 0; } if (errno == EBUSY) - fprintf(stderr, "Portals still in use\n"); + fprintf(stderr, "LNET busy"); else - fprintf(stderr, "Unconfigure error %d: %s\n", + fprintf(stderr, "LNET unconfigure error %d: %s\n", errno, strerror(errno)); return -1; } - if (set) { - net = libcfs_str2net(argv[1]); - if (net == LNET_NIDNET(LNET_NID_ANY)) { - fprintf(stderr, "Can't parse net %s\n", argv[1]); - return -1; - } + net = libcfs_str2net(argv[1]); + if (net == LNET_NIDNET(LNET_NID_ANY)) { + fprintf(stderr, "Can't parse net %s\n", argv[1]); + return -1; } for (count = 0;; count++) { @@ -310,11 +311,6 @@ int jt_ptl_network(int argc, char **argv) rc = l_ioctl(LNET_DEV_ID, IOC_LIBCFS_GET_NI, &data); if (rc >= 0) { - if (!set) { - printf("%s\n", libcfs_nid2str(data.ioc_nid)); - continue; - } - if (net == LNET_NIDNET(data.ioc_nid)) { g_net_set = 1; g_net = net; @@ -330,23 +326,123 @@ int jt_ptl_network(int argc, char **argv) errno, strerror(errno)); return -1; } - - if (!set) { - if (count == 0) - printf("\n"); - return 0; - } if (count == 0) { fprintf(stderr,"No local networks\n"); return -1; } - fprintf(stderr,"%s not a local network (%s on its own to list them all)\n", - argv[1], argv[0]); + fprintf(stderr,"%s is not a local network\n", argv[1]); return -1; } +int +jt_ptl_list_nids(int argc, char **argv) +{ + struct libcfs_ioctl_data data; + int all = 0; + int count; + int rc; + + if (argc > 2 || + (argc == 2 && strcmp(argv[1], "all"))) { + fprintf(stderr, "usage: %s [all]\n", argv[0]); + return 0; + } + + all = argc == 2; + + for (count = 0;; count++) { + LIBCFS_IOC_INIT (data); + data.ioc_count = count; + rc = l_ioctl(LNET_DEV_ID, IOC_LIBCFS_GET_NI, &data); + + if (rc >= 0) { + if (all || + LNET_NETTYP(LNET_NIDNET(data.ioc_nid)) != LOLND) { + printf("%s\n", libcfs_nid2str(data.ioc_nid)); + } + continue; + } + + if (errno == ENOENT) + break; + + fprintf(stderr,"IOC_LIBCFS_GET_NI error %d: %s\n", + errno, strerror(errno)); + return -1; + } + + return 0; +} + +int +jt_ptl_which_nid (int argc, char **argv) +{ + struct libcfs_ioctl_data data; + int best_dist = 0; + int best_order = 0; + lnet_nid_t best_nid = LNET_NID_ANY; + int dist; + int order; + lnet_nid_t nid; + char *nidstr; + int rc; + int i; + + if (argc < 2) { + fprintf(stderr, "usage: %s NID [NID...]\n", argv[0]); + return 0; + } + + for (i = 1; i < argc; i++) { + nidstr = argv[i]; + nid = libcfs_str2nid(nidstr); + if (nid == LNET_NID_ANY) { + fprintf(stderr, "Can't parse NID %s\n", nidstr); + return -1; + } + + LIBCFS_IOC_INIT(data); + data.ioc_nid = nid; + + rc = l_ioctl(LNET_DEV_ID, IOC_LIBCFS_LNET_DIST, &data); + if (rc != 0) { + fprintf(stderr, "Can't get distance to %s: %s\n", + nidstr, strerror(errno)); + return -1; + } + + dist = data.ioc_u32[0]; + order = data.ioc_u32[1]; + + if (dist < 0) { + if (dist == -EHOSTUNREACH) + continue; + + fprintf(stderr, "Unexpected distance to %s: %d\n", + nidstr, dist); + return -1; + } + + if (best_nid == LNET_NID_ANY || + dist < best_dist || + (dist == best_dist && order < best_order)) { + best_dist = dist; + best_order = order; + best_nid = nid; + } + } + + if (best_nid == LNET_NID_ANY) { + fprintf(stderr, "No reachable NID\n"); + return -1; + } + + printf("%s\n", libcfs_nid2str(best_nid)); + return 0; +} + int jt_ptl_print_interfaces (int argc, char **argv) { diff --git a/lnet/utils/ptlctl.c b/lnet/utils/ptlctl.c index 2dc3859..ba1ccd6 100644 --- a/lnet/utils/ptlctl.c +++ b/lnet/utils/ptlctl.c @@ -29,7 +29,9 @@ command_t list[] = { - {"network", jt_ptl_network, 0,"setup the NAL (args: nal name)"}, + {"network", jt_ptl_network, 0,"select a network (args: LND name)"}, + {"list_nids", jt_ptl_list_nids, 0,"list local NIDs"}, + {"which_nid", jt_ptl_which_nid, 0,"select the closest NID"}, {"print_interfaces", jt_ptl_print_interfaces, 0, "print interface entries (no args)"}, {"add_interface", jt_ptl_add_interface, 0, "add interface entry (args: ip [netmask])"}, {"del_interface", jt_ptl_del_interface, 0, "delete interface entries (args: [ip])"}, -- 1.8.3.1