qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Stefan Hajnoczi <stefanha@redhat.com>
To: qemu-devel@nongnu.org
Cc: Peter Maydell <peter.maydell@linaro.org>,
	Stefan Hajnoczi <stefanha@redhat.com>
Subject: [Qemu-devel] [PULL 20/20] backup: follow AioContext change gracefully
Date: Mon, 20 Jun 2016 15:05:31 +0100	[thread overview]
Message-ID: <1466431531-17806-21-git-send-email-stefanha@redhat.com> (raw)
In-Reply-To: <1466431531-17806-1-git-send-email-stefanha@redhat.com>

Move s->target to the new AioContext when there is an AioContext change.

The backup_run() coroutine does not use asynchronous I/O so there is no
need to wait for in-flight requests in a BlockJobDriver->pause()
callback.

Guest writes are intercepted by the backup job.  Treat them as guest
activity and do it even while the job is paused.  This is necessary
since the only alternative would be to fail a job that experienced guest
writes during pause once the job is resumed.  In practice the guest
writes don't interfere with AioContext switching since bdrv_drain() is
used by bdrv_set_aio_context().

Loops already contain pause points because of block_job_sleep_ns() calls
in the yield_and_check() helper function.  It is necessary to convert a
raw qemu_coroutine_yield() to block_job_yield() so the
MIRROR_SYNC_MODE_NONE case can pause.

Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Reviewed-by: Fam Zheng <famz@redhat.com>
Message-id: 1466096189-6477-9-git-send-email-stefanha@redhat.com
---
 block/backup.c | 22 ++++++++++++++--------
 1 file changed, 14 insertions(+), 8 deletions(-)

diff --git a/block/backup.c b/block/backup.c
index feeb9f8..581269b 100644
--- a/block/backup.c
+++ b/block/backup.c
@@ -246,12 +246,20 @@ static void backup_abort(BlockJob *job)
     }
 }
 
+static void backup_attached_aio_context(BlockJob *job, AioContext *aio_context)
+{
+    BackupBlockJob *s = container_of(job, BackupBlockJob, common);
+
+    blk_set_aio_context(s->target, aio_context);
+}
+
 static const BlockJobDriver backup_job_driver = {
-    .instance_size  = sizeof(BackupBlockJob),
-    .job_type       = BLOCK_JOB_TYPE_BACKUP,
-    .set_speed      = backup_set_speed,
-    .commit         = backup_commit,
-    .abort          = backup_abort,
+    .instance_size          = sizeof(BackupBlockJob),
+    .job_type               = BLOCK_JOB_TYPE_BACKUP,
+    .set_speed              = backup_set_speed,
+    .commit                 = backup_commit,
+    .abort                  = backup_abort,
+    .attached_aio_context   = backup_attached_aio_context,
 };
 
 static BlockErrorAction backup_error_action(BackupBlockJob *job,
@@ -392,9 +400,7 @@ static void coroutine_fn backup_run(void *opaque)
         while (!block_job_is_cancelled(&job->common)) {
             /* Yield until the job is cancelled.  We just let our before_write
              * notify callback service CoW requests. */
-            job->common.busy = false;
-            qemu_coroutine_yield();
-            job->common.busy = true;
+            block_job_yield(&job->common);
         }
     } else if (job->sync_mode == MIRROR_SYNC_MODE_INCREMENTAL) {
         ret = backup_run_incremental(job);
-- 
2.5.5

  parent reply	other threads:[~2016-06-20 14:06 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-06-20 14:05 [Qemu-devel] [PULL 00/20] Block patches Stefan Hajnoczi
2016-06-20 14:05 ` [Qemu-devel] [PULL 01/20] libqos: use virtio_ids.h for device ID definitions Stefan Hajnoczi
2016-06-20 14:05 ` [Qemu-devel] [PULL 02/20] libqos: drop duplicated PCI vendor ID definition Stefan Hajnoczi
2016-06-20 14:05 ` [Qemu-devel] [PULL 03/20] libqos: drop duplicated virtio_config.h definitions Stefan Hajnoczi
2016-06-20 14:05 ` [Qemu-devel] [PULL 04/20] libqos: drop duplicated virtio_ring.h bit definitions Stefan Hajnoczi
2016-06-20 14:05 ` [Qemu-devel] [PULL 05/20] libqos: drop duplicated virtio_vring.h structs Stefan Hajnoczi
2016-06-20 14:05 ` [Qemu-devel] [PULL 06/20] libqos: drop duplicated virtio_blk.h definitions Stefan Hajnoczi
2016-06-20 14:05 ` [Qemu-devel] [PULL 07/20] libqos: drop duplicated virtio_scsi.h definitions Stefan Hajnoczi
2016-06-20 14:05 ` [Qemu-devel] [PULL 08/20] libqos: drop duplicated virtio_pci.h definitions Stefan Hajnoczi
2016-06-20 14:05 ` [Qemu-devel] [PULL 09/20] libqos: add qvirtqueue_cleanup() Stefan Hajnoczi
2016-06-20 14:05 ` [Qemu-devel] [PULL 10/20] block: fixed BdrvTrackedRequest filling in bdrv_co_discard Stefan Hajnoczi
2016-06-20 14:05 ` [Qemu-devel] [PULL 11/20] block: fix race in bdrv_co_discard with drive-mirror Stefan Hajnoczi
2016-06-20 14:05 ` [Qemu-devel] [PULL 12/20] block: process before_write_notifiers in bdrv_co_discard Stefan Hajnoczi
2016-06-20 14:05 ` [Qemu-devel] [PULL 13/20] blockjob: move iostatus reset out of block_job_enter() Stefan Hajnoczi
2016-06-20 14:05 ` [Qemu-devel] [PULL 14/20] blockjob: rename block_job_is_paused() Stefan Hajnoczi
2016-06-20 14:05 ` [Qemu-devel] [PULL 15/20] blockjob: add pause points Stefan Hajnoczi
2016-06-20 14:05 ` [Qemu-devel] [PULL 16/20] blockjob: add block_job_get_aio_context() Stefan Hajnoczi
2016-06-20 14:05 ` [Qemu-devel] [PULL 17/20] block: use safe iteration over AioContext notifiers Stefan Hajnoczi
2016-06-20 14:05 ` [Qemu-devel] [PULL 18/20] blockjob: add AioContext attached callback Stefan Hajnoczi
2016-06-20 14:05 ` [Qemu-devel] [PULL 19/20] mirror: follow AioContext change gracefully Stefan Hajnoczi
2016-06-20 14:05 ` Stefan Hajnoczi [this message]
2016-06-20 17:08 ` [Qemu-devel] [PULL 00/20] Block patches Peter Maydell

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=1466431531-17806-21-git-send-email-stefanha@redhat.com \
    --to=stefanha@redhat.com \
    --cc=peter.maydell@linaro.org \
    --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).