Blame SOURCES/kvm-virtio-net-don-t-touch-virtqueue-if-vm-is-stopped.patch

9bac43
From d7c69df61c216de014aca9d1eafc94ddb81ce5bb Mon Sep 17 00:00:00 2001
9bac43
From: Xiao Wang <jasowang@redhat.com>
9bac43
Date: Wed, 29 Nov 2017 07:39:51 +0100
9bac43
Subject: [PATCH 17/21] virtio-net: don't touch virtqueue if vm is stopped
9bac43
9bac43
RH-Author: Xiao Wang <jasowang@redhat.com>
9bac43
Message-id: <1511941191-30204-1-git-send-email-jasowang@redhat.com>
9bac43
Patchwork-id: 77949
9bac43
O-Subject: [RHV7.5 qemu-kvm-rhev PATCH] virtio-net: don't touch virtqueue if vm is stopped
9bac43
Bugzilla: 1506151
9bac43
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
9bac43
RH-Acked-by: Pankaj Gupta <pagupta@redhat.com>
9bac43
RH-Acked-by: wexu@redhat.com
9bac43
9bac43
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1506151
9bac43
Brew Build: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=14645237
9bac43
Test status: Tested by myself
9bac43
9bac43
Guest state should not be touched if VM is stopped, unfortunately we
9bac43
didn't check running state and tried to drain tx queue unconditionally
9bac43
in virtio_net_set_status(). A crash was then noticed as a migration
9bac43
destination when user type quit after virtqueue state is loaded but
9bac43
before region cache is initialized. In this case,
9bac43
virtio_net_drop_tx_queue_data() tries to access the uninitialized
9bac43
region cache.
9bac43
9bac43
Fix this by only dropping tx queue data when vm is running.
9bac43
9bac43
Fixes: 283e2c2adcb80 ("net: virtio-net discards TX data after link down")
9bac43
Cc: Yuri Benditovich <yuri.benditovich@daynix.com>
9bac43
Cc: Paolo Bonzini <pbonzini@redhat.com>
9bac43
Cc: Stefan Hajnoczi <stefanha@redhat.com>
9bac43
Cc: Michael S. Tsirkin <mst@redhat.com>
9bac43
Cc: qemu-stable@nongnu.org
9bac43
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
9bac43
Signed-off-by: Jason Wang <jasowang@redhat.com>
9bac43
(cherry picked from commit 70e53e6e4da3db4b2c31981191753a7e974936d0)
9bac43
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
9bac43
---
9bac43
 hw/net/virtio-net.c | 3 ++-
9bac43
 1 file changed, 2 insertions(+), 1 deletion(-)
9bac43
9bac43
diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
9bac43
index 148071a..fbc5e1b 100644
9bac43
--- a/hw/net/virtio-net.c
9bac43
+++ b/hw/net/virtio-net.c
9bac43
@@ -288,7 +288,8 @@ static void virtio_net_set_status(struct VirtIODevice *vdev, uint8_t status)
9bac43
                 qemu_bh_cancel(q->tx_bh);
9bac43
             }
9bac43
             if ((n->status & VIRTIO_NET_S_LINK_UP) == 0 &&
9bac43
-                (queue_status & VIRTIO_CONFIG_S_DRIVER_OK)) {
9bac43
+                (queue_status & VIRTIO_CONFIG_S_DRIVER_OK) &&
9bac43
+                vdev->vm_running) {
9bac43
                 /* if tx is waiting we are likely have some packets in tx queue
9bac43
                  * and disabled notification */
9bac43
                 q->tx_waiting = 0;
9bac43
-- 
9bac43
1.8.3.1
9bac43