|
|
7f1c5b |
From 0c19fb7c4a22a30830152b224b2e66963f829a7a Mon Sep 17 00:00:00 2001
|
|
|
7f1c5b |
From: Greg Kurz <groug@kaod.org>
|
|
|
7f1c5b |
Date: Thu, 19 Jan 2023 18:24:24 +0100
|
|
|
7f1c5b |
Subject: [PATCH 19/20] Revert "vhost-user: Introduce nested event loop in
|
|
|
7f1c5b |
vhost_user_read()"
|
|
|
7f1c5b |
MIME-Version: 1.0
|
|
|
7f1c5b |
Content-Type: text/plain; charset=UTF-8
|
|
|
7f1c5b |
Content-Transfer-Encoding: 8bit
|
|
|
7f1c5b |
|
|
|
7f1c5b |
RH-Author: Laurent Vivier <lvivier@redhat.com>
|
|
|
7f1c5b |
RH-MergeRequest: 146: Fix vhost-user with dpdk
|
|
|
7f1c5b |
RH-Bugzilla: 2155173
|
|
|
7f1c5b |
RH-Acked-by: Cindy Lu <lulu@redhat.com>
|
|
|
7f1c5b |
RH-Acked-by: Greg Kurz (RH) <gkurz@redhat.com>
|
|
|
7f1c5b |
RH-Acked-by: Eugenio PĂ©rez <eperezma@redhat.com>
|
|
|
7f1c5b |
RH-Commit: [2/2] 9b67041f92f29f70b7ccb41d8087801e4e4e38af (lvivier/qemu-kvm-centos)
|
|
|
7f1c5b |
|
|
|
7f1c5b |
This reverts commit a7f523c7d114d445c5d83aecdba3efc038e5a692.
|
|
|
7f1c5b |
|
|
|
7f1c5b |
The nested event loop is broken by design. It's only user was removed.
|
|
|
7f1c5b |
Drop the code as well so that nobody ever tries to use it again.
|
|
|
7f1c5b |
|
|
|
7f1c5b |
I had to fix a couple of trivial conflicts around return values because
|
|
|
7f1c5b |
of 025faa872bcf ("vhost-user: stick to -errno error return convention").
|
|
|
7f1c5b |
|
|
|
7f1c5b |
Signed-off-by: Greg Kurz <groug@kaod.org>
|
|
|
7f1c5b |
Message-Id: <20230119172424.478268-3-groug@kaod.org>
|
|
|
7f1c5b |
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
|
|
|
7f1c5b |
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
|
|
|
7f1c5b |
Acked-by: Maxime Coquelin <maxime.coquelin@redhat.com>
|
|
|
7f1c5b |
(cherry picked from commit 4382138f642f69fdbc79ebf4e93d84be8061191f)
|
|
|
7f1c5b |
Signed-off-by: Laurent Vivier <lvivier@redhat.com>
|
|
|
7f1c5b |
---
|
|
|
7f1c5b |
hw/virtio/vhost-user.c | 65 ++++--------------------------------------
|
|
|
7f1c5b |
1 file changed, 5 insertions(+), 60 deletions(-)
|
|
|
7f1c5b |
|
|
|
7f1c5b |
diff --git a/hw/virtio/vhost-user.c b/hw/virtio/vhost-user.c
|
|
|
7f1c5b |
index 0ac00eb901..7cb49c50f9 100644
|
|
|
7f1c5b |
--- a/hw/virtio/vhost-user.c
|
|
|
7f1c5b |
+++ b/hw/virtio/vhost-user.c
|
|
|
7f1c5b |
@@ -305,19 +305,8 @@ static int vhost_user_read_header(struct vhost_dev *dev, VhostUserMsg *msg)
|
|
|
7f1c5b |
return 0;
|
|
|
7f1c5b |
}
|
|
|
7f1c5b |
|
|
|
7f1c5b |
-struct vhost_user_read_cb_data {
|
|
|
7f1c5b |
- struct vhost_dev *dev;
|
|
|
7f1c5b |
- VhostUserMsg *msg;
|
|
|
7f1c5b |
- GMainLoop *loop;
|
|
|
7f1c5b |
- int ret;
|
|
|
7f1c5b |
-};
|
|
|
7f1c5b |
-
|
|
|
7f1c5b |
-static gboolean vhost_user_read_cb(void *do_not_use, GIOCondition condition,
|
|
|
7f1c5b |
- gpointer opaque)
|
|
|
7f1c5b |
+static int vhost_user_read(struct vhost_dev *dev, VhostUserMsg *msg)
|
|
|
7f1c5b |
{
|
|
|
7f1c5b |
- struct vhost_user_read_cb_data *data = opaque;
|
|
|
7f1c5b |
- struct vhost_dev *dev = data->dev;
|
|
|
7f1c5b |
- VhostUserMsg *msg = data->msg;
|
|
|
7f1c5b |
struct vhost_user *u = dev->opaque;
|
|
|
7f1c5b |
CharBackend *chr = u->user->chr;
|
|
|
7f1c5b |
uint8_t *p = (uint8_t *) msg;
|
|
|
7f1c5b |
@@ -325,8 +314,7 @@ static gboolean vhost_user_read_cb(void *do_not_use, GIOCondition condition,
|
|
|
7f1c5b |
|
|
|
7f1c5b |
r = vhost_user_read_header(dev, msg);
|
|
|
7f1c5b |
if (r < 0) {
|
|
|
7f1c5b |
- data->ret = r;
|
|
|
7f1c5b |
- goto end;
|
|
|
7f1c5b |
+ return r;
|
|
|
7f1c5b |
}
|
|
|
7f1c5b |
|
|
|
7f1c5b |
/* validate message size is sane */
|
|
|
7f1c5b |
@@ -334,8 +322,7 @@ static gboolean vhost_user_read_cb(void *do_not_use, GIOCondition condition,
|
|
|
7f1c5b |
error_report("Failed to read msg header."
|
|
|
7f1c5b |
" Size %d exceeds the maximum %zu.", msg->hdr.size,
|
|
|
7f1c5b |
VHOST_USER_PAYLOAD_SIZE);
|
|
|
7f1c5b |
- data->ret = -EPROTO;
|
|
|
7f1c5b |
- goto end;
|
|
|
7f1c5b |
+ return -EPROTO;
|
|
|
7f1c5b |
}
|
|
|
7f1c5b |
|
|
|
7f1c5b |
if (msg->hdr.size) {
|
|
|
7f1c5b |
@@ -346,53 +333,11 @@ static gboolean vhost_user_read_cb(void *do_not_use, GIOCondition condition,
|
|
|
7f1c5b |
int saved_errno = errno;
|
|
|
7f1c5b |
error_report("Failed to read msg payload."
|
|
|
7f1c5b |
" Read %d instead of %d.", r, msg->hdr.size);
|
|
|
7f1c5b |
- data->ret = r < 0 ? -saved_errno : -EIO;
|
|
|
7f1c5b |
- goto end;
|
|
|
7f1c5b |
+ return r < 0 ? -saved_errno : -EIO;
|
|
|
7f1c5b |
}
|
|
|
7f1c5b |
}
|
|
|
7f1c5b |
|
|
|
7f1c5b |
-end:
|
|
|
7f1c5b |
- g_main_loop_quit(data->loop);
|
|
|
7f1c5b |
- return G_SOURCE_REMOVE;
|
|
|
7f1c5b |
-}
|
|
|
7f1c5b |
-
|
|
|
7f1c5b |
-static int vhost_user_read(struct vhost_dev *dev, VhostUserMsg *msg)
|
|
|
7f1c5b |
-{
|
|
|
7f1c5b |
- struct vhost_user *u = dev->opaque;
|
|
|
7f1c5b |
- CharBackend *chr = u->user->chr;
|
|
|
7f1c5b |
- GMainContext *prev_ctxt = chr->chr->gcontext;
|
|
|
7f1c5b |
- GMainContext *ctxt = g_main_context_new();
|
|
|
7f1c5b |
- GMainLoop *loop = g_main_loop_new(ctxt, FALSE);
|
|
|
7f1c5b |
- struct vhost_user_read_cb_data data = {
|
|
|
7f1c5b |
- .dev = dev,
|
|
|
7f1c5b |
- .loop = loop,
|
|
|
7f1c5b |
- .msg = msg,
|
|
|
7f1c5b |
- .ret = 0
|
|
|
7f1c5b |
- };
|
|
|
7f1c5b |
-
|
|
|
7f1c5b |
- /*
|
|
|
7f1c5b |
- * We want to be able to monitor the slave channel fd while waiting
|
|
|
7f1c5b |
- * for chr I/O. This requires an event loop, but we can't nest the
|
|
|
7f1c5b |
- * one to which chr is currently attached : its fd handlers might not
|
|
|
7f1c5b |
- * be prepared for re-entrancy. So we create a new one and switch chr
|
|
|
7f1c5b |
- * to use it.
|
|
|
7f1c5b |
- */
|
|
|
7f1c5b |
- qemu_chr_be_update_read_handlers(chr->chr, ctxt);
|
|
|
7f1c5b |
- qemu_chr_fe_add_watch(chr, G_IO_IN | G_IO_HUP, vhost_user_read_cb, &data);
|
|
|
7f1c5b |
-
|
|
|
7f1c5b |
- g_main_loop_run(loop);
|
|
|
7f1c5b |
-
|
|
|
7f1c5b |
- /*
|
|
|
7f1c5b |
- * Restore the previous event loop context. This also destroys/recreates
|
|
|
7f1c5b |
- * event sources : this guarantees that all pending events in the original
|
|
|
7f1c5b |
- * context that have been processed by the nested loop are purged.
|
|
|
7f1c5b |
- */
|
|
|
7f1c5b |
- qemu_chr_be_update_read_handlers(chr->chr, prev_ctxt);
|
|
|
7f1c5b |
-
|
|
|
7f1c5b |
- g_main_loop_unref(loop);
|
|
|
7f1c5b |
- g_main_context_unref(ctxt);
|
|
|
7f1c5b |
-
|
|
|
7f1c5b |
- return data.ret;
|
|
|
7f1c5b |
+ return 0;
|
|
|
7f1c5b |
}
|
|
|
7f1c5b |
|
|
|
7f1c5b |
static int process_message_reply(struct vhost_dev *dev,
|
|
|
7f1c5b |
--
|
|
|
7f1c5b |
2.31.1
|
|
|
7f1c5b |
|