550d33ded2
- kvm-qapi-machine.json-Add-cluster-id.patch [bz#2041823] - kvm-qtest-numa-test-Specify-CPU-topology-in-aarch64_numa.patch [bz#2041823] - kvm-hw-arm-virt-Consider-SMP-configuration-in-CPU-topolo.patch [bz#2041823] - kvm-qtest-numa-test-Correct-CPU-and-NUMA-association-in-.patch [bz#2041823] - kvm-hw-arm-virt-Fix-CPU-s-default-NUMA-node-ID.patch [bz#2041823] - kvm-hw-acpi-aml-build-Use-existing-CPU-topology-to-build.patch [bz#2041823] - kvm-coroutine-Rename-qemu_coroutine_inc-dec_pool_size.patch [bz#2079938] - kvm-coroutine-Revert-to-constant-batch-size.patch [bz#2079938] - kvm-virtio-scsi-fix-ctrl-and-event-handler-functions-in-.patch [bz#2079347] - kvm-virtio-scsi-don-t-waste-CPU-polling-the-event-virtqu.patch [bz#2079347] - kvm-virtio-scsi-clean-up-virtio_scsi_handle_event_vq.patch [bz#2079347] - kvm-virtio-scsi-clean-up-virtio_scsi_handle_ctrl_vq.patch [bz#2079347] - kvm-virtio-scsi-clean-up-virtio_scsi_handle_cmd_vq.patch [bz#2079347] - kvm-virtio-scsi-move-request-related-items-from-.h-to-.c.patch [bz#2079347] - kvm-Revert-virtio-scsi-Reject-scsi-cd-if-data-plane-enab.patch [bz#1995710] - kvm-migration-Fix-operator-type.patch [bz#2064530] - Resolves: bz#2041823 ([aarch64][numa] When there are at least 6 Numa nodes serial log shows 'arch topology borken') - Resolves: bz#2079938 (qemu coredump when boot with multi disks (qemu) failed to set up stack guard page: Cannot allocate memory) - Resolves: bz#2079347 (Guest boot blocked when scsi disks using same iothread and 100% CPU consumption) - Resolves: bz#1995710 (RFE: Allow virtio-scsi CD-ROM media change with IOThreads) - Resolves: bz#2064530 (Rebuild qemu-kvm with clang-14)
120 lines
4.1 KiB
Diff
120 lines
4.1 KiB
Diff
From 5aaf33dbbbc89d58a52337985641723b9ee13541 Mon Sep 17 00:00:00 2001
|
|
From: Stefan Hajnoczi <stefanha@redhat.com>
|
|
Date: Wed, 27 Apr 2022 15:35:36 +0100
|
|
Subject: [PATCH 09/16] virtio-scsi: fix ctrl and event handler functions in
|
|
dataplane mode
|
|
|
|
RH-Author: Stefan Hajnoczi <stefanha@redhat.com>
|
|
RH-MergeRequest: 88: virtio-scsi: fix 100% CPU consumption with IOThreads
|
|
RH-Commit: [1/6] 3087889041b960f14a6b3893243f78523a78f637 (stefanha/centos-stream-qemu-kvm)
|
|
RH-Bugzilla: 2079347
|
|
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
|
RH-Acked-by: Kevin Wolf <kwolf@redhat.com>
|
|
RH-Acked-by: Stefano Garzarella <sgarzare@redhat.com>
|
|
|
|
Commit f34e8d8b8d48d73f36a67b6d5e492ef9784b5012 ("virtio-scsi: prepare
|
|
virtio_scsi_handle_cmd for dataplane") prepared the virtio-scsi cmd
|
|
virtqueue handler function to be used in both the dataplane and
|
|
non-datpalane code paths.
|
|
|
|
It failed to convert the ctrl and event virtqueue handler functions,
|
|
which are not designed to be called from the dataplane code path but
|
|
will be since the ioeventfd is set up for those virtqueues when
|
|
dataplane starts.
|
|
|
|
Convert the ctrl and event virtqueue handler functions now so they
|
|
operate correctly when called from the dataplane code path. Avoid code
|
|
duplication by extracting this code into a helper function.
|
|
|
|
Fixes: f34e8d8b8d48d73f36a67b6d5e492ef9784b5012 ("virtio-scsi: prepare virtio_scsi_handle_cmd for dataplane")
|
|
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
|
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
|
|
Message-id: 20220427143541.119567-2-stefanha@redhat.com
|
|
[Fixed s/by used/be used/ typo pointed out by Michael Tokarev
|
|
<mjt@tls.msk.ru>.
|
|
--Stefan]
|
|
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
|
(cherry picked from commit 2f743ef6366c2df4ef51ef3ae318138cdc0125ab)
|
|
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
|
---
|
|
hw/scsi/virtio-scsi.c | 42 +++++++++++++++++++++++++++---------------
|
|
1 file changed, 27 insertions(+), 15 deletions(-)
|
|
|
|
diff --git a/hw/scsi/virtio-scsi.c b/hw/scsi/virtio-scsi.c
|
|
index 7f6da33a8a..7b69eeed64 100644
|
|
--- a/hw/scsi/virtio-scsi.c
|
|
+++ b/hw/scsi/virtio-scsi.c
|
|
@@ -472,16 +472,32 @@ bool virtio_scsi_handle_ctrl_vq(VirtIOSCSI *s, VirtQueue *vq)
|
|
return progress;
|
|
}
|
|
|
|
+/*
|
|
+ * If dataplane is configured but not yet started, do so now and return true on
|
|
+ * success.
|
|
+ *
|
|
+ * Dataplane is started by the core virtio code but virtqueue handler functions
|
|
+ * can also be invoked when a guest kicks before DRIVER_OK, so this helper
|
|
+ * function helps us deal with manually starting ioeventfd in that case.
|
|
+ */
|
|
+static bool virtio_scsi_defer_to_dataplane(VirtIOSCSI *s)
|
|
+{
|
|
+ if (!s->ctx || s->dataplane_started) {
|
|
+ return false;
|
|
+ }
|
|
+
|
|
+ virtio_device_start_ioeventfd(&s->parent_obj.parent_obj);
|
|
+ return !s->dataplane_fenced;
|
|
+}
|
|
+
|
|
static void virtio_scsi_handle_ctrl(VirtIODevice *vdev, VirtQueue *vq)
|
|
{
|
|
VirtIOSCSI *s = (VirtIOSCSI *)vdev;
|
|
|
|
- if (s->ctx) {
|
|
- virtio_device_start_ioeventfd(vdev);
|
|
- if (!s->dataplane_fenced) {
|
|
- return;
|
|
- }
|
|
+ if (virtio_scsi_defer_to_dataplane(s)) {
|
|
+ return;
|
|
}
|
|
+
|
|
virtio_scsi_acquire(s);
|
|
virtio_scsi_handle_ctrl_vq(s, vq);
|
|
virtio_scsi_release(s);
|
|
@@ -720,12 +736,10 @@ static void virtio_scsi_handle_cmd(VirtIODevice *vdev, VirtQueue *vq)
|
|
/* use non-QOM casts in the data path */
|
|
VirtIOSCSI *s = (VirtIOSCSI *)vdev;
|
|
|
|
- if (s->ctx && !s->dataplane_started) {
|
|
- virtio_device_start_ioeventfd(vdev);
|
|
- if (!s->dataplane_fenced) {
|
|
- return;
|
|
- }
|
|
+ if (virtio_scsi_defer_to_dataplane(s)) {
|
|
+ return;
|
|
}
|
|
+
|
|
virtio_scsi_acquire(s);
|
|
virtio_scsi_handle_cmd_vq(s, vq);
|
|
virtio_scsi_release(s);
|
|
@@ -855,12 +869,10 @@ static void virtio_scsi_handle_event(VirtIODevice *vdev, VirtQueue *vq)
|
|
{
|
|
VirtIOSCSI *s = VIRTIO_SCSI(vdev);
|
|
|
|
- if (s->ctx) {
|
|
- virtio_device_start_ioeventfd(vdev);
|
|
- if (!s->dataplane_fenced) {
|
|
- return;
|
|
- }
|
|
+ if (virtio_scsi_defer_to_dataplane(s)) {
|
|
+ return;
|
|
}
|
|
+
|
|
virtio_scsi_acquire(s);
|
|
virtio_scsi_handle_event_vq(s, vq);
|
|
virtio_scsi_release(s);
|
|
--
|
|
2.31.1
|
|
|