Commit c392d601 authored by Jason Wang's avatar Jason Wang Committed by Jakub Kicinski

virtio-net: synchronize probe with ndo_set_features

We calculate guest offloads during probe without the protection of
rtnl_lock. This lead to race between probe and ndo_set_features. Fix
this by moving the calculation under the rtnl_lock.

Fixes: 3f93522f ("virtio-net: switch off offloads on demand if possible on XDP set")
Acked-by: default avatarMichael S. Tsirkin <mst@redhat.com>
Signed-off-by: default avatarJason Wang <jasowang@redhat.com>
Link: https://patch.msgid.link/20240814052228.4654-5-jasowang@redhat.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent df28de7b
...@@ -6606,6 +6606,11 @@ static int virtnet_probe(struct virtio_device *vdev) ...@@ -6606,6 +6606,11 @@ static int virtnet_probe(struct virtio_device *vdev)
netif_carrier_on(dev); netif_carrier_on(dev);
} }
for (i = 0; i < ARRAY_SIZE(guest_offloads); i++)
if (virtio_has_feature(vi->vdev, guest_offloads[i]))
set_bit(guest_offloads[i], &vi->guest_offloads);
vi->guest_offloads_capable = vi->guest_offloads;
rtnl_unlock(); rtnl_unlock();
err = virtnet_cpu_notif_add(vi); err = virtnet_cpu_notif_add(vi);
...@@ -6614,11 +6619,6 @@ static int virtnet_probe(struct virtio_device *vdev) ...@@ -6614,11 +6619,6 @@ static int virtnet_probe(struct virtio_device *vdev)
goto free_unregister_netdev; goto free_unregister_netdev;
} }
for (i = 0; i < ARRAY_SIZE(guest_offloads); i++)
if (virtio_has_feature(vi->vdev, guest_offloads[i]))
set_bit(guest_offloads[i], &vi->guest_offloads);
vi->guest_offloads_capable = vi->guest_offloads;
pr_debug("virtnet: registered device %s with %d RX and TX vq's\n", pr_debug("virtnet: registered device %s with %d RX and TX vq's\n",
dev->name, max_queue_pairs); dev->name, max_queue_pairs);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment