net/smc: replace function pointer get_netdev()
authorUrsula Braun <ubraun@linux.vnet.ibm.com>
Wed, 11 Oct 2017 11:47:22 +0000 (13:47 +0200)
committerDavid S. Miller <davem@davemloft.net>
Thu, 12 Oct 2017 19:20:26 +0000 (12:20 -0700)
SMC should not open code the function pointer get_netdev of the
IB device. Replacing ib_query_gid(..., NULL) with
ib_query_gid(..., gid_attr) allows access to the netdev.

Signed-off-by: Ursula Braun <ubraun@linux.vnet.ibm.com>
Suggested-by: Parav Pandit <parav@mellanox.com>
Reviewed-by: Parav Pandit <parav@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/smc/smc_ib.c

index 0b5852299158a71dea6c4f38b16482d80c078f56..468e1d725d97c5c369d12fc8d5b56367a1c09ab0 100644 (file)
@@ -369,26 +369,17 @@ void smc_ib_buf_unmap_sg(struct smc_ib_device *smcibdev,
 
 static int smc_ib_fill_gid_and_mac(struct smc_ib_device *smcibdev, u8 ibport)
 {
-       struct net_device *ndev;
+       struct ib_gid_attr gattr;
        int rc;
 
        rc = ib_query_gid(smcibdev->ibdev, ibport, 0,
-                         &smcibdev->gid[ibport - 1], NULL);
-       /* the SMC protocol requires specification of the roce MAC address;
-        * if net_device cannot be determined, it can be derived from gid 0
-        */
-       ndev = smcibdev->ibdev->get_netdev(smcibdev->ibdev, ibport);
-       if (ndev) {
-               memcpy(&smcibdev->mac, ndev->dev_addr, ETH_ALEN);
-               dev_put(ndev);
-       } else if (!rc) {
-               memcpy(&smcibdev->mac[ibport - 1][0],
-                      &smcibdev->gid[ibport - 1].raw[8], 3);
-               memcpy(&smcibdev->mac[ibport - 1][3],
-                      &smcibdev->gid[ibport - 1].raw[13], 3);
-               smcibdev->mac[ibport - 1][0] &= ~0x02;
-       }
-       return rc;
+                         &smcibdev->gid[ibport - 1], &gattr);
+       if (rc || !gattr.ndev)
+               return -ENODEV;
+
+       memcpy(smcibdev->mac[ibport - 1], gattr.ndev->dev_addr, ETH_ALEN);
+       dev_put(gattr.ndev);
+       return 0;
 }
 
 /* Create an identifier unique for this instance of SMC-R.
@@ -419,6 +410,7 @@ int smc_ib_remember_port_attr(struct smc_ib_device *smcibdev, u8 ibport)
                           &smcibdev->pattr[ibport - 1]);
        if (rc)
                goto out;
+       /* the SMC protocol requires specification of the RoCE MAC address */
        rc = smc_ib_fill_gid_and_mac(smcibdev, ibport);
        if (rc)
                goto out;