Whamcloud - gitweb
LU-7845 lnet: check if address is visible 82/18782/14
authorSebastien Buisson <sbuisson@ddn.com>
Tue, 2 Feb 2016 17:06:39 +0000 (18:06 +0100)
committerOleg Drokin <oleg.drokin@intel.com>
Mon, 11 Jul 2016 23:54:28 +0000 (23:54 +0000)
In LNetDist(), check if ni's address is currently visible.
If not visible, assign order above 0xffff0000, to make this
ni not a priority.

Signed-off-by: Sebastien Buisson <sbuisson@ddn.com>
Change-Id: I56735aa25ba632020858507939e12c4565c33d49
Reviewed-on: http://review.whamcloud.com/18782
Tested-by: Jenkins
Reviewed-by: Doug Oucharek <doug.s.oucharek@intel.com>
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Li Xi <lixi@ddn.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
lnet/lnet/lib-move.c

index cd7c0e9..0eade04 100644 (file)
@@ -2497,11 +2497,36 @@ LNetDist(lnet_nid_t dstnid, lnet_nid_t *srcnidp, __u32 *orderp)
                         return local_nid_dist_zero ? 0 : 1;
                 }
 
-                if (LNET_NIDNET(ni->ni_nid) == dstnet) {
-                        if (srcnidp != NULL)
-                                *srcnidp = ni->ni_nid;
-                        if (orderp != NULL)
-                                *orderp = order;
+               if (LNET_NIDNET(ni->ni_nid) == dstnet) {
+                       if (ni->ni_interfaces[0] != NULL) {
+                               /* Check if ni's address is the one visible in
+                                * current namespace.
+                                * If not, assign order above 0xffff0000,
+                                * to make this ni not a priority. */
+                               int i, up, rc;
+                               __u32 mask, addr;
+                               char *name;
+                               for (i = 0; i < ARRAY_SIZE(ni->ni_interfaces);
+                                    i++) {
+                                       if (ni->ni_interfaces[i] == NULL)
+                                               continue;
+                                       name = ni->ni_interfaces[i];
+                                       rc = lnet_ipif_query(name, &up, &addr,
+                                                            &mask);
+                                       if ((rc != 0) || (rc == 0 &&
+                                            (!up ||
+                                             LNET_NIDADDR(ni->ni_nid) !=
+                                             addr))) {
+                                               order += 0xffff0000;
+                                               break;
+                                       }
+                               }
+                       }
+
+                       if (srcnidp != NULL)
+                               *srcnidp = ni->ni_nid;
+                       if (orderp != NULL)
+                               *orderp = order;
                        lnet_net_unlock(cpt);
                        return 1;
                }