[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-block] [PATCH 21/21] backup: refactor: remove backup_do_cow()
From: |
Vladimir Sementsov-Ogievskiy |
Subject: |
[Qemu-block] [PATCH 21/21] backup: refactor: remove backup_do_cow() |
Date: |
Fri, 23 Dec 2016 17:29:04 +0300 |
Call backup_copy_cluster directly from backup_worker_co. Move io buffer
allocation to backup_worker_co (and do not reallocate it for each
cluster).
Signed-off-by: Vladimir Sementsov-Ogievskiy <address@hidden>
---
block/backup.c | 28 +++++++++-------------------
block/trace-events | 6 ++----
2 files changed, 11 insertions(+), 23 deletions(-)
diff --git a/block/backup.c b/block/backup.c
index b79a481..4a3a874 100644
--- a/block/backup.c
+++ b/block/backup.c
@@ -222,8 +222,6 @@ static void release_pending_notifiers(BackupBlockJob *job)
}
}
-static void coroutine_fn backup_do_cow(BackupBlockJob *job, int64_t cluster);
-
/* Size of a cluster in sectors, instead of bytes. */
static inline int64_t cluster_size_sectors(BackupBlockJob *job)
{
@@ -403,9 +401,14 @@ static inline int64_t backup_get_work(BackupBlockJob *job)
return cluster;
}
+static void coroutine_fn backup_copy_cluster(BackupBlockJob *job,
+ int64_t cluster,
+ void *bounce_buffer);
+
static void coroutine_fn backup_worker_co(void *opaque)
{
BackupBlockJob *job = opaque;
+ void *io_buf = blk_blockalign(job->common.blk, job->cluster_size);
job->running_workers++;
job->nb_busy_workers++;
@@ -424,12 +427,13 @@ static void coroutine_fn backup_worker_co(void *opaque)
trace_backup_worker_stop(qemu_coroutine_self(),
job->nb_busy_workers,
job->running_workers,
job->waiting_for_workers);
+ qemu_vfree(io_buf);
return;
case BACKUP_WORKER_PAUSE:
backup_worker_pause(job);
break;
default:
- backup_do_cow(job, cluster);
+ backup_copy_cluster(job, cluster, io_buf);
}
}
}
@@ -546,8 +550,7 @@ static void coroutine_fn backup_copy_cluster(BackupBlockJob
*job,
int64_t sectors_per_cluster = cluster_size_sectors(job);
int64_t offset = cluster * job->cluster_size;
- trace_backup_do_cow_process(job, cluster);
-
+ trace_backup_copy_cluster_enter(job, qemu_coroutine_self(), cluster);
n = MIN(sectors_per_cluster,
job->common.len / BDRV_SECTOR_SIZE -
cluster * sectors_per_cluster);
@@ -579,20 +582,7 @@ static void coroutine_fn
backup_copy_cluster(BackupBlockJob *job,
*/
job->sectors_read += n;
job->common.offset += n * BDRV_SECTOR_SIZE;
-}
-
-static void coroutine_fn backup_do_cow(BackupBlockJob *job, int64_t cluster)
-{
- BlockBackend *blk = job->common.blk;
- void *bounce_buffer;
-
- trace_backup_do_cow_enter(job, qemu_coroutine_self(), cluster);
-
- bounce_buffer = blk_blockalign(blk, job->cluster_size);
- backup_copy_cluster(job, cluster, bounce_buffer);
- qemu_vfree(bounce_buffer);
-
- trace_backup_do_cow_return(job, qemu_coroutine_self(), cluster);
+ trace_backup_copy_cluster_success(job, qemu_coroutine_self(), cluster);
}
static int coroutine_fn backup_before_write_notify(
diff --git a/block/trace-events b/block/trace-events
index 54cde28..770b407 100644
--- a/block/trace-events
+++ b/block/trace-events
@@ -40,10 +40,8 @@ mirror_yield_buf_busy(void *s, int nb_chunks, int in_flight)
"s %p requested chu
mirror_break_buf_busy(void *s, int nb_chunks, int in_flight) "s %p requested
chunks %d in_flight %d"
# block/backup.c
-backup_do_cow_enter(void *job, void *self, int64_t cluster) "job %p self %p
cluster %"PRId64
-backup_do_cow_return(void *job, void *self, int64_t cluster) "job %p self %p
cluster %"PRId64
-backup_do_cow_skip(void *job, int64_t cluster) "job %p cluster %"PRId64
-backup_do_cow_process(void *job, int64_t cluster) "job %p cluster %"PRId64
+backup_copy_cluster_enter(void *job, void *self, int64_t cluster) "job %p self
%p cluster %"PRId64
+backup_copy_cluster_success(void *job, void *self, int64_t cluster) "job %p
self %p cluster %"PRId64
backup_do_read_fail(void *job, void *self, int64_t offset, unsigned bytes, int
ret) "job %p self %p offset %"PRId64" bytes %u ret %d"
backup_do_write_fail(void *job, void *self, int64_t offset, unsigned bytes,
int ret) "job %p self %p offset %"PRId64" bytes %u ret %d"
backup_job_wait_workers_start(void) ""
--
1.8.3.1
- [Qemu-block] [PATCH 00/21] new backup architecture, Vladimir Sementsov-Ogievskiy, 2016/12/23
- [Qemu-block] [PATCH 21/21] backup: refactor: remove backup_do_cow(),
Vladimir Sementsov-Ogievskiy <=
- [Qemu-block] [PATCH 20/21] backup: move bitmap handling from backup_do_cow to get_work, Vladimir Sementsov-Ogievskiy, 2016/12/23
- [Qemu-block] [PATCH 01/21] backup: move from done_bitmap to copy_bitmap, Vladimir Sementsov-Ogievskiy, 2016/12/23
- [Qemu-block] [PATCH 05/21] hbitmap: improve dirty iter, Vladimir Sementsov-Ogievskiy, 2016/12/23
- [Qemu-block] [PATCH 18/21] backup: new async architecture, Vladimir Sementsov-Ogievskiy, 2016/12/23
- [Qemu-block] [PATCH 15/21] bitmap: add bitmap_count_between() function, Vladimir Sementsov-Ogievskiy, 2016/12/23
- [Qemu-block] [PATCH 17/21] backup: make all reads not serializing, Vladimir Sementsov-Ogievskiy, 2016/12/23
- [Qemu-block] [PATCH 16/21] hbitmap: add hbitmap_count_between() function, Vladimir Sementsov-Ogievskiy, 2016/12/23
- [Qemu-block] [PATCH 04/21] backup: use copy_bitmap in incremental backup, Vladimir Sementsov-Ogievskiy, 2016/12/23
- [Qemu-block] [PATCH 03/21] backup: improve non-dirty bits progress processing, Vladimir Sementsov-Ogievskiy, 2016/12/23
- [Qemu-block] [PATCH 06/21] backup: rewrite top mode cluster skipping, Vladimir Sementsov-Ogievskiy, 2016/12/23