X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lnet%2Futils%2Fgmlndnid.c;h=ce5cb14ede7ea989ae909b22b9d78cfe41b616d7;hp=ff6631ce998cce7949ff2764fbde264efebf4ade;hb=6f9526798b250a13885ab49e3a3827019afbda05;hpb=090c677210ee2946d99c71412e4ff762bb300f4f diff --git a/lnet/utils/gmlndnid.c b/lnet/utils/gmlndnid.c index ff6631c..ce5cb14 100644 --- a/lnet/utils/gmlndnid.c +++ b/lnet/utils/gmlndnid.c @@ -29,91 +29,156 @@ #include #include #include -#include #include - #include -#include -#include -#include +#include +#include -#define GMNAL_IOC_GET_GNID 1 +#include -int -roundup(int len) +/* + * portals always uses unit 0 + * Can this be configurable? + */ +#define GM_UNIT 0 + +void +usage(char *prg, int h) +{ + fprintf(stderr, + "usage %s -h\n" + " %s [-l] [-n hostname] [-L] [hostnames]\n", prg); + + if (h) + printf("Print Myrinet Global network ids for specified hosts\n" + "-l print local host's ID\n" + "-n hostname print given host's ID\n" + "-L print Myringet local net ID too\n" + "[hostnames] print ids of given hosts (local if none)\n"); +} + +gm_status_t +print_gmid(char *name, int name_fieldlen, int show_local_id) { - return((len+7) & (~0x7)); + struct gm_port *gm_port; + int gm_port_id; + gm_status_t gm_status; + unsigned int local_id; + unsigned int global_id; + + gm_status = gm_init(); + if (gm_status != GM_SUCCESS) { + fprintf(stderr, "gm_init: %s\n", gm_strerror(gm_status)); + return gm_status; + } + + gm_port_id = 2; + gm_status = gm_open(&gm_port, GM_UNIT, gm_port_id, "gmnalnid", + GM_API_VERSION); + if (gm_status != GM_SUCCESS) { + int num_ports = gm_num_ports(gm_port); + + /* Couldn't open port 2, try 4 ... num_ports */ + for (gm_port_id = 4; gm_port_id < num_ports; gm_port_id++) { + gm_status = gm_open(&gm_port, GM_UNIT, gm_port_id, + "gmnalnid", GM_API_VERSION); + if (gm_status == GM_SUCCESS) + break; + } + + if (gm_status != GM_SUCCESS) { + fprintf(stderr, "gm_open: %s\n",gm_strerror(gm_status)); + goto out_0; + } + } + + if (name == NULL) { + local_id = 1; + name = ""; + } else { + gm_status = gm_host_name_to_node_id_ex(gm_port, 1000000, name, + &local_id); + if (gm_status != GM_SUCCESS) { + fprintf(stderr, "gm_host_name_to_node_id_ex(%s): %s\n", + name, gm_strerror(gm_status)); + goto out_1; + } + } + + gm_status = gm_node_id_to_global_id(gm_port, local_id, &global_id) ; + if (gm_status != GM_SUCCESS) { + fprintf(stderr, "gm_node_id_to_global_id(%s:%d): %s\n", + name, local_id, gm_strerror(gm_status)); + goto out_1; + } + + if (name_fieldlen > 0) + printf ("%*s ", name_fieldlen, name); + + if (!show_local_id) + printf("0x%x\n", global_id); + else + printf("local 0x%x global 0x%x\n", local_id, global_id); + + out_1: + gm_close(gm_port); + out_0: + gm_finalize(); + + return gm_status; } -int main(int argc, char **argv) +int +main (int argc, char **argv) { - int rc, pfd; - struct portal_ioctl_data data; - struct portals_cfg pcfg; - unsigned int nid = 0, len; - char *name = NULL; - int c; - - - - while ((c = getopt(argc, argv, "n:l")) != -1) { - switch(c) { - case('n'): - name = optarg; - break; - case('l'): - printf("Get local id not implemented yet!\n"); - exit(-1); - default: - printf("usage %s -n nodename [-p]\n", argv[0]); - } - } - - if (!name) { - printf("usage %s -n nodename [-p]\n", argv[0]); - exit(-1); - } - - - - - PCFG_INIT(pcfg, GMNAL_IOC_GET_GNID); - pcfg.pcfg_nal = GMNAL; - - /* - * set up the inputs - */ - len = strlen(name) + 1; - pcfg.pcfg_pbuf1 = malloc(len); - strcpy(pcfg.pcfg_pbuf1, name); - pcfg.pcfg_plen1 = len; - - /* - * set up the outputs - */ - pcfg.pcfg_pbuf2 = (void*)&nid; - pcfg.pcfg_plen2 = sizeof(unsigned int*); - - pfd = open("/dev/portals", O_RDWR); - if ( pfd < 0 ) { - perror("opening portals device"); - free(pcfg.pcfg_pbuf1); - exit(-1); + int c; + gm_status_t gmrc; + int rc; + int max_namelen = 0; + int show_local_id = 0; + + while ((c = getopt(argc, argv, "n:lLh")) != -1) + switch(c) { + case 'h': + usage(argv[0], 1); + return 0; + + case 'L': + show_local_id = 1; + break; + + case 'n': + gmrc = print_gmid(optarg, 0, show_local_id); + return (gmrc == GM_SUCCESS) ? 0 : 1; + + case 'l': + gmrc = print_gmid(NULL, 0, show_local_id); + return (gmrc == GM_SUCCESS) ? 0 : 1; + + default: + usage(argv[0], 0); + return 2; + } + + if (optind == argc) { + gmrc = print_gmid(NULL, 0, show_local_id); + return (gmrc == GM_SUCCESS) ? 0 : 1; } - PORTAL_IOC_INIT(data); - data.ioc_pbuf1 = (char*)&pcfg; - data.ioc_plen1 = sizeof(pcfg); - - rc = ioctl (pfd, IOC_PORTAL_NAL_CMD, &data); - if (rc < 0) - { - perror ("Can't get my NID"); + if (optind != argc - 1) + for (c = optind; c < argc; c++) + if (strlen(argv[c]) > max_namelen) + max_namelen = strlen(argv[c]); + + rc = 0; + + for (c = optind; c < argc; c++) { + gmrc = print_gmid(argv[c], max_namelen, show_local_id); + + if (gmrc != GM_SUCCESS) + rc = 1; } - - free(pcfg.pcfg_pbuf1); - close(pfd); - printf("%u\n", nid); - exit(0); + + return rc; }