From: Peter Xu <peterx@redhat.com>
To: qemu-devel@nongnu.org
Cc: "Eric Blake" <eblake@redhat.com>,
"Marc-André Lureau" <marcandre.lureau@redhat.com>,
"Daniel P . Berrange" <berrange@redhat.com>,
"Markus Armbruster" <armbru@redhat.com>,
"Dr . David Alan Gilbert" <dgilbert@redhat.com>,
peterx@redhat.com
Subject: [Qemu-devel] [PATCH v6 07/13] monitor: restrict response queue length too
Date: Wed, 15 Aug 2018 21:37:41 +0800 [thread overview]
Message-ID: <20180815133747.25032-8-peterx@redhat.com> (raw)
In-Reply-To: <20180815133747.25032-1-peterx@redhat.com>
Before this patch we were only monitoring the request queue, but it's
still possible that a client only sends requests but it never eats any
reply from us. In that case our response queue might grow with
unlimited responses and put us at risk.
Now we play the similar trick as we have done to the request queue to
make sure we apply the same queue length rule to the response queue as
well. Then we also need to peek at the queue length after we unqueue a
response now, to make sure we'll kick the monitor to alive if it was
suspended due to "response queue full".
Reported-by: Markus Armbruster <armbru@redhat.com>
Signed-off-by: Peter Xu <peterx@redhat.com>
---
monitor.c | 31 +++++++++++++++++++------------
1 file changed, 19 insertions(+), 12 deletions(-)
diff --git a/monitor.c b/monitor.c
index 2fc480d75b..27e8dd85be 100644
--- a/monitor.c
+++ b/monitor.c
@@ -394,18 +394,15 @@ static void monitor_qmp_cleanup_queues(Monitor *mon)
qemu_mutex_unlock(&mon->qmp.qmp_lock);
}
-/* Try to resume the monitor if it was suspended due to any reason */
-static void monitor_qmp_try_resume(Monitor *mon)
+/* Callers must be with Monitor.qmp.qmp_lock held. */
+static void monitor_qmp_try_resume_locked(Monitor *mon)
{
- assert(monitor_is_qmp(mon));
- qemu_mutex_lock(&mon->qmp.qmp_lock);
-
- if (mon->qmp.qmp_requests->length >= QMP_REQ_QUEUE_LEN_MAX) {
+ if (mon->qmp.qmp_requests->length >= QMP_REQ_QUEUE_LEN_MAX ||
+ mon->qmp.qmp_responses->length >= QMP_REQ_QUEUE_LEN_MAX) {
/*
* This should not happen, but in case if it happens, we
* should still keep the monitor in suspend state
*/
- qemu_mutex_unlock(&mon->qmp.qmp_lock);
return;
}
@@ -413,7 +410,14 @@ static void monitor_qmp_try_resume(Monitor *mon)
monitor_resume(mon);
mon->qmp.need_resume = false;
}
+}
+/* Try to resume the monitor if it was suspended due to any reason */
+static void monitor_qmp_try_resume(Monitor *mon)
+{
+ assert(monitor_is_qmp(mon));
+ qemu_mutex_lock(&mon->qmp.qmp_lock);
+ monitor_qmp_try_resume_locked(mon);
qemu_mutex_unlock(&mon->qmp.qmp_lock);
}
@@ -575,6 +579,8 @@ static QDict *monitor_qmp_response_pop_one(Monitor *mon)
qemu_mutex_lock(&mon->qmp.qmp_lock);
data = g_queue_pop_head(mon->qmp.qmp_responses);
+ /* In case if we were suspended due to response queue full */
+ monitor_qmp_try_resume_locked(mon);
qemu_mutex_unlock(&mon->qmp.qmp_lock);
return data;
@@ -4330,12 +4336,13 @@ static void handle_qmp_command(JSONMessageParser *parser, GQueue *tokens)
monitor_qmp_suspend_locked(mon);
} else {
/*
- * If the queue is reaching the length limitation, we queue
- * this command, meanwhile we suspend the monitor to block new
- * commands. We'll resume ourselves until the queue has more
- * space.
+ * If any of the req/resp queue is reaching the length
+ * limitation, we queue this command, meanwhile we suspend the
+ * monitor to block new commands. We'll resume ourselves
+ * until both of the queues have more spaces.
*/
- if (mon->qmp.qmp_requests->length >= QMP_REQ_QUEUE_LEN_MAX - 1) {
+ if (mon->qmp.qmp_requests->length >= QMP_REQ_QUEUE_LEN_MAX - 1 ||
+ mon->qmp.qmp_responses->length >= QMP_REQ_QUEUE_LEN_MAX - 1) {
monitor_qmp_suspend_locked(mon);
}
}
--
2.17.1
next prev parent reply other threads:[~2018-08-15 13:38 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-08-15 13:37 [Qemu-devel] [PATCH v6 00/13] monitor: enable OOB by default Peter Xu
2018-08-15 13:37 ` [Qemu-devel] [PATCH v6 01/13] monitor: simplify monitor_qmp_setup_handlers_bh Peter Xu
2018-08-21 18:13 ` Marc-André Lureau
2018-08-22 4:38 ` Peter Xu
2018-08-27 11:29 ` Markus Armbruster
2018-08-28 3:26 ` Peter Xu
2018-08-15 13:37 ` [Qemu-devel] [PATCH v6 02/13] qapi: Fix build_params() for empty parameter list Peter Xu
2018-08-15 13:37 ` [Qemu-devel] [PATCH v6 03/13] qapi: remove error checks for event emission Peter Xu
2018-08-27 12:14 ` Markus Armbruster
2018-08-28 3:31 ` Peter Xu
2018-08-30 14:05 ` Markus Armbruster
2018-08-15 13:37 ` [Qemu-devel] [PATCH v6 04/13] monitor: move need_resume flag into monitor struct Peter Xu
2018-08-15 13:37 ` [Qemu-devel] [PATCH v6 05/13] monitor: suspend monitor instead of send CMD_DROP Peter Xu
2018-08-15 13:37 ` [Qemu-devel] [PATCH v6 06/13] qapi: remove COMMAND_DROPPED event Peter Xu
2018-08-27 19:30 ` Eric Blake
2018-08-28 3:38 ` Peter Xu
2018-08-15 13:37 ` Peter Xu [this message]
2018-08-15 13:37 ` [Qemu-devel] [PATCH v6 08/13] monitor: remove "x-oob", turn oob on by default Peter Xu
2018-08-15 13:37 ` [Qemu-devel] [PATCH v6 09/13] Revert "tests: Add parameter to qtest_init_without_qmp_handshake" Peter Xu
2018-08-15 13:37 ` [Qemu-devel] [PATCH v6 10/13] monitor: add traces for qmp queues Peter Xu
2018-08-15 13:37 ` [Qemu-devel] [PATCH v6 11/13] tests: remove "0.15" prefix for test-qmp-cmds Peter Xu
2018-08-15 13:48 ` Thomas Huth
2018-08-16 1:55 ` Peter Xu
2018-08-15 18:11 ` Marc-André Lureau
2018-08-16 1:51 ` Peter Xu
2018-08-16 7:20 ` Markus Armbruster
2018-08-15 13:37 ` [Qemu-devel] [PATCH v6 12/13] tests: add oob functional test " Peter Xu
2018-08-15 13:37 ` [Qemu-devel] [PATCH v6 13/13] monitor: reduce different code path for oob Peter Xu
2018-08-28 19:05 ` [Qemu-devel] [PATCH v6 00/13] monitor: enable OOB by default Markus Armbruster
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=20180815133747.25032-8-peterx@redhat.com \
--to=peterx@redhat.com \
--cc=armbru@redhat.com \
--cc=berrange@redhat.com \
--cc=dgilbert@redhat.com \
--cc=eblake@redhat.com \
--cc=marcandre.lureau@redhat.com \
--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).