Skip to content

Commit 465dc66

Browse files
longlimsftgregkh
authored andcommitted
RDMA/mana_ib: Handle net event for pointing to the current netdev
commit bee35b7 upstream. When running under Hyper-V, the master device to the RDMA device is always bonded to this RDMA device. This is not user-configurable. The master device can be unbind/bind from the kernel. During those events, the RDMA device should set to the current netdev to reflect the change of master device from those events. Signed-off-by: Long Li <longli@microsoft.com> Link: https://patch.msgid.link/1741821332-9392-2-git-send-email-longli@linuxonhyperv.com Signed-off-by: Leon Romanovsky <leon@kernel.org> Fixes: 1df03a4 ("RDMA/mana_ib: Set correct device into ib") Cc: stable@kernel.org Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 367bad7 commit 465dc66

2 files changed

Lines changed: 46 additions & 2 deletions

File tree

drivers/infiniband/hw/mana/device.c

Lines changed: 45 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,38 @@ static const struct ib_device_ops mana_ib_dev_ops = {
5151
ib_ind_table),
5252
};
5353

54+
static int mana_ib_netdev_event(struct notifier_block *this,
55+
unsigned long event, void *ptr)
56+
{
57+
struct mana_ib_dev *dev = container_of(this, struct mana_ib_dev, nb);
58+
struct net_device *event_dev = netdev_notifier_info_to_dev(ptr);
59+
struct gdma_context *gc = dev->gdma_dev->gdma_context;
60+
struct mana_context *mc = gc->mana.driver_data;
61+
struct net_device *ndev;
62+
63+
/* Only process events from our parent device */
64+
if (event_dev != mc->ports[0])
65+
return NOTIFY_DONE;
66+
67+
switch (event) {
68+
case NETDEV_CHANGEUPPER:
69+
ndev = mana_get_primary_netdev(mc, 0, &dev->dev_tracker);
70+
/*
71+
* RDMA core will setup GID based on updated netdev.
72+
* It's not possible to race with the core as rtnl lock is being
73+
* held.
74+
*/
75+
ib_device_set_netdev(&dev->ib_dev, ndev, 1);
76+
77+
/* mana_get_primary_netdev() returns ndev with refcount held */
78+
netdev_put(ndev, &dev->dev_tracker);
79+
80+
return NOTIFY_OK;
81+
default:
82+
return NOTIFY_DONE;
83+
}
84+
}
85+
5486
static int mana_ib_probe(struct auxiliary_device *adev,
5587
const struct auxiliary_device_id *id)
5688
{
@@ -108,17 +140,25 @@ static int mana_ib_probe(struct auxiliary_device *adev,
108140
}
109141
dev->gdma_dev = &mdev->gdma_context->mana_ib;
110142

143+
dev->nb.notifier_call = mana_ib_netdev_event;
144+
ret = register_netdevice_notifier(&dev->nb);
145+
if (ret) {
146+
ibdev_err(&dev->ib_dev, "Failed to register net notifier, %d",
147+
ret);
148+
goto deregister_device;
149+
}
150+
111151
ret = mana_ib_gd_query_adapter_caps(dev);
112152
if (ret) {
113153
ibdev_err(&dev->ib_dev, "Failed to query device caps, ret %d",
114154
ret);
115-
goto deregister_device;
155+
goto deregister_net_notifier;
116156
}
117157

118158
ret = mana_ib_create_eqs(dev);
119159
if (ret) {
120160
ibdev_err(&dev->ib_dev, "Failed to create EQs, ret %d", ret);
121-
goto deregister_device;
161+
goto deregister_net_notifier;
122162
}
123163

124164
ret = mana_ib_gd_create_rnic_adapter(dev);
@@ -147,6 +187,8 @@ static int mana_ib_probe(struct auxiliary_device *adev,
147187
mana_ib_gd_destroy_rnic_adapter(dev);
148188
destroy_eqs:
149189
mana_ib_destroy_eqs(dev);
190+
deregister_net_notifier:
191+
unregister_netdevice_notifier(&dev->nb);
150192
deregister_device:
151193
mana_gd_deregister_device(dev->gdma_dev);
152194
free_ib_device:
@@ -162,6 +204,7 @@ static void mana_ib_remove(struct auxiliary_device *adev)
162204
xa_destroy(&dev->qp_table_wq);
163205
mana_ib_gd_destroy_rnic_adapter(dev);
164206
mana_ib_destroy_eqs(dev);
207+
unregister_netdevice_notifier(&dev->nb);
165208
mana_gd_deregister_device(dev->gdma_dev);
166209
ib_dealloc_device(&dev->ib_dev);
167210
}

drivers/infiniband/hw/mana/mana_ib.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ struct mana_ib_dev {
6565
struct xarray qp_table_wq;
6666
struct mana_ib_adapter_caps adapter_caps;
6767
netdevice_tracker dev_tracker;
68+
struct notifier_block nb;
6869
};
6970

7071
struct mana_ib_wq {

0 commit comments

Comments
 (0)