Skip to content

Commit bee35b7

Browse files
longlimsftrleon
authored andcommitted
RDMA/mana_ib: Handle net event for pointing to the current netdev
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>
1 parent a8445cf commit bee35b7

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
@@ -65,6 +65,38 @@ static const struct ib_device_ops mana_ib_stats_ops = {
6565
.get_hw_stats = mana_ib_get_hw_stats,
6666
};
6767

68+
static int mana_ib_netdev_event(struct notifier_block *this,
69+
unsigned long event, void *ptr)
70+
{
71+
struct mana_ib_dev *dev = container_of(this, struct mana_ib_dev, nb);
72+
struct net_device *event_dev = netdev_notifier_info_to_dev(ptr);
73+
struct gdma_context *gc = dev->gdma_dev->gdma_context;
74+
struct mana_context *mc = gc->mana.driver_data;
75+
struct net_device *ndev;
76+
77+
/* Only process events from our parent device */
78+
if (event_dev != mc->ports[0])
79+
return NOTIFY_DONE;
80+
81+
switch (event) {
82+
case NETDEV_CHANGEUPPER:
83+
ndev = mana_get_primary_netdev(mc, 0, &dev->dev_tracker);
84+
/*
85+
* RDMA core will setup GID based on updated netdev.
86+
* It's not possible to race with the core as rtnl lock is being
87+
* held.
88+
*/
89+
ib_device_set_netdev(&dev->ib_dev, ndev, 1);
90+
91+
/* mana_get_primary_netdev() returns ndev with refcount held */
92+
netdev_put(ndev, &dev->dev_tracker);
93+
94+
return NOTIFY_OK;
95+
default:
96+
return NOTIFY_DONE;
97+
}
98+
}
99+
68100
static int mana_ib_probe(struct auxiliary_device *adev,
69101
const struct auxiliary_device_id *id)
70102
{
@@ -122,19 +154,27 @@ static int mana_ib_probe(struct auxiliary_device *adev,
122154
}
123155
dev->gdma_dev = &mdev->gdma_context->mana_ib;
124156

157+
dev->nb.notifier_call = mana_ib_netdev_event;
158+
ret = register_netdevice_notifier(&dev->nb);
159+
if (ret) {
160+
ibdev_err(&dev->ib_dev, "Failed to register net notifier, %d",
161+
ret);
162+
goto deregister_device;
163+
}
164+
125165
ret = mana_ib_gd_query_adapter_caps(dev);
126166
if (ret) {
127167
ibdev_err(&dev->ib_dev, "Failed to query device caps, ret %d",
128168
ret);
129-
goto deregister_device;
169+
goto deregister_net_notifier;
130170
}
131171

132172
ib_set_device_ops(&dev->ib_dev, &mana_ib_stats_ops);
133173

134174
ret = mana_ib_create_eqs(dev);
135175
if (ret) {
136176
ibdev_err(&dev->ib_dev, "Failed to create EQs, ret %d", ret);
137-
goto deregister_device;
177+
goto deregister_net_notifier;
138178
}
139179

140180
ret = mana_ib_gd_create_rnic_adapter(dev);
@@ -172,6 +212,8 @@ static int mana_ib_probe(struct auxiliary_device *adev,
172212
mana_ib_gd_destroy_rnic_adapter(dev);
173213
destroy_eqs:
174214
mana_ib_destroy_eqs(dev);
215+
deregister_net_notifier:
216+
unregister_netdevice_notifier(&dev->nb);
175217
deregister_device:
176218
mana_gd_deregister_device(dev->gdma_dev);
177219
free_ib_device:
@@ -188,6 +230,7 @@ static void mana_ib_remove(struct auxiliary_device *adev)
188230
xa_destroy(&dev->qp_table_wq);
189231
mana_ib_gd_destroy_rnic_adapter(dev);
190232
mana_ib_destroy_eqs(dev);
233+
unregister_netdevice_notifier(&dev->nb);
191234
mana_gd_deregister_device(dev->gdma_dev);
192235
ib_dealloc_device(&dev->ib_dev);
193236
}

drivers/infiniband/hw/mana/mana_ib.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ struct mana_ib_dev {
7979
struct mana_ib_adapter_caps adapter_caps;
8080
struct dma_pool *av_pool;
8181
netdevice_tracker dev_tracker;
82+
struct notifier_block nb;
8283
};
8384

8485
struct mana_ib_wq {

0 commit comments

Comments
 (0)