[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 7/9] monitor: restrict response queue length too
From: |
Peter Xu |
Subject: |
[Qemu-devel] [PATCH 7/9] monitor: restrict response queue length too |
Date: |
Wed, 4 Jul 2018 16:45:05 +0800 |
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 <address@hidden>
Signed-off-by: Peter Xu <address@hidden>
---
monitor.c | 31 +++++++++++++++++++------------
1 file changed, 19 insertions(+), 12 deletions(-)
diff --git a/monitor.c b/monitor.c
index ebf862914f..9b78cf1c63 100644
--- a/monitor.c
+++ b/monitor.c
@@ -393,18 +393,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;
}
@@ -412,7 +409,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);
}
@@ -574,6 +578,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;
@@ -4289,12 +4295,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
- Re: [Qemu-devel] [PATCH 5/9] monitor: suspend monitor instead of send CMD_DROP, (continued)
- Re: [Qemu-devel] [PATCH 5/9] monitor: suspend monitor instead of send CMD_DROP, Markus Armbruster, 2018/07/06
- Re: [Qemu-devel] [PATCH 5/9] monitor: suspend monitor instead of send CMD_DROP, Peter Xu, 2018/07/06
- Re: [Qemu-devel] [PATCH 5/9] monitor: suspend monitor instead of send CMD_DROP, Markus Armbruster, 2018/07/06
- Re: [Qemu-devel] [PATCH 5/9] monitor: suspend monitor instead of send CMD_DROP, Peter Xu, 2018/07/10
- Re: [Qemu-devel] [PATCH 5/9] monitor: suspend monitor instead of send CMD_DROP, Markus Armbruster, 2018/07/12
- Re: [Qemu-devel] [PATCH 5/9] monitor: suspend monitor instead of send CMD_DROP, Markus Armbruster, 2018/07/12
[Qemu-devel] [PATCH 6/9] qapi: remove COMMAND_DROPPED event, Peter Xu, 2018/07/04
[Qemu-devel] [PATCH 7/9] monitor: restrict response queue length too,
Peter Xu <=
[Qemu-devel] [PATCH 8/9] monitor: remove "x-oob", turn oob on by default, Peter Xu, 2018/07/04
[Qemu-devel] [PATCH 9/9] Revert "tests: Add parameter to qtest_init_without_qmp_handshake", Peter Xu, 2018/07/04
Re: [Qemu-devel] [PATCH 0/9] monitor: enable OOB by default, Markus Armbruster, 2018/07/16