Blame SOURCES/kvm-virtio-scsi-fix-ctrl-and-event-handler-functions-in-.patch

586cba
From 5aaf33dbbbc89d58a52337985641723b9ee13541 Mon Sep 17 00:00:00 2001
586cba
From: Stefan Hajnoczi <stefanha@redhat.com>
586cba
Date: Wed, 27 Apr 2022 15:35:36 +0100
586cba
Subject: [PATCH 09/16] virtio-scsi: fix ctrl and event handler functions in
586cba
 dataplane mode
586cba
586cba
RH-Author: Stefan Hajnoczi <stefanha@redhat.com>
586cba
RH-MergeRequest: 88: virtio-scsi: fix 100% CPU consumption with IOThreads
586cba
RH-Commit: [1/6] 3087889041b960f14a6b3893243f78523a78f637 (stefanha/centos-stream-qemu-kvm)
586cba
RH-Bugzilla: 2079347
586cba
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
586cba
RH-Acked-by: Kevin Wolf <kwolf@redhat.com>
586cba
RH-Acked-by: Stefano Garzarella <sgarzare@redhat.com>
586cba
586cba
Commit f34e8d8b8d48d73f36a67b6d5e492ef9784b5012 ("virtio-scsi: prepare
586cba
virtio_scsi_handle_cmd for dataplane") prepared the virtio-scsi cmd
586cba
virtqueue handler function to be used in both the dataplane and
586cba
non-datpalane code paths.
586cba
586cba
It failed to convert the ctrl and event virtqueue handler functions,
586cba
which are not designed to be called from the dataplane code path but
586cba
will be since the ioeventfd is set up for those virtqueues when
586cba
dataplane starts.
586cba
586cba
Convert the ctrl and event virtqueue handler functions now so they
586cba
operate correctly when called from the dataplane code path. Avoid code
586cba
duplication by extracting this code into a helper function.
586cba
586cba
Fixes: f34e8d8b8d48d73f36a67b6d5e492ef9784b5012 ("virtio-scsi: prepare virtio_scsi_handle_cmd for dataplane")
586cba
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
586cba
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
586cba
Message-id: 20220427143541.119567-2-stefanha@redhat.com
586cba
[Fixed s/by used/be used/ typo pointed out by Michael Tokarev
586cba
<mjt@tls.msk.ru>.
586cba
--Stefan]
586cba
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
586cba
(cherry picked from commit 2f743ef6366c2df4ef51ef3ae318138cdc0125ab)
586cba
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
586cba
---
586cba
 hw/scsi/virtio-scsi.c | 42 +++++++++++++++++++++++++++---------------
586cba
 1 file changed, 27 insertions(+), 15 deletions(-)
586cba
586cba
diff --git a/hw/scsi/virtio-scsi.c b/hw/scsi/virtio-scsi.c
586cba
index 7f6da33a8a..7b69eeed64 100644
586cba
--- a/hw/scsi/virtio-scsi.c
586cba
+++ b/hw/scsi/virtio-scsi.c
586cba
@@ -472,16 +472,32 @@ bool virtio_scsi_handle_ctrl_vq(VirtIOSCSI *s, VirtQueue *vq)
586cba
     return progress;
586cba
 }
586cba
 
586cba
+/*
586cba
+ * If dataplane is configured but not yet started, do so now and return true on
586cba
+ * success.
586cba
+ *
586cba
+ * Dataplane is started by the core virtio code but virtqueue handler functions
586cba
+ * can also be invoked when a guest kicks before DRIVER_OK, so this helper
586cba
+ * function helps us deal with manually starting ioeventfd in that case.
586cba
+ */
586cba
+static bool virtio_scsi_defer_to_dataplane(VirtIOSCSI *s)
586cba
+{
586cba
+    if (!s->ctx || s->dataplane_started) {
586cba
+        return false;
586cba
+    }
586cba
+
586cba
+    virtio_device_start_ioeventfd(&s->parent_obj.parent_obj);
586cba
+    return !s->dataplane_fenced;
586cba
+}
586cba
+
586cba
 static void virtio_scsi_handle_ctrl(VirtIODevice *vdev, VirtQueue *vq)
586cba
 {
586cba
     VirtIOSCSI *s = (VirtIOSCSI *)vdev;
586cba
 
586cba
-    if (s->ctx) {
586cba
-        virtio_device_start_ioeventfd(vdev);
586cba
-        if (!s->dataplane_fenced) {
586cba
-            return;
586cba
-        }
586cba
+    if (virtio_scsi_defer_to_dataplane(s)) {
586cba
+        return;
586cba
     }
586cba
+
586cba
     virtio_scsi_acquire(s);
586cba
     virtio_scsi_handle_ctrl_vq(s, vq);
586cba
     virtio_scsi_release(s);
586cba
@@ -720,12 +736,10 @@ static void virtio_scsi_handle_cmd(VirtIODevice *vdev, VirtQueue *vq)
586cba
     /* use non-QOM casts in the data path */
586cba
     VirtIOSCSI *s = (VirtIOSCSI *)vdev;
586cba
 
586cba
-    if (s->ctx && !s->dataplane_started) {
586cba
-        virtio_device_start_ioeventfd(vdev);
586cba
-        if (!s->dataplane_fenced) {
586cba
-            return;
586cba
-        }
586cba
+    if (virtio_scsi_defer_to_dataplane(s)) {
586cba
+        return;
586cba
     }
586cba
+
586cba
     virtio_scsi_acquire(s);
586cba
     virtio_scsi_handle_cmd_vq(s, vq);
586cba
     virtio_scsi_release(s);
586cba
@@ -855,12 +869,10 @@ static void virtio_scsi_handle_event(VirtIODevice *vdev, VirtQueue *vq)
586cba
 {
586cba
     VirtIOSCSI *s = VIRTIO_SCSI(vdev);
586cba
 
586cba
-    if (s->ctx) {
586cba
-        virtio_device_start_ioeventfd(vdev);
586cba
-        if (!s->dataplane_fenced) {
586cba
-            return;
586cba
-        }
586cba
+    if (virtio_scsi_defer_to_dataplane(s)) {
586cba
+        return;
586cba
     }
586cba
+
586cba
     virtio_scsi_acquire(s);
586cba
     virtio_scsi_handle_event_vq(s, vq);
586cba
     virtio_scsi_release(s);
586cba
-- 
586cba
2.31.1
586cba