net/smc: introduce smc_pnet_find_alt_roce()
authorKarsten Graul <kgraul@linux.ibm.com>
Fri, 1 May 2020 10:48:11 +0000 (12:48 +0200)
committerDavid S. Miller <davem@davemloft.net>
Fri, 1 May 2020 23:20:05 +0000 (16:20 -0700)
Introduce a new function in smc_pnet.c that searches for an alternate
IB device, using an existing link group and a primary IB device. The
alternate IB device needs to be active and must have the same PNETID
as the link group.

Signed-off-by: Karsten Graul <kgraul@linux.ibm.com>
Reviewed-by: Ursula Braun <ubraun@linux.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/smc/smc_pnet.c
net/smc/smc_pnet.h

index bd01c71b827afc4a2d666ca0036d8d23d903ce3d..50c96e843fab5fa7e03d63f5d4eceac5368af4f9 100644 (file)
@@ -777,7 +777,8 @@ static int smc_pnet_find_ndev_pnetid_by_table(struct net_device *ndev,
 
 /* find a roce device for the given pnetid */
 static void _smc_pnet_find_roce_by_pnetid(u8 *pnet_id,
-                                         struct smc_init_info *ini)
+                                         struct smc_init_info *ini,
+                                         struct smc_ib_device *known_dev)
 {
        struct smc_ib_device *ibdev;
        int i;
@@ -785,6 +786,8 @@ static void _smc_pnet_find_roce_by_pnetid(u8 *pnet_id,
        ini->ib_dev = NULL;
        spin_lock(&smc_ib_devices.lock);
        list_for_each_entry(ibdev, &smc_ib_devices.list, list) {
+               if (ibdev == known_dev)
+                       continue;
                for (i = 1; i <= SMC_MAX_PORTS; i++) {
                        if (!rdma_is_port_valid(ibdev->ibdev, i))
                                continue;
@@ -803,6 +806,14 @@ out:
        spin_unlock(&smc_ib_devices.lock);
 }
 
+/* find alternate roce device with same pnet_id and vlan_id */
+void smc_pnet_find_alt_roce(struct smc_link_group *lgr,
+                           struct smc_init_info *ini,
+                           struct smc_ib_device *known_dev)
+{
+       _smc_pnet_find_roce_by_pnetid(lgr->pnet_id, ini, known_dev);
+}
+
 /* if handshake network device belongs to a roce device, return its
  * IB device and port
  */
@@ -857,7 +868,7 @@ static void smc_pnet_find_roce_by_pnetid(struct net_device *ndev,
                smc_pnet_find_rdma_dev(ndev, ini);
                return; /* pnetid could not be determined */
        }
-       _smc_pnet_find_roce_by_pnetid(ndev_pnetid, ini);
+       _smc_pnet_find_roce_by_pnetid(ndev_pnetid, ini, NULL);
 }
 
 static void smc_pnet_find_ism_by_pnetid(struct net_device *ndev,
index ea207f8fc6f70c8d5258d2ac4787944437d2dfa8..811a659866918721c750ef753a0473f090c3df6b 100644 (file)
@@ -19,6 +19,7 @@
 struct smc_ib_device;
 struct smcd_dev;
 struct smc_init_info;
+struct smc_link_group;
 
 /**
  * struct smc_pnettable - SMC PNET table anchor
@@ -48,5 +49,7 @@ void smc_pnet_find_roce_resource(struct sock *sk, struct smc_init_info *ini);
 void smc_pnet_find_ism_resource(struct sock *sk, struct smc_init_info *ini);
 int smc_pnetid_by_table_ib(struct smc_ib_device *smcibdev, u8 ib_port);
 int smc_pnetid_by_table_smcd(struct smcd_dev *smcd);
-
+void smc_pnet_find_alt_roce(struct smc_link_group *lgr,
+                           struct smc_init_info *ini,
+                           struct smc_ib_device *known_dev);
 #endif