On 6/14/2023 10:00 AM, Chuck Lever wrote:
From: Chuck Lever <chuck.lever@xxxxxxxxxx>
Have the iwarp side properly set the ndev in the device's sgid_attrs
so that address resolution can treat it more like a RoCE device.
Suggested-by: Jason Gunthorpe <jgg@xxxxxxxxxx>
Signed-off-by: Chuck Lever <chuck.lever@xxxxxxxxxx>
---
drivers/infiniband/core/cache.c | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/drivers/infiniband/core/cache.c b/drivers/infiniband/core/cache.c
index 2e91d8879326..717524fe8a39 100644
--- a/drivers/infiniband/core/cache.c
+++ b/drivers/infiniband/core/cache.c
@@ -1439,6 +1439,7 @@ static int config_non_roce_gid_cache(struct ib_device *device,
{
struct ib_gid_attr gid_attr = {};
struct ib_gid_table *table;
+ struct net_device *ndev;
int ret = 0;
int i;
@@ -1457,10 +1458,21 @@ static int config_non_roce_gid_cache(struct ib_device *device,
i);
goto err;
}
+
+ ndev = NULL;
+ if (rdma_protocol_iwarp(device, port)) {
+ ndev = ib_device_get_netdev(device, port);
+ if (!ndev)
+ continue;
+ RCU_INIT_POINTER(gid_attr.ndev, ndev);
+ }
+
gid_attr.index = i;
tprops->subnet_prefix =
be64_to_cpu(gid_attr.gid.global.subnet_prefix);
add_modify_gid(table, &gid_attr);
+
+ dev_put(ndev);
I'm not sure about two things here...
1) is it correct to dev_put(ndev) when returning? It seems that this
may risk the device may vanish when it's still present in the cache.
Feel free to tell me I'm confused.
2) Assuming yes, shouldn't the dev_put(ndev) move to within the new
if(iwarp) block just above?
Tom.
}
err:
mutex_unlock(&table->lock);