From: Jason Wang <jasowang@redhat.com>
To: qemu-devel@nongnu.org, peter.maydell@linaro.org
Cc: Zhang Chen <chen.zhang@intel.com>, Rao Lei <lei.rao@intel.com>,
Jason Wang <jasowang@redhat.com>,
Li Zhijian <lizhijian@fujitsu.com>
Subject: [PATCH 6/8] net/filter: Optimize filter_send to coroutine
Date: Mon, 14 Feb 2022 11:57:39 +0800 [thread overview]
Message-ID: <20220214035741.70990-6-jasowang@redhat.com> (raw)
In-Reply-To: <20220214035741.70990-1-jasowang@redhat.com>
From: Rao Lei <lei.rao@intel.com>
This patch is to improve the logic of QEMU main thread sleep code in
qemu_chr_write_buffer() where it can be blocked and can't run other
coroutines during COLO IO stress test.
Our approach is to put filter_send() in a coroutine. In this way,
filter_send() will call qemu_coroutine_yield() in qemu_co_sleep_ns(),
so that it can be scheduled out and QEMU main thread has opportunity to
run other tasks.
Signed-off-by: Lei Rao <lei.rao@intel.com>
Signed-off-by: Zhang Chen <chen.zhang@intel.com>
Reviewed-by: Li Zhijian <lizhijian@fujitsu.com>
Reviewed-by: Zhang Chen <chen.zhang@intel.com>
Signed-off-by: Jason Wang <jasowang@redhat.com>
---
net/filter-mirror.c | 66 ++++++++++++++++++++++++++++++++++++---------
1 file changed, 53 insertions(+), 13 deletions(-)
diff --git a/net/filter-mirror.c b/net/filter-mirror.c
index f20240cc9f..34a63b5dbb 100644
--- a/net/filter-mirror.c
+++ b/net/filter-mirror.c
@@ -20,6 +20,7 @@
#include "chardev/char-fe.h"
#include "qemu/iov.h"
#include "qemu/sockets.h"
+#include "block/aio-wait.h"
#define TYPE_FILTER_MIRROR "filter-mirror"
typedef struct MirrorState MirrorState;
@@ -42,20 +43,21 @@ struct MirrorState {
bool vnet_hdr;
};
-static int filter_send(MirrorState *s,
- const struct iovec *iov,
- int iovcnt)
+typedef struct FilterSendCo {
+ MirrorState *s;
+ char *buf;
+ ssize_t size;
+ bool done;
+ int ret;
+} FilterSendCo;
+
+static int _filter_send(MirrorState *s,
+ char *buf,
+ ssize_t size)
{
NetFilterState *nf = NETFILTER(s);
int ret = 0;
- ssize_t size = 0;
uint32_t len = 0;
- char *buf;
-
- size = iov_size(iov, iovcnt);
- if (!size) {
- return 0;
- }
len = htonl(size);
ret = qemu_chr_fe_write_all(&s->chr_out, (uint8_t *)&len, sizeof(len));
@@ -80,10 +82,7 @@ static int filter_send(MirrorState *s,
}
}
- buf = g_malloc(size);
- iov_to_buf(iov, iovcnt, 0, buf, size);
ret = qemu_chr_fe_write_all(&s->chr_out, (uint8_t *)buf, size);
- g_free(buf);
if (ret != size) {
goto err;
}
@@ -94,6 +93,47 @@ err:
return ret < 0 ? ret : -EIO;
}
+static void coroutine_fn filter_send_co(void *opaque)
+{
+ FilterSendCo *data = opaque;
+
+ data->ret = _filter_send(data->s, data->buf, data->size);
+ data->done = true;
+ g_free(data->buf);
+ aio_wait_kick();
+}
+
+static int filter_send(MirrorState *s,
+ const struct iovec *iov,
+ int iovcnt)
+{
+ ssize_t size = iov_size(iov, iovcnt);
+ char *buf = NULL;
+
+ if (!size) {
+ return 0;
+ }
+
+ buf = g_malloc(size);
+ iov_to_buf(iov, iovcnt, 0, buf, size);
+
+ FilterSendCo data = {
+ .s = s,
+ .size = size,
+ .buf = buf,
+ .ret = 0,
+ };
+
+ Coroutine *co = qemu_coroutine_create(filter_send_co, &data);
+ qemu_coroutine_enter(co);
+
+ while (!data.done) {
+ aio_poll(qemu_get_aio_context(), true);
+ }
+
+ return data.ret;
+}
+
static void redirector_to_filter(NetFilterState *nf,
const uint8_t *buf,
int len)
--
2.32.0 (Apple Git-132)
next prev parent reply other threads:[~2022-02-14 4:03 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-02-14 3:57 [PATCH 1/8] hw/net/vmxnet3: Log guest-triggerable errors using LOG_GUEST_ERROR Jason Wang
2022-02-14 3:57 ` [PATCH 2/8] net/tap: Set return code on failure Jason Wang
2022-02-14 3:57 ` [PATCH 3/8] net: Fix uninitialized data usage Jason Wang
2022-02-14 3:57 ` [PATCH 4/8] net/colo-compare.c: Optimize compare order for performance Jason Wang
2022-02-14 3:57 ` [PATCH 5/8] net/colo-compare.c: Update the default value comments Jason Wang
2022-02-14 3:57 ` Jason Wang [this message]
2022-02-14 3:57 ` [PATCH 7/8] hw/net: e1000e: Clear ICR on read when using non MSI-X interrupts Jason Wang
2022-02-14 3:57 ` [PATCH 8/8] net/eth: Don't consider ESP to be an IPv6 option header Jason Wang
2022-02-14 3:59 ` [PATCH 1/8] hw/net/vmxnet3: Log guest-triggerable errors using LOG_GUEST_ERROR Jason Wang
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220214035741.70990-6-jasowang@redhat.com \
--to=jasowang@redhat.com \
--cc=chen.zhang@intel.com \
--cc=lei.rao@intel.com \
--cc=lizhijian@fujitsu.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).