Message ID | 20201223025421.671-1-jdike@akamai.com (mailing list archive) |
---|---|
State | Accepted |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | [Repost,to,netdev] virtio_net: Fix recursive call to cpus_read_lock() | expand |
Context | Check | Description |
---|---|---|
netdev/cover_letter | success | Link |
netdev/fixes_present | fail | Series targets non-next tree, but doesn't contain any Fixes tags |
netdev/patch_count | success | Link |
netdev/tree_selection | success | Clearly marked for net |
netdev/subject_prefix | success | Link |
netdev/cc_maintainers | warning | 2 maintainers not CCed: davem@davemloft.net kuba@kernel.org |
netdev/source_inline | success | Was 0 now: 0 |
netdev/verify_signedoff | success | Link |
netdev/module_param | success | Was 0 now: 0 |
netdev/build_32bit | success | Errors and warnings before: 0 this patch: 0 |
netdev/kdoc | success | Errors and warnings before: 0 this patch: 0 |
netdev/verify_fixes | success | Link |
netdev/checkpatch | fail | ERROR: space required before the open brace '{' |
netdev/build_allmodconfig_warn | success | Errors and warnings before: 0 this patch: 0 |
netdev/header_inline | success | Link |
netdev/stable | fail | Stable CC detected: Cc: stable@vger.kernel.org |
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@akamai.com> > Acked-by: Jason Wang <jasowang@redhat.com> > Acked-by: Michael S. Tsirkin <mst@redhat.com> > Cc: stable@vger.kernel.org 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!
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){ + put_online_cpus(); + goto err; } + virtnet_set_affinity(vi); put_online_cpus(); + netif_set_real_num_tx_queues(dev, queue_pairs); + netif_set_real_num_rx_queues(dev, queue_pairs); + err: return err; }