All of lore.kernel.org
 help / color / mirror / Atom feed
From: Paolo Bonzini <pbonzini@redhat.com>
To: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Cc: qemu-devel@nongnu.org, kwolf@redhat.com, famz@redhat.com,
	stefanha@redhat.com
Subject: Re: [Qemu-devel] [PATCH 02/20] blockjob: introduce .drain callback for jobs
Date: Sat, 3 Dec 2016 04:12:30 -0500 (EST)	[thread overview]
Message-ID: <350060616.1292696.1480756350395.JavaMail.zimbra@redhat.com> (raw)
In-Reply-To: <6f169bc2-257e-a627-8344-e5c37743ac69@virtuozzo.com>



----- Original Message -----
> From: "Vladimir Sementsov-Ogievskiy" <vsementsov@virtuozzo.com>
> To: "Paolo Bonzini" <pbonzini@redhat.com>, qemu-devel@nongnu.org
> Cc: kwolf@redhat.com, famz@redhat.com, stefanha@redhat.com
> Sent: Friday, December 2, 2016 3:01:30 PM
> Subject: Re: [Qemu-devel] [PATCH 02/20] blockjob: introduce .drain callback for jobs
> 
> 27.10.2016 13:48, Paolo Bonzini wrote:
> > This is required to decouple block jobs from running in an
> > AioContext.  With multiqueue block devices, a BlockDriverState
> > does not really belong to a single AioContext.
> >
> > The solution is to first wait until all I/O operations are
> > complete; then loop in the main thread for the block job to
> > complete entirely.
>
> Looks like I have a problem with this. block_job_drain enters the job
> only if job.busy = false. But what if job yielded with busy = true?
> 
> My case is the following: in the job I call co_aio_sleep_ns() for some
> time without setting job.busy to false, and it looks like timer doesn't
> work while we are in "while() { block_job_drain() }" loop. If I just set
> "job.busy = false" and "job.busy = true" around co_aio_sleep_ns() all
> start to work.
> 
> I don't want set job.busy to false, because actually job is working -
> several additional coroutines do their work, only the main one (job.co)
> do nothing. I can remove timer, and make other coroutines wake up the
> main one when it needed, and, anyway it looks like better way..
> 
> But the question is: is it ok, that we can't use sleep timer in the job,
> without setting busy = true? Is it right that only io can wake up block
> job coroutine, if it yielded without setting busy=false?

That's more or less correct.  See for example mirror.c.  Whenever it yields
with busy=false, mirror_write_complete will wake the coroutine.

Note that it's also okay to use co_aio_sleep_ns if I/O and _also_ wake the
coroutine on I/O.  Reentering a coroutine automatically interrupts the sleep.

Paolo

> > +    while (!job->deferred_to_main_loop && !job->completed) {
> > +        block_job_drain(job);
> > +    }
> >       while (!job->completed) {
> > -        aio_poll(block_job_get_aio_context(job), true);
> > +        aio_poll(qemu_get_aio_context(), true);
> >       }
> >       ret = (job->cancelled && job->ret == 0) ? -ECANCELED : job->ret;
> >       block_job_unref(job);
> >
> 
> 
> --
> Best regards,
> Vladimir
> 
> 

  reply	other threads:[~2016-12-03  9:12 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-10-27 10:48 [Qemu-devel] [PATCH v3 00/20] dataplane: remove RFifoLock Paolo Bonzini
2016-10-27 10:48 ` [Qemu-devel] [PATCH 01/20] replication: interrupt failover if the main device is closed Paolo Bonzini
2016-10-27 10:48 ` [Qemu-devel] [PATCH 02/20] blockjob: introduce .drain callback for jobs Paolo Bonzini
2016-12-02 14:01   ` Vladimir Sementsov-Ogievskiy
2016-12-03  9:12     ` Paolo Bonzini [this message]
2016-10-27 10:48 ` [Qemu-devel] [PATCH 03/20] mirror: use bdrv_drained_begin/bdrv_drained_end Paolo Bonzini
2016-10-27 10:48 ` [Qemu-devel] [PATCH 04/20] block: add BDS field to count in-flight requests Paolo Bonzini
2016-10-27 10:48 ` [Qemu-devel] [PATCH 05/20] block: change drain to look only at one child at a time Paolo Bonzini
2016-10-27 10:48 ` [Qemu-devel] [PATCH 06/20] qed: Implement .bdrv_drain Paolo Bonzini
2016-10-27 10:48 ` [Qemu-devel] [PATCH 07/20] block: introduce BDRV_POLL_WHILE Paolo Bonzini
2016-10-27 10:48 ` [Qemu-devel] [PATCH 08/20] nfs: move nfs_set_events out of the while loops Paolo Bonzini
2016-10-27 10:48 ` [Qemu-devel] [PATCH 09/20] nfs: use BDRV_POLL_WHILE Paolo Bonzini
2016-10-27 10:48 ` [Qemu-devel] [PATCH 10/20] sheepdog: " Paolo Bonzini
2016-10-27 10:48 ` [Qemu-devel] [PATCH 11/20] aio: introduce qemu_get_current_aio_context Paolo Bonzini
2016-10-27 10:49 ` [Qemu-devel] [PATCH 12/20] iothread: detach all block devices before stopping them Paolo Bonzini
2016-10-27 10:49 ` [Qemu-devel] [PATCH 13/20] replication: pass BlockDriverState to reopen_backing_file Paolo Bonzini
2016-10-27 10:49 ` [Qemu-devel] [PATCH 14/20] block: prepare bdrv_reopen_multiple to release AioContext Paolo Bonzini
2016-10-27 10:49 ` [Qemu-devel] [PATCH 15/20] qemu-io: acquire AioContext Paolo Bonzini
2016-10-27 10:49 ` [Qemu-devel] [PATCH 16/20] qemu-img: call aio_context_acquire/release around block job Paolo Bonzini
2016-10-27 10:49 ` [Qemu-devel] [PATCH 17/20] block: only call aio_poll on the current thread's AioContext Paolo Bonzini
2016-10-27 10:49 ` [Qemu-devel] [PATCH 18/20] iothread: release AioContext around aio_poll Paolo Bonzini
2016-10-27 10:49 ` [Qemu-devel] [PATCH 19/20] qemu-thread: introduce QemuRecMutex Paolo Bonzini
2016-10-27 10:49 ` [Qemu-devel] [PATCH 20/20] aio: convert from RFifoLock to QemuRecMutex Paolo Bonzini
2016-10-28 13:47 ` [Qemu-devel] [PATCH v3 00/20] dataplane: remove RFifoLock Fam Zheng
  -- strict thread matches above, loose matches on Subject: below --
2016-10-17 13:54 [Qemu-devel] [PATCH v2 " Paolo Bonzini
2016-10-17 13:54 ` [Qemu-devel] [PATCH 02/20] blockjob: introduce .drain callback for jobs Paolo Bonzini

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=350060616.1292696.1480756350395.JavaMail.zimbra@redhat.com \
    --to=pbonzini@redhat.com \
    --cc=famz@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=stefanha@redhat.com \
    --cc=vsementsov@virtuozzo.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.