| From 5335e0d9c3736ef6fa59412d0ebe1cee855da925 Mon Sep 17 00:00:00 2001 |
| From: Jason Wang <jasowang@redhat.com> |
| Date: Tue, 15 Oct 2013 11:18:59 +0800 |
| Subject: virtio-net: refill only when device is up during setting queues |
| |
| From: Jason Wang <jasowang@redhat.com> |
| |
| [ Upstream commit 35ed159bfd96a7547ec277ed8b550c7cbd9841b6 ] |
| |
| We used to schedule the refill work unconditionally after changing the |
| number of queues. This may lead an issue if the device is not |
| up. Since we only try to cancel the work in ndo_stop(), this may cause |
| the refill work still work after removing the device. Fix this by only |
| schedule the work when device is up. |
| |
| The bug were introduce by commit 9b9cd8024a2882e896c65222aa421d461354e3f2. |
| (virtio-net: fix the race between channels setting and refill) |
| |
| Signed-off-by: Jason Wang <jasowang@redhat.com> |
| Cc: Rusty Russell <rusty@rustcorp.com.au> |
| Cc: Michael S. Tsirkin <mst@redhat.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/net/virtio_net.c | 6 +++++- |
| 1 file changed, 5 insertions(+), 1 deletion(-) |
| |
| --- a/drivers/net/virtio_net.c |
| +++ b/drivers/net/virtio_net.c |
| @@ -916,7 +916,9 @@ static int virtnet_set_queues(struct vir |
| return -EINVAL; |
| } else { |
| vi->curr_queue_pairs = queue_pairs; |
| - schedule_delayed_work(&vi->refill, 0); |
| + /* virtnet_open() will refill when device is going to up. */ |
| + if (dev->flags & IFF_UP) |
| + schedule_delayed_work(&vi->refill, 0); |
| } |
| |
| return 0; |
| @@ -1714,7 +1716,9 @@ static int virtnet_restore(struct virtio |
| vi->config_enable = true; |
| mutex_unlock(&vi->config_lock); |
| |
| + rtnl_lock(); |
| virtnet_set_queues(vi, vi->curr_queue_pairs); |
| + rtnl_unlock(); |
| |
| return 0; |
| } |