]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
net/smc: Use rdma_read_gid_l2_fields to L2 fields
authorParav Pandit <parav@mellanox.com>
Thu, 2 May 2019 07:48:06 +0000 (10:48 +0300)
committerJason Gunthorpe <jgg@mellanox.com>
Fri, 3 May 2019 14:10:03 +0000 (11:10 -0300)
Use core provided API to fill the source MAC address and use
rdma_read_gid_attr_ndev_rcu() to get stable netdev.

This is preparation patch to allow gid attribute to become NULL when
associated net device is removed.

Signed-off-by: Parav Pandit <parav@mellanox.com>
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
net/smc/smc_ib.c

index 53f429c0484377a4dc12ac0fef0f31ee1ace51ee..d14ca4af6f94eba113b74e203c62d92dd456ed6c 100644 (file)
@@ -146,18 +146,13 @@ int smc_ib_ready_link(struct smc_link *lnk)
 static int smc_ib_fill_mac(struct smc_ib_device *smcibdev, u8 ibport)
 {
        const struct ib_gid_attr *attr;
-       int rc = 0;
+       int rc;
 
        attr = rdma_get_gid_attr(smcibdev->ibdev, ibport, 0);
        if (IS_ERR(attr))
                return -ENODEV;
 
-       if (attr->ndev)
-               memcpy(smcibdev->mac[ibport - 1], attr->ndev->dev_addr,
-                      ETH_ALEN);
-       else
-               rc = -ENODEV;
-
+       rc = rdma_read_gid_l2_fields(attr, NULL, smcibdev->mac[ibport - 1]);
        rdma_put_gid_attr(attr);
        return rc;
 }
@@ -185,6 +180,7 @@ int smc_ib_determine_gid(struct smc_ib_device *smcibdev, u8 ibport,
                         unsigned short vlan_id, u8 gid[], u8 *sgid_index)
 {
        const struct ib_gid_attr *attr;
+       const struct net_device *ndev;
        int i;
 
        for (i = 0; i < smcibdev->pattr[ibport - 1].gid_tbl_len; i++) {
@@ -192,11 +188,14 @@ int smc_ib_determine_gid(struct smc_ib_device *smcibdev, u8 ibport,
                if (IS_ERR(attr))
                        continue;
 
-               if (attr->ndev &&
+               rcu_read_lock();
+               ndev = rdma_read_gid_attr_ndev_rcu(attr);
+               if (!IS_ERR(ndev) &&
                    ((!vlan_id && !is_vlan_dev(attr->ndev)) ||
                     (vlan_id && is_vlan_dev(attr->ndev) &&
                      vlan_dev_vlan_id(attr->ndev) == vlan_id)) &&
                    attr->gid_type == IB_GID_TYPE_ROCE) {
+                       rcu_read_unlock();
                        if (gid)
                                memcpy(gid, &attr->gid, SMC_GID_SIZE);
                        if (sgid_index)
@@ -204,6 +203,7 @@ int smc_ib_determine_gid(struct smc_ib_device *smcibdev, u8 ibport,
                        rdma_put_gid_attr(attr);
                        return 0;
                }
+               rcu_read_unlock();
                rdma_put_gid_attr(attr);
        }
        return -ENODEV;