From: Michael Roth <mdroth@linux.vnet.ibm.com>
To: Liu Yu <allanliuyu@gmail.com>, qemu-stable@nongnu.org
Cc: qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [Qemu-stable] [PATCH] stream: fix the deadlock bug when stream finish
Date: Wed, 27 Aug 2014 10:53:39 -0500 [thread overview]
Message-ID: <20140827155339.21832.73704@loki> (raw)
In-Reply-To: <53F80DC4.7030102@gmail.com>
Quoting Liu Yu (2014-08-22 22:43:00)
> From: Liu Yu <allanyuliu@tencent.com>
>
> The patch against branch stable-2.0
Hi Liu,
2.0.2 was the last planned released for stable-2.0. Are you still seeing this
issue with 2.1.0 or master? 2.1.1 is release is planned for September 9th so we
can work on getting this included there if it is.
Also, please Cc: qemu-devel@nongnu.org even for stable patches.
>
> In case VM does IO while we run a stream job.
> When stream finishes, the stream coroutine drains all IOs before
> close the unused image, in bdrv_drain_all() it may find
> a pending request which is submitted by guest IO coroutine.
> In order to wait the pending req finish, the subsequent aio_poll()
> call poll() to wait the req. however, if the req is already done by
> threadpool and is waiting for the callback, there is no chance to switch
> back to guest IO coroutine to call the callback and so that the stream
> coroutine waits in poll() all the time.
>
> The patch detects the deadlock case above and switch back to iothread
> coroutine to handle the callback, and work on the stream coroutine
> after the pending req get finished.
>
> Signed-off-by: Liu Yu <allanyuliu@tencent.com>
> ---
> the issue can be reproduced by
> 1. guest does fio test
> 2. while host runs virsh blockpull repeatedly
>
>
> block.c | 27 ++++++++++++++++++++++++++-
> 1 files changed, 26 insertions(+), 1 deletions(-)
>
> diff --git a/block.c b/block.c
> index 990a754..f8c1a8d 100644
> --- a/block.c
> +++ b/block.c
> @@ -1778,6 +1778,29 @@ static bool bdrv_requests_pending_all(void)
> return false;
> }
>
> +static bool bdrv_request_coroutine_wait(void)
> +{
> + BlockDriverState *bs;
> + Coroutine *co;
> +
> + if (!qemu_in_coroutine())
> + return false;
> +
> + co = qemu_coroutine_self();
> + QTAILQ_FOREACH(bs, &bdrv_states, device_list) {
> + if (!QLIST_EMPTY(&bs->tracked_requests)) {
> + BdrvTrackedRequest *req = QLIST_FIRST(&bs->tracked_requests);
> +
> + if(req->co == co)
> + continue;
> +
> + qemu_co_queue_wait(&req->wait_queue);
> + return true;
> + }
> + }
> + return false;
> +}
> +
> /*
> * Wait for pending requests to complete across all BlockDriverStates
> *
> @@ -1800,8 +1823,10 @@ void bdrv_drain_all(void)
> QTAILQ_FOREACH(bs, &bdrv_states, device_list) {
> bdrv_start_throttled_reqs(bs);
> }
> -
> +recheck:
> busy = bdrv_requests_pending_all();
> + if (busy && bdrv_request_coroutine_wait())
> + goto recheck;
> busy |= aio_poll(qemu_get_aio_context(), busy);
> }
> }
> --
> 1.7.1
next parent reply other threads:[~2014-08-27 15:54 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <53F80DC4.7030102@gmail.com>
2014-08-27 15:53 ` Michael Roth [this message]
2014-08-27 16:28 ` [Qemu-devel] [Qemu-stable] [PATCH] stream: fix the deadlock bug when stream finish Paolo Bonzini
2014-08-27 17:30 ` Michael Roth
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=20140827155339.21832.73704@loki \
--to=mdroth@linux.vnet.ibm.com \
--cc=allanliuyu@gmail.com \
--cc=qemu-devel@nongnu.org \
--cc=qemu-stable@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).