yeahuh / rpms / qemu-kvm

Forked from rpms/qemu-kvm 2 years ago
Clone

Blame SOURCES/kvm-virtio-blk-Cancel-the-pending-BH-when-the-dataplane-.patch

4ec855
From 93a7832d5dfd83f170119e7130f3968fe37fa8e6 Mon Sep 17 00:00:00 2001
4ec855
From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= <philmd@redhat.com>
4ec855
Date: Fri, 13 Sep 2019 14:16:25 +0100
4ec855
Subject: [PATCH 08/22] virtio-blk: Cancel the pending BH when the dataplane is
4ec855
 reset
4ec855
MIME-Version: 1.0
4ec855
Content-Type: text/plain; charset=UTF-8
4ec855
Content-Transfer-Encoding: 8bit
4ec855
4ec855
RH-Author: Philippe Mathieu-Daudé <philmd@redhat.com>
4ec855
Message-id: <20190913141625.12521-2-philmd@redhat.com>
4ec855
Patchwork-id: 90453
4ec855
O-Subject: [RHEL-7.7.z qemu-kvm-rhev + RHEL-8.1.0 qemu-kvm + RHEL-AV-8.1.0 qemu-kvm PATCH v2 1/1] virtio-blk: Cancel the pending BH when the dataplane is reset
4ec855
Bugzilla: 1708459
4ec855
RH-Acked-by: John Snow <jsnow@redhat.com>
4ec855
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
4ec855
RH-Acked-by: Danilo de Paula <ddepaula@redhat.com>
4ec855
4ec855
When 'system_reset' is called, the main loop clear the memory
4ec855
region cache before the BH has a chance to execute. Later when
4ec855
the deferred function is called, some assumptions that were
4ec855
made when scheduling them are no longer true when they actually
4ec855
execute.
4ec855
4ec855
This is what happens using a virtio-blk device (fresh RHEL7.8 install):
4ec855
4ec855
 $ (sleep 12.3; echo system_reset; sleep 12.3; echo system_reset; sleep 1; echo q) \
4ec855
   | qemu-system-x86_64 -m 4G -smp 8 -boot menu=on \
4ec855
     -device virtio-blk-pci,id=image1,drive=drive_image1 \
4ec855
     -drive file=/var/lib/libvirt/images/rhel78.qcow2,if=none,id=drive_image1,format=qcow2,cache=none \
4ec855
     -device virtio-net-pci,netdev=net0,id=nic0,mac=52:54:00:c4:e7:84 \
4ec855
     -netdev tap,id=net0,script=/bin/true,downscript=/bin/true,vhost=on \
4ec855
     -monitor stdio -serial null -nographic
4ec855
  (qemu) system_reset
4ec855
  (qemu) system_reset
4ec855
  (qemu) qemu-system-x86_64: hw/virtio/virtio.c:225: vring_get_region_caches: Assertion `caches != NULL' failed.
4ec855
  Aborted
4ec855
4ec855
  (gdb) bt
4ec855
  Thread 1 (Thread 0x7f109c17b680 (LWP 10939)):
4ec855
  #0  0x00005604083296d1 in vring_get_region_caches (vq=0x56040a24bdd0) at hw/virtio/virtio.c:227
4ec855
  #1  0x000056040832972b in vring_avail_flags (vq=0x56040a24bdd0) at hw/virtio/virtio.c:235
4ec855
  #2  0x000056040832d13d in virtio_should_notify (vdev=0x56040a240630, vq=0x56040a24bdd0) at hw/virtio/virtio.c:1648
4ec855
  #3  0x000056040832d1f8 in virtio_notify_irqfd (vdev=0x56040a240630, vq=0x56040a24bdd0) at hw/virtio/virtio.c:1662
4ec855
  #4  0x00005604082d213d in notify_guest_bh (opaque=0x56040a243ec0) at hw/block/dataplane/virtio-blk.c:75
4ec855
  #5  0x000056040883dc35 in aio_bh_call (bh=0x56040a243f10) at util/async.c:90
4ec855
  #6  0x000056040883dccd in aio_bh_poll (ctx=0x560409161980) at util/async.c:118
4ec855
  #7  0x0000560408842af7 in aio_dispatch (ctx=0x560409161980) at util/aio-posix.c:460
4ec855
  #8  0x000056040883e068 in aio_ctx_dispatch (source=0x560409161980, callback=0x0, user_data=0x0) at util/async.c:261
4ec855
  #9  0x00007f10a8fca06d in g_main_context_dispatch () at /lib64/libglib-2.0.so.0
4ec855
  #10 0x0000560408841445 in glib_pollfds_poll () at util/main-loop.c:215
4ec855
  #11 0x00005604088414bf in os_host_main_loop_wait (timeout=0) at util/main-loop.c:238
4ec855
  #12 0x00005604088415c4 in main_loop_wait (nonblocking=0) at util/main-loop.c:514
4ec855
  #13 0x0000560408416b1e in main_loop () at vl.c:1923
4ec855
  #14 0x000056040841e0e8 in main (argc=20, argv=0x7ffc2c3f9c58, envp=0x7ffc2c3f9d00) at vl.c:4578
4ec855
4ec855
Fix this by cancelling the BH when the virtio dataplane is stopped.
4ec855
4ec855
[This is version of the patch was modified as discussed with Philippe on
4ec855
the mailing list thread.
4ec855
--Stefan]
4ec855
4ec855
Reported-by: Yihuang Yu <yihyu@redhat.com>
4ec855
Suggested-by: Stefan Hajnoczi <stefanha@redhat.com>
4ec855
Fixes: https://bugs.launchpad.net/qemu/+bug/1839428
4ec855
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
4ec855
Message-Id: <20190816171503.24761-1-philmd@redhat.com>
4ec855
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
4ec855
(cherry picked from commit ebb6ff25cd888a52a64a9adc3692541c6d1d9a42)
4ec855
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
4ec855
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
4ec855
---
4ec855
 hw/block/dataplane/virtio-blk.c | 3 +++
4ec855
 1 file changed, 3 insertions(+)
4ec855
4ec855
diff --git a/hw/block/dataplane/virtio-blk.c b/hw/block/dataplane/virtio-blk.c
4ec855
index 101f32c..23e4022 100644
4ec855
--- a/hw/block/dataplane/virtio-blk.c
4ec855
+++ b/hw/block/dataplane/virtio-blk.c
4ec855
@@ -292,6 +292,9 @@ void virtio_blk_data_plane_stop(VirtIODevice *vdev)
4ec855
         virtio_bus_cleanup_host_notifier(VIRTIO_BUS(qbus), i);
4ec855
     }
4ec855
 
4ec855
+    qemu_bh_cancel(s->bh);
4ec855
+    notify_guest_bh(s); /* final chance to notify guest */
4ec855
+
4ec855
     /* Clean up guest notifier (irq) */
4ec855
     k->set_guest_notifiers(qbus->parent, nvqs, false);
4ec855
 
4ec855
-- 
4ec855
1.8.3.1
4ec855