On Tue, 22 Dec 2020 21:54:21 -0500 Jeff Dike wrote: > virtnet_set_channels can recursively call cpus_read_lock if CONFIG_XPS > and CONFIG_HOTPLUG are enabled. > > The path is: > virtnet_set_channels - calls get_online_cpus(), which is a trivial > wrapper around cpus_read_lock() > netif_set_real_num_tx_queues > netif_reset_xps_queues_gt > netif_reset_xps_queues - calls cpus_read_lock() > > This call chain and potential deadlock happens when the number of TX > queues is reduced. > > This commit the removes netif_set_real_num_[tr]x_queues calls from > inside the get/put_online_cpus section, as they don't require that it > be held. Fixes: 47be24796c13 ("virtio-net: fix the set affinity bug when CPU IDs are not consecutive") > Signed-off-by: Jeff Dike <jdike@xxxxxxxxxx> > Acked-by: Jason Wang <jasowang@xxxxxxxxxx> > Acked-by: Michael S. Tsirkin <mst@xxxxxxxxxx> > Cc: stable@xxxxxxxxxxxxxxx Queued for stable. > diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c > index 052975ea0af4..e02c7e0f1cf9 100644 > --- a/drivers/net/virtio_net.c > +++ b/drivers/net/virtio_net.c > @@ -2093,14 +2093,16 @@ static int virtnet_set_channels(struct net_device *dev, > > get_online_cpus(); > err = _virtnet_set_queues(vi, queue_pairs); > - if (!err) { > - netif_set_real_num_tx_queues(dev, queue_pairs); > - netif_set_real_num_rx_queues(dev, queue_pairs); > - > - virtnet_set_affinity(vi); > + if (err){ Added missing space here. > + put_online_cpus(); > + goto err; > } And applied, thanks!