Whamcloud - gitweb
LU-1617 build: skip generated files in .gitignore
[fs/lustre-release.git] / lnet / lnet / router_proc.c
index a91d82b..6bf4773 100644 (file)
@@ -41,6 +41,7 @@ enum {
         PSDEV_LNET_PEERS,
         PSDEV_LNET_BUFFERS,
         PSDEV_LNET_NIS,
+       PSDEV_LNET_PTL_ROTOR,
 };
 #else
 #define CTL_LNET           CTL_UNNUMBERED
@@ -50,13 +51,14 @@ enum {
 #define PSDEV_LNET_PEERS   CTL_UNNUMBERED
 #define PSDEV_LNET_BUFFERS CTL_UNNUMBERED
 #define PSDEV_LNET_NIS     CTL_UNNUMBERED
+#define PSDEV_LNET_PTL_ROTOR   CTL_UNNUMBERED
 #endif
 
 #define LNET_LOFFT_BITS                (sizeof(loff_t) * 8)
 /*
  * NB: max allowed LNET_CPT_BITS is 8 on 64-bit system and 2 on 32-bit system
  */
-#define LNET_PROC_CPT_BITS     LNET_CPT_BITS
+#define LNET_PROC_CPT_BITS     (LNET_CPT_BITS + 1)
 /* change version, 16 bits or 8 bits */
 #define LNET_PROC_VER_BITS     MAX(((MIN(LNET_LOFFT_BITS, 64)) / 4), 8)
 
@@ -348,7 +350,8 @@ int LL_PROC_PROTO(proc_lnet_routers)
                        int down_ni   = 0;
                        lnet_route_t *rtr;
 
-                       if (peer->lp_ping_version == LNET_PROTO_PING_VERSION) {
+                       if ((peer->lp_ping_feats &
+                            LNET_PING_FEAT_NI_STATUS) != 0) {
                                cfs_list_for_each_entry(rtr, &peer->lp_routes,
                                                        lr_gwlist) {
                                        /* downis on any route should be the
@@ -410,8 +413,8 @@ int LL_PROC_PROTO(proc_lnet_peers)
        char                    *s;
        int                     cpt  = LNET_PROC_CPT_GET(*ppos);
        int                     ver  = LNET_PROC_VER_GET(*ppos);
-       int                     hoff = LNET_PROC_HOFF_GET(*ppos);
        int                     hash = LNET_PROC_HASH_GET(*ppos);
+       int                     hoff = LNET_PROC_HOFF_GET(*ppos);
        int                     rc = 0;
        int                     len;
 
@@ -421,8 +424,10 @@ int LL_PROC_PROTO(proc_lnet_peers)
        if (*lenp == 0)
                return 0;
 
-       if (cpt >= LNET_CPT_NUMBER)
+       if (cpt >= LNET_CPT_NUMBER) {
+               *lenp = 0;
                return 0;
+       }
 
         LIBCFS_ALLOC(tmpstr, tmpsiz);
         if (tmpstr == NULL)
@@ -439,11 +444,14 @@ int LL_PROC_PROTO(proc_lnet_peers)
 
                hoff++;
        } else {
-               struct lnet_peer        *peer   = NULL;
-               cfs_list_t              *p      = NULL;
-               int                     skip    = hoff - 1;
-
+               struct lnet_peer        *peer;
+               cfs_list_t              *p;
+               int                     skip;
  again:
+               p = NULL;
+               peer = NULL;
+               skip = hoff - 1;
+
                lnet_net_lock(cpt);
                ptable = the_lnet.ln_peer_tables[cpt];
                if (hoff == 1)
@@ -533,14 +541,14 @@ int LL_PROC_PROTO(proc_lnet_peers)
 
                } else { /* peer is NULL */
                        lnet_net_unlock(cpt);
+               }
 
-                       if (hash == LNET_PEER_HASH_SIZE &&
-                           cpt < LNET_CPT_NUMBER - 1) {
-                               cpt++;
-                               hash = 0;
-                               hoff = 1;
+               if (hash == LNET_PEER_HASH_SIZE) {
+                       cpt++;
+                       hash = 0;
+                       hoff = 1;
+                       if (peer == NULL && cpt < LNET_CPT_NUMBER)
                                goto again;
-                       }
                }
         }
 
@@ -743,6 +751,107 @@ int LL_PROC_PROTO(proc_lnet_nis)
         return rc;
 }
 
+struct lnet_portal_rotors {
+       int             pr_value;
+       const char      *pr_name;
+       const char      *pr_desc;
+};
+
+static struct lnet_portal_rotors       portal_rotors[] = {
+       {
+               .pr_value = LNET_PTL_ROTOR_OFF,
+               .pr_name  = "OFF",
+               .pr_desc  = "Turn off message rotor for wildcard portals"
+       },
+       {
+               .pr_value = LNET_PTL_ROTOR_ON,
+               .pr_name  = "ON",
+               .pr_desc  = "round-robin dispatch all PUT messages for "
+                           "wildcard portals"
+       },
+       {
+               .pr_value = LNET_PTL_ROTOR_RR_RT,
+               .pr_name  = "RR_RT",
+               .pr_desc  = "round-robin dispatch routed PUT message for "
+                           "wildcard portals"
+       },
+       {
+               .pr_value = LNET_PTL_ROTOR_HASH_RT,
+               .pr_name  = "HASH_RT",
+               .pr_desc  = "dispatch routed PUT message by hashing source "
+                           "NID for wildcard portals"
+       },
+       {
+               .pr_value = -1,
+               .pr_name  = NULL,
+               .pr_desc  = NULL
+       },
+};
+
+extern int portal_rotor;
+
+static int __proc_lnet_portal_rotor(void *data, int write,
+                                   loff_t pos, void *buffer, int nob)
+{
+       const int       buf_len = 128;
+       char            *buf;
+       char            *tmp;
+       int             rc;
+       int             i;
+
+       LIBCFS_ALLOC(buf, buf_len);
+       if (buf == NULL)
+               return -ENOMEM;
+
+       if (!write) {
+               lnet_res_lock(0);
+
+               for (i = 0; portal_rotors[i].pr_value >= 0; i++) {
+                       if (portal_rotors[i].pr_value == portal_rotor)
+                               break;
+               }
+
+               LASSERT(portal_rotors[i].pr_value == portal_rotor);
+               lnet_res_unlock(0);
+
+               rc = snprintf(buf, buf_len,
+                             "{\n\tportals: all\n"
+                             "\trotor: %s\n\tdescription: %s\n}",
+                             portal_rotors[i].pr_name,
+                             portal_rotors[i].pr_desc);
+
+               if (pos >= min_t(int, rc, buf_len)) {
+                       rc = 0;
+               } else {
+                       rc = cfs_trace_copyout_string(buffer, nob,
+                                       buf + pos, "\n");
+               }
+               goto out;
+       }
+
+       rc = cfs_trace_copyin_string(buf, buf_len, buffer, nob);
+       if (rc < 0)
+               goto out;
+
+       tmp = cfs_trimwhite(buf);
+
+       rc = -EINVAL;
+       lnet_res_lock(0);
+       for (i = 0; portal_rotors[i].pr_name != NULL; i++) {
+               if (cfs_strncasecmp(portal_rotors[i].pr_name, tmp,
+                                   strlen(portal_rotors[i].pr_name)) == 0) {
+                       portal_rotor = portal_rotors[i].pr_value;
+                       rc = 0;
+                       break;
+               }
+       }
+       lnet_res_unlock(0);
+out:
+       LIBCFS_FREE(buf, buf_len);
+       return rc;
+}
+DECLARE_PROC_HANDLER(proc_lnet_portal_rotor);
+
 static cfs_sysctl_table_t lnet_table[] = {
         /*
          * NB No .strategy entries have been provided since sysctl(8) prefers
@@ -785,8 +894,14 @@ static cfs_sysctl_table_t lnet_table[] = {
                 .proc_handler = &proc_lnet_nis,
         },
         {
-                INIT_CTL_NAME(0)
-        }
+               INIT_CTL_NAME(PSDEV_LNET_PTL_ROTOR)
+               .procname = "portal_rotor",
+               .mode     = 0644,
+               .proc_handler = &proc_lnet_portal_rotor,
+       },
+       {
+               INIT_CTL_NAME(0)
+       }
 };
 
 static cfs_sysctl_table_t top_table[] = {