Whamcloud - gitweb
landing b_cmobd_merge on HEAD
[fs/lustre-release.git] / lnet / utils / portals.c
index fb031ae..f8107d8 100644 (file)
@@ -34,7 +34,7 @@
 #include <unistd.h>
 #include <time.h>
 #include <stdarg.h>
-#include <asm/byteorder.h>
+#include <endian.h>
 
 #ifdef __CYGWIN__
 
@@ -61,7 +61,7 @@
 unsigned int portal_debug;
 unsigned int portal_printk;
 unsigned int portal_stack;
-unsigned int portal_cerror;
+unsigned int portal_cerror = 1;
 
 static unsigned int g_nal = 0;
 
@@ -81,12 +81,73 @@ static name2num_t nalnames[] = {
         {"elan",       QSWNAL},
         {"gm",         GMNAL},
         {"ib",         IBNAL},
-        {"scimac",      SCIMACNAL},
         {NULL,         -1}
 };
 
 static cfg_record_cb_t g_record_cb;
 
+/* Convert a string boolean to an int; "enable" -> 1 */
+int ptl_parse_bool (int *b, char *str) {
+        if (!strcasecmp (str, "no") ||
+            !strcasecmp (str, "n") ||
+            !strcasecmp (str, "off") ||
+            !strcasecmp (str, "down") ||
+            !strcasecmp (str, "disable"))
+        {
+                *b = 0;
+                return (0);
+        }
+        
+        if (!strcasecmp (str, "yes") ||
+            !strcasecmp (str, "y") ||
+            !strcasecmp (str, "on") ||
+            !strcasecmp (str, "up") ||
+            !strcasecmp (str, "enable"))
+        {
+                *b = 1;
+                return (0);
+        }
+        
+        return (-1);
+}
+
+/* Convert human readable size string to and int; "1k" -> 1000 */
+int ptl_parse_size (int *sizep, char *str) {
+        int size;
+        char mod[32];
+
+        switch (sscanf (str, "%d%1[gGmMkK]", &size, mod)) {
+        default:
+                return (-1);
+
+        case 1:
+                *sizep = size;
+                return (0);
+
+        case 2:
+                switch (*mod) {
+                case 'g':
+                case 'G':
+                        *sizep = size << 30;
+                        return (0);
+
+                case 'm':
+                case 'M':
+                        *sizep = size << 20;
+                        return (0);
+
+                case 'k':
+                case 'K':
+                        *sizep = size << 10;
+                        return (0);
+
+                default:
+                        *sizep = size;
+                        return (0);
+                }
+        }
+}
+
 int 
 ptl_set_cfg_record_cb(cfg_record_cb_t cb)
 {
@@ -303,16 +364,40 @@ ptl_parse_nid (ptl_nid_t *nidp, char *str)
         return (-1);
 }
 
+__u64 ptl_nid2u64(ptl_nid_t nid)
+{
+        switch (sizeof (nid)) {
+        case 8:
+                return (nid);
+        case 4:
+                return ((__u32)nid);
+        default:
+                fprintf(stderr, "Unexpected sizeof(ptl_nid_t) == %u\n", sizeof(nid));
+                abort();
+                /* notreached */
+                return (-1);
+        }
+}
+
 char *
 ptl_nid2str (char *buffer, ptl_nid_t nid)
 {
-        __u32           addr = htonl((__u32)nid); /* back to NETWORK byte order */
-        struct hostent *he = gethostbyaddr ((const char *)&addr, sizeof (addr), AF_INET);
+        __u64           nid64 = ptl_nid2u64(nid);
+        struct hostent *he;
+
+        if ((nid64 & ~((__u64)((__u32)-1))) != 0) {
+                /* top bits set */
+                he = NULL;
+        } else {
+                __u32 addr = htonl((__u32)nid); /* back to NETWORK byte order */
+
+                he = gethostbyaddr ((const char *)&addr, sizeof (addr), AF_INET);
+        }
 
         if (he != NULL)
                 strcpy (buffer, he->h_name);
         else
-                sprintf (buffer, LPX64, nid);
+                sprintf (buffer, LPX64, nid64);
         
         return (buffer);
 }
@@ -1008,7 +1093,7 @@ int jt_ptl_mynid(int argc, char **argv)
         char *nidstr;
         struct portals_cfg pcfg;
         ptl_nid_t mynid;
-        
+
         if (argc > 2) {
                 fprintf(stderr, "usage: %s [NID]\n", argv[0]);
                 fprintf(stderr, "NID defaults to the primary IP address of the machine.\n");
@@ -1042,7 +1127,8 @@ int jt_ptl_mynid(int argc, char **argv)
                 fprintf(stderr, "setting my NID failed: %s\n",
                        strerror(errno));
         else
-                printf("registered my nid "LPX64" (%s)\n", mynid, hostname);
+                printf("registered my nid "LPX64" (%s)\n", 
+                       ptl_nid2u64(mynid), hostname);
         return 0;
 }
 
@@ -1100,7 +1186,7 @@ jt_ptl_rxmem (int argc, char **argv)
         
         if (argc > 1)
         {
-                if (Parser_size (&size, argv[1]) != 0 || size < 0)
+                if (ptl_parse_size (&size, argv[1]) != 0 || size < 0)
                 {
                         fprintf (stderr, "Can't parse size %s\n", argv[1]);
                         return (0);
@@ -1119,7 +1205,7 @@ jt_ptl_txmem (int argc, char **argv)
         
         if (argc > 1)
         {
-                if (Parser_size (&size, argv[1]) != 0 || size < 0)
+                if (ptl_parse_size (&size, argv[1]) != 0 || size < 0)
                 {
                         fprintf (stderr, "Can't parse size %s\n", argv[1]);
                         return (0);
@@ -1137,7 +1223,7 @@ jt_ptl_nagle (int argc, char **argv)
 
         if (argc > 1)
         {
-                if (Parser_bool (&enable, argv[1]) != 0)
+                if (ptl_parse_bool (&enable, argv[1]) != 0)
                 {
                         fprintf (stderr, "Can't parse boolean %s\n", argv[1]);
                         return (-1);
@@ -1260,7 +1346,8 @@ jt_ptl_del_route (int argc, char **argv)
         rc = pcfg_ioctl(&pcfg);
         if (rc != 0) 
         {
-                fprintf (stderr, "NAL_CMD_DEL_ROUTE ("LPX64") failed: %s\n", nid, strerror (errno));
+                fprintf (stderr, "NAL_CMD_DEL_ROUTE ("LPX64") failed: %s\n", 
+                         ptl_nid2u64(nid), strerror (errno));
                 return (-1);
         }
         
@@ -1290,7 +1377,7 @@ jt_ptl_notify_router (int argc, char **argv)
                 return (-1);
         }
 
-        if (Parser_bool (&enable, argv[2]) != 0) {
+        if (ptl_parse_bool (&enable, argv[2]) != 0) {
                 fprintf (stderr, "Can't parse boolean %s\n", argv[2]);
                 return (-1);
         }
@@ -1322,7 +1409,7 @@ jt_ptl_notify_router (int argc, char **argv)
         if (rc != 0) 
         {
                 fprintf (stderr, "NAL_CMD_NOTIFY_ROUTER ("LPX64") failed: %s\n",
-                         nid, strerror (errno));
+                         ptl_nid2u64(nid), strerror (errno));
                 return (-1);
         }
         
@@ -1478,14 +1565,11 @@ lwt_put_string(char *ustr)
 static int
 lwt_print(FILE *f, cycles_t t0, cycles_t tlast, double mhz, int cpu, lwt_event_t *e)
 {
-        char            whenstr[32];
         char           *where = lwt_get_string(e->lwte_where);
 
         if (where == NULL)
                 return (-1);
 
-        sprintf(whenstr, LPD64, e->lwte_when - t0);
-
         fprintf(f, "%#010lx %#010lx %#010lx %#010lx: %#010lx %1d %10.6f %10.2f %s\n",
                 e->lwte_p1, e->lwte_p2, e->lwte_p3, e->lwte_p4,
                 (long)e->lwte_task, cpu, (e->lwte_when - t0) / (mhz * 1000000.0),
@@ -1537,6 +1621,7 @@ jt_ptl_lwt(int argc, char **argv)
         cycles_t        tnow;
         struct timeval  tvnow;
         int             printed_date = 0;
+        int             nlines = 0;
         FILE           *f = stdout;
 
         if (argc < 2 ||
@@ -1686,6 +1771,12 @@ jt_ptl_lwt(int argc, char **argv)
                         rc = lwt_print(f, t0, tlast, mhz, cpu, next_event[cpu]);
                         if (rc != 0)
                                 break;
+
+                        if (++nlines % 10000 == 0 && f != stdout) {
+                                /* show some activity... */
+                                printf(".");
+                                fflush (stdout);
+                        }
                 }
 
                 tlast = next_event[cpu]->lwte_when;
@@ -1699,8 +1790,10 @@ jt_ptl_lwt(int argc, char **argv)
                         next_event[cpu] = NULL;
         }
 
-        if (f != stdout)
+        if (f != stdout) {
+                printf("\n");
                 fclose(f);
+        }
 
         free(events);
         return (0);