From: Wenchao Xia <xiawenc@linux.vnet.ibm.com>
To: Stefan Hajnoczi <stefanha@redhat.com>
Cc: Kevin Wolf <kwolf@redhat.com>, Fam Zheng <famz@redhat.com>,
qemu-devel@nongnu.org, imain@redhat.com,
Paolo Bonzini <pbonzini@redhat.com>,
dietmar@proxmox.com
Subject: Re: [Qemu-devel] [PATCH v3 2/8] block: add basic backup support to block driver
Date: Thu, 16 May 2013 11:27:38 +0800 [thread overview]
Message-ID: <5194522A.3010101@linux.vnet.ibm.com> (raw)
In-Reply-To: <1368628476-19622-3-git-send-email-stefanha@redhat.com>
> From: Dietmar Maurer <dietmar@proxmox.com>
>
> backup_start() creates a block job that copies a point-in-time snapshot
> of a block device to a target block device.
>
> We call backup_do_cow() for each write during backup. That function
> reads the original data from the block device before it gets
> overwritten. The data is then written to the target device.
>
> Currently backup cluster size is hardcoded to 65536 bytes.
>
> [I made a number of changes to Dietmar's original patch and folded them
> in to make code review easy. Here is the full list:
>
> * Drop BackupDumpFunc interface in favor of a target block device
> * Detect zero clusters with buffer_is_zero()
> * Don't write zero clusters to the target
> * Use 0 delay instead of 1us, like other block jobs
> * Unify creation/start functions into backup_start()
> * Simplify cleanup, free bitmap in backup_run() instead of cb
> * function
> * Use HBitmap to avoid duplicating bitmap code
> * Use bdrv_getlength() instead of accessing ->total_sectors
> * directly
> * Delete the backup.h header file, it is no longer necessary
> * Move ./backup.c to block/backup.c
> * Remove #ifdefed out code
> * Coding style and whitespace cleanups
> * Use bdrv_add_before_write_cb() instead of blockjob-specific hooks
> * Keep our own in-flight CowRequest list instead of using block.c
> tracked requests
>
> -- stefanha]
>
> Signed-off-by: Dietmar Maurer <dietmar@proxmox.com>
> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
> ---
> block/Makefile.objs | 1 +
> block/backup.c | 282 ++++++++++++++++++++++++++++++++++++++++++++++
> include/block/block_int.h | 16 +++
> 3 files changed, 299 insertions(+)
> create mode 100644 block/backup.c
>
> diff --git a/block/Makefile.objs b/block/Makefile.objs
> index 5f0358a..88bd101 100644
> --- a/block/Makefile.objs
> +++ b/block/Makefile.objs
> @@ -20,5 +20,6 @@ endif
> common-obj-y += stream.o
> common-obj-y += commit.o
> common-obj-y += mirror.o
> +common-obj-y += backup.o
>
> $(obj)/curl.o: QEMU_CFLAGS+=$(CURL_CFLAGS)
> diff --git a/block/backup.c b/block/backup.c
> new file mode 100644
> index 0000000..01d2fd3
> --- /dev/null
> +++ b/block/backup.c
> @@ -0,0 +1,282 @@
> +/*
> + * QEMU backup
> + *
> + * Copyright (C) 2013 Proxmox Server Solutions
> + *
> + * Authors:
> + * Dietmar Maurer (dietmar@proxmox.com)
> + *
> + * This work is licensed under the terms of the GNU GPL, version 2 or later.
> + * See the COPYING file in the top-level directory.
> + *
> + */
> +
> +#include <stdio.h>
> +#include <errno.h>
> +#include <unistd.h>
> +
> +#include "block/block.h"
> +#include "block/block_int.h"
> +#include "block/blockjob.h"
> +#include "qemu/ratelimit.h"
> +
> +#define DEBUG_BACKUP 0
> +
> +#define DPRINTF(fmt, ...) \
> + do { \
> + if (DEBUG_BACKUP) { \
> + fprintf(stderr, "backup: " fmt, ## __VA_ARGS__); \
> + } \
> + } while (0)
> +
> +#define BACKUP_CLUSTER_BITS 16
> +#define BACKUP_CLUSTER_SIZE (1 << BACKUP_CLUSTER_BITS)
> +#define BACKUP_BLOCKS_PER_CLUSTER (BACKUP_CLUSTER_SIZE / BDRV_SECTOR_SIZE)
> +
> +#define SLICE_TIME 100000000ULL /* ns */
> +
> +typedef struct CowRequest {
> + int64_t start;
> + int64_t end;
> + QLIST_ENTRY(CowRequest) list;
> + CoQueue wait_queue; /* coroutines blocked on this request */
> +} CowRequest;
> +
> +typedef struct BackupBlockJob {
> + BlockJob common;
> + BlockDriverState *target;
> + RateLimit limit;
> + CoRwlock flush_rwlock;
> + uint64_t sectors_read;
> + HBitmap *bitmap;
> + QLIST_HEAD(, CowRequest) inflight_reqs;
> +} BackupBlockJob;
> +
> +/* See if in-flight requests overlap and wait for them to complete */
> +static void coroutine_fn wait_for_overlapping_requests(BackupBlockJob *job,
> + int64_t start,
> + int64_t end)
> +{
> + CowRequest *req;
> + bool retry;
> +
> + do {
> + retry = false;
> + QLIST_FOREACH(req, &job->inflight_reqs, list) {
> + if (end > req->start && start < req->end) {
> + qemu_co_queue_wait(&req->wait_queue);
> + retry = true;
> + break;
> + }
> + }
> + } while (retry);
> +}
> +
In my understanding, there will be possible two program routines entering
here at same time since it holds read lock instead of write lock, and
they may also modify job->inflight_reqs, is it possible a race
condition here? I am not sure whether back-ground job will becomes a
thread.
--
Best Regards
Wenchao Xia
next prev parent reply other threads:[~2013-05-16 3:28 UTC|newest]
Thread overview: 55+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-05-15 14:34 [Qemu-devel] [PATCH v3 0/8] block: drive-backup live backup command Stefan Hajnoczi
2013-05-15 14:34 ` [Qemu-devel] [PATCH v3 1/8] block: add bdrv_add_before_write_cb() Stefan Hajnoczi
2013-05-15 14:42 ` Paolo Bonzini
2013-05-16 2:42 ` Wenchao Xia
2013-05-16 8:11 ` Stefan Hajnoczi
2013-05-15 14:34 ` [Qemu-devel] [PATCH v3 2/8] block: add basic backup support to block driver Stefan Hajnoczi
2013-05-16 3:27 ` Wenchao Xia [this message]
2013-05-16 7:30 ` Stefan Hajnoczi
2013-05-20 11:30 ` Paolo Bonzini
2013-05-21 13:34 ` Stefan Hajnoczi
2013-05-21 15:11 ` Paolo Bonzini
2013-05-21 15:25 ` Dietmar Maurer
2013-05-21 15:35 ` Paolo Bonzini
2013-05-21 15:54 ` Dietmar Maurer
2013-05-21 16:03 ` Paolo Bonzini
2013-05-21 16:15 ` Dietmar Maurer
2013-05-21 16:26 ` Dietmar Maurer
2013-05-21 16:46 ` Paolo Bonzini
2013-05-22 13:37 ` Stefan Hajnoczi
2013-05-15 14:34 ` [Qemu-devel] [PATCH v3 3/8] block: add drive-backup QMP command Stefan Hajnoczi
2013-05-15 19:04 ` Eric Blake
2013-05-16 7:31 ` Stefan Hajnoczi
2013-05-15 14:34 ` [Qemu-devel] [PATCH v3 4/8] qemu-iotests: add 055 drive-backup test case Stefan Hajnoczi
2013-05-15 14:34 ` [Qemu-devel] [PATCH v3 5/8] blockdev: rename BlkTransactionStates to singular Stefan Hajnoczi
2013-05-15 19:09 ` Eric Blake
2013-05-16 2:28 ` Wenchao Xia
2013-05-15 14:34 ` [Qemu-devel] [PATCH v3 6/8] blockdev: add DriveBackup transaction Stefan Hajnoczi
2013-05-15 19:13 ` Eric Blake
2013-05-16 7:36 ` Stefan Hajnoczi
2013-05-15 14:34 ` [Qemu-devel] [PATCH v3 7/8] blockdev: add Abort transaction Stefan Hajnoczi
2013-05-15 19:01 ` Eric Blake
2013-05-16 2:26 ` Wenchao Xia
2013-05-16 7:37 ` Stefan Hajnoczi
2013-05-15 14:34 ` [Qemu-devel] [PATCH v3 8/8] qemu-iotests: test 'drive-backup' transaction in 055 Stefan Hajnoczi
2013-05-16 6:16 ` [Qemu-devel] [PATCH v3 0/8] block: drive-backup live backup command Wenchao Xia
2013-05-16 7:47 ` Stefan Hajnoczi
2013-05-17 6:58 ` Wenchao Xia
2013-05-17 9:14 ` Stefan Hajnoczi
2013-05-21 3:25 ` Wenchao Xia
2013-05-21 7:34 ` Stefan Hajnoczi
2013-05-17 10:17 ` Paolo Bonzini
2013-05-20 6:24 ` Stefan Hajnoczi
2013-05-20 7:23 ` Paolo Bonzini
2013-05-21 7:31 ` Stefan Hajnoczi
2013-05-21 8:30 ` Paolo Bonzini
2013-05-21 10:34 ` Stefan Hajnoczi
2013-05-21 10:36 ` Paolo Bonzini
2013-05-21 10:58 ` Dietmar Maurer
2013-05-22 13:43 ` Stefan Hajnoczi
2013-05-22 15:10 ` Dietmar Maurer
2013-05-22 15:34 ` Dietmar Maurer
2013-05-23 8:04 ` Stefan Hajnoczi
2013-05-23 8:11 ` Dietmar Maurer
2013-05-24 8:38 ` Stefan Hajnoczi
2013-05-24 9:53 ` Dietmar Maurer
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=5194522A.3010101@linux.vnet.ibm.com \
--to=xiawenc@linux.vnet.ibm.com \
--cc=dietmar@proxmox.com \
--cc=famz@redhat.com \
--cc=imain@redhat.com \
--cc=kwolf@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@redhat.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 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).