aboutsummaryrefslogtreecommitdiff
path: root/hw
diff options
context:
space:
mode:
authorliujunjie <liujunjie23@huawei.com>2018-09-17 21:48:45 +0800
committerJason Wang <jasowang@redhat.com>2018-10-19 11:15:03 +0800
commit7da2d99fb9fbf30104125c061caaff330e362d74 (patch)
tree24c18d01765f6539a8a68105a5245cb4b2a2a02f /hw
parent8e640892ec2f54bd22d242d83953fba5ba98aac1 (diff)
downloadqemu-7da2d99fb9fbf30104125c061caaff330e362d74.zip
qemu-7da2d99fb9fbf30104125c061caaff330e362d74.tar.gz
qemu-7da2d99fb9fbf30104125c061caaff330e362d74.tar.bz2
clean up callback when del virtqueue
Before, we did not clear callback like handle_output when delete the virtqueue which may result be segmentfault. The scene is as follows: 1. Start a vm with multiqueue vhost-net, 2. then we write VIRTIO_PCI_GUEST_FEATURES in PCI configuration to triger multiqueue disable in this vm which will delete the virtqueue. In this step, the tx_bh is deleted but the callback virtio_net_handle_tx_bh still exist. 3. Finally, we write VIRTIO_PCI_QUEUE_NOTIFY in PCI configuration to notify the deleted virtqueue. In this way, virtio_net_handle_tx_bh will be called and qemu will be crashed. Although the way described above is uncommon, we had better reinforce it. CC: qemu-stable@nongnu.org Signed-off-by: liujunjie <liujunjie23@huawei.com> Signed-off-by: Jason Wang <jasowang@redhat.com>
Diffstat (limited to 'hw')
-rw-r--r--hw/virtio/virtio.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c
index 4e61944..4136d23 100644
--- a/hw/virtio/virtio.c
+++ b/hw/virtio/virtio.c
@@ -1611,6 +1611,8 @@ void virtio_del_queue(VirtIODevice *vdev, int n)
vdev->vq[n].vring.num = 0;
vdev->vq[n].vring.num_default = 0;
+ vdev->vq[n].handle_output = NULL;
+ vdev->vq[n].handle_aio_output = NULL;
}
static void virtio_set_isr(VirtIODevice *vdev, int value)