Whamcloud - gitweb
i=liang,b=15332:
authorisaac <isaac>
Wed, 11 Nov 2009 18:28:52 +0000 (18:28 +0000)
committerisaac <isaac>
Wed, 11 Nov 2009 18:28:52 +0000 (18:28 +0000)
- LNet router shuffler.

lnet/ChangeLog
lnet/lnet/router.c
lnet/lnet/router_proc.c

index 978f9ef..7fd91a5 100644 (file)
@@ -14,6 +14,10 @@ tbd  Sun Microsystems, Inc.
 
 Severity   : enhancement
 Bugzilla   : 15332
+Description: LNet router shuffler.
+
+Severity   : enhancement
+Bugzilla   : 15332
 Description: LNet fine grain routing support.
 
 Severity   : normal
index a494d82..369a80b 100644 (file)
@@ -235,6 +235,34 @@ lnet_find_net_locked (__u32 net)
         return NULL;
 }
 
+/* NB expects LNET_LOCK held */
+void
+lnet_add_route_to_rnet (lnet_remotenet_t *rnet, lnet_route_t *route)
+{
+        unsigned int      len = 0;
+        unsigned int      offset = 0;
+        struct list_head *e;
+        extern __u64 lnet_create_interface_cookie(void);
+
+        list_for_each (e, &rnet->lrn_routes) {
+                len++;
+        }
+
+        /* FIXME use Lustre random function when it's moved to libcfs.
+         * See bug 18751 */
+        /* len+1 positions to add a new entry, also prevents division by 0 */
+        offset = lnet_create_interface_cookie() % (len + 1);
+        list_for_each (e, &rnet->lrn_routes) {
+                if (offset == 0)
+                        break;
+                offset--;
+        }
+        list_add(&route->lr_list, e);
+
+        the_lnet.ln_remote_nets_version++;
+        lnet_rtr_addref_locked(route->lr_gateway);
+}
+
 int
 lnet_add_route (__u32 net, unsigned int hops, lnet_nid_t gateway)
 {
@@ -321,11 +349,7 @@ lnet_add_route (__u32 net, unsigned int hops, lnet_nid_t gateway)
                 ni = route->lr_gateway->lp_ni;
                 lnet_ni_addref_locked(ni);
 
-                list_add_tail(&route->lr_list, &rnet2->lrn_routes);
-                the_lnet.ln_remote_nets_version++;
-
-                lnet_rtr_addref_locked(route->lr_gateway);
-
+                lnet_add_route_to_rnet(rnet2, route);
                 LNET_UNLOCK();
 
                 /* XXX Assume alive */
index fce91c2..b38c5e7 100644 (file)
@@ -168,9 +168,9 @@ int LL_PROC_PROTO(proc_lnet_routes)
                                 if (skip == 0) {
                                         route = re;
                                         break;
-                                } else
-                                        skip--;
+                                }
 
+                                skip--;
                                 r = r->next;
                         }
 
@@ -264,10 +264,10 @@ int LL_PROC_PROTO(proc_lnet_routers)
 
                         if (skip == 0) {
                                 peer = lp;
-                                        break;
-                                } else
-                                        skip--;
+                                break;
+                        }
 
+                        skip--;
                         r = r->next;
                 }
 
@@ -411,13 +411,14 @@ int LL_PROC_PROTO(proc_lnet_peers)
                                             &the_lnet.ln_peer_hash[idx]) {
                                                 num = 1;
                                                 idx++;
-                                        } else
+                                        } else {
                                                 num++;
+                                        }
 
                                         break;
-                                } else
-                                        skip--;
+                                }
 
+                                skip--;
                                 p = lp->lp_hashlist.next;
                         }
 
@@ -572,9 +573,9 @@ int LL_PROC_PROTO(proc_lnet_nis)
                         if (skip == 0) {
                                 ni = a_ni;
                                 break;
-                        } else
-                                skip--;
+                        }
 
+                        skip--;
                         n = n->next;
                 }