On 2018å10æ11æ 22:06, Jason Wang wrote:
Yes, simply suspend and resume.
On 2018å10æ11æ 18:22, ake wrote:
On 2018å10æ11æ 18:44, Jason Wang wrote:Yes, maybe. One case I can see now is when the device is down, in this
On 2018å10æ11æ 15:51, Ake Koomsin wrote:Thank you for your review.
commit 713a98d90c5e ("virtio-net: serialize tx routine during reset")I believe this is duplicated with netif_tx_wake_all_queues() in
disabled the virtio tx before going to suspend to avoid a use after
free.
However, after resuming, it causes the virtio_net device to lose its
network connectivity.
To solve the issue, we need to enable tx after resuming.
Fixes commit 713a98d90c5e ("virtio-net: serialize tx routine during
reset")
Signed-off-by: Ake Koomsin <ake@xxxxxxxxxx>
---
ÂÂ drivers/net/virtio_net.c | 1 +
ÂÂ 1 file changed, 1 insertion(+)
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
index dab504ec5e50..3453d80f5f81 100644
--- a/drivers/net/virtio_net.c
+++ b/drivers/net/virtio_net.c
@@ -2256,6 +2256,7 @@ static int virtnet_restore_up(struct
virtio_device *vdev)
ÂÂÂÂÂÂ }
ÂÂ ÂÂÂÂÂ netif_device_attach(vi->dev);
+ÂÂÂ netif_start_queue(vi->dev);
netif_device_attach() above?
If both netif_tx_wake_all_queues() and netif_start_queue() result in
clearing __QUEUE_STATE_DRV_XOFF, then is it possible that some
conditions in netif_device_attach() is not satisfied?
case netif_device_attach() won't try to wakeup the queue.
 WithoutHow do you trigger the issue? Just do suspend/resume?
netif_start_queue(), the virtio_net device does not resume properly
after waking up.
Here is how I trigger the issue:
1) Start the Virtual Machine Manager GUI program.
2) Create a guest Linux OS. Make sure that the guest OS kernel is
>= 4.12. Make sure that it uses virtio_net as its network device.
In addition, make sure that the video adapter is VGA. Otherwise,
waking up with the virtual power button does not work.
3) After installing the guest OS, log in, and test the network
connectivity by ping the host machine.
4) Suspend. After this, the screen is blank.
5) Resume by hitting the virtual power button. The login screen
appears again.
6) Log in again. The guest loses its network connection.
In my test:
Guest: Ubuntu 16.04/18.04 with kernel 4.15.0-36-generic
Host: Ubuntu 16.04 with kernel 4.15.0-36-generic/4.4.0-137-generic
The issue disappears if I move netif_tx_disable() under the check ofIs it better to report this as a bug first?Nope, you're very welcome to post patch directly.
If I am to do moreAs you've figured out, you can start with why netif_tx_wake_all_queues()
investigation, what areas should I look into?
were not executed?
(Btw, does the issue disappear if you move netif_tx_disable() under the
check of netif_running() in virtnet_freeze_down()?)
netif_running() in virtnet_freeze_down(). Moving netif_tx_disable()
is probably better as its logic is consistent with
netif_device_attach() implementation. If you are OK with this idea,
I will submit another patch.
ThanksBest Regards
Best Regards
Ake Koomsin