[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v8 2/6] monitor: resume the monitor earlier if n
From: |
Marc-André Lureau |
Subject: |
Re: [Qemu-devel] [PATCH v8 2/6] monitor: resume the monitor earlier if needed |
Date: |
Fri, 28 Sep 2018 16:06:30 +0400 |
Hi
On Wed, Sep 5, 2018 at 10:24 AM Peter Xu <address@hidden> wrote:
>
> Currently when QMP request queue full we won't resume the monitor until
> we have completely handled the current command. It's not necessary
> since even before it's handled the queue is already non-full. Moving
> the resume logic earlier before the command execution, hence drop the
> need_resume local variable.
>
> Signed-off-by: Peter Xu <address@hidden>
> ---
> monitor.c | 12 +++++-------
> 1 file changed, 5 insertions(+), 7 deletions(-)
>
> diff --git a/monitor.c b/monitor.c
> index a89bb86599..c2c9853f75 100644
> --- a/monitor.c
> +++ b/monitor.c
> @@ -4130,7 +4130,6 @@ static void monitor_qmp_bh_dispatcher(void *data)
> {
> QMPRequest *req_obj = monitor_qmp_requests_pop_any_with_lock();
> QDict *rsp;
> - bool need_resume;
> Monitor *mon;
>
> if (!req_obj) {
> @@ -4139,8 +4138,11 @@ static void monitor_qmp_bh_dispatcher(void *data)
>
> mon = req_obj->mon;
> /* qmp_oob_enabled() might change after "qmp_capabilities" */
> - need_resume = !qmp_oob_enabled(mon) ||
> - mon->qmp.qmp_requests->length == QMP_REQ_QUEUE_LEN_MAX - 1;
> + if (!qmp_oob_enabled(mon) ||
> + mon->qmp.qmp_requests->length == QMP_REQ_QUEUE_LEN_MAX - 1) {
> + /* Pairs with the monitor_suspend() in handle_qmp_command() */
> + monitor_resume(mon);
> + }
With spice chardev, this may result in a synchronous write.
If I read it right, this may re-enter handle_qmp_command and dead-lock
on qemu_mutex_lock(&mon->qmp.qmp_queue_lock);
So at least I would release the lock before resuming :)
> qemu_mutex_unlock(&mon->qmp.qmp_queue_lock);
> if (req_obj->req) {
> trace_monitor_qmp_cmd_in_band(qobject_get_try_str(req_obj->id) ?:
> "");
> @@ -4153,10 +4155,6 @@ static void monitor_qmp_bh_dispatcher(void *data)
> qobject_unref(rsp);
> }
>
> - if (need_resume) {
> - /* Pairs with the monitor_suspend() in handle_qmp_command() */
> - monitor_resume(mon);
> - }
> qmp_request_free(req_obj);
>
> /* Reschedule instead of looping so the main loop stays responsive */
> --
> 2.17.1
>
>
--
Marc-André Lureau
- [Qemu-devel] [PATCH v8 0/6] monitor: enable OOB by default, Peter Xu, 2018/09/05
- [Qemu-devel] [PATCH v8 1/6] monitor: Suspend monitor instead dropping commands, Peter Xu, 2018/09/05
- [Qemu-devel] [PATCH v8 2/6] monitor: resume the monitor earlier if needed, Peter Xu, 2018/09/05
- Re: [Qemu-devel] [PATCH v8 2/6] monitor: resume the monitor earlier if needed,
Marc-André Lureau <=
- [Qemu-devel] [PATCH v8 4/6] Revert "tests: Add parameter to qtest_init_without_qmp_handshake", Peter Xu, 2018/09/05
- [Qemu-devel] [PATCH v8 5/6] tests: add oob functional test for test-qmp-cmds, Peter Xu, 2018/09/05
- [Qemu-devel] [PATCH v8 6/6] tests: qmp-test: add queue full test, Peter Xu, 2018/09/05
- [Qemu-devel] [PATCH v8 3/6] monitor: remove "x-oob", turn oob on by default, Peter Xu, 2018/09/05
- Re: [Qemu-devel] [PATCH v8 0/6] monitor: enable OOB by default, Peter Xu, 2018/09/28