|
|
26ba25 |
From 49b0a4709b289f28c97633d8b3145213df1d8fc1 Mon Sep 17 00:00:00 2001
|
|
|
26ba25 |
From: John Snow <jsnow@redhat.com>
|
|
|
26ba25 |
Date: Tue, 24 Jul 2018 12:43:07 +0200
|
|
|
26ba25 |
Subject: [PATCH 231/268] block: Move request tracking to children in copy
|
|
|
26ba25 |
offloading
|
|
|
26ba25 |
|
|
|
26ba25 |
RH-Author: John Snow <jsnow@redhat.com>
|
|
|
26ba25 |
Message-id: <20180718225511.14878-14-jsnow@redhat.com>
|
|
|
26ba25 |
Patchwork-id: 81393
|
|
|
26ba25 |
O-Subject: [RHEL-7.6 qemu-kvm-rhev PATCH 13/35] block: Move request tracking to children in copy offloading
|
|
|
26ba25 |
Bugzilla: 1207657
|
|
|
26ba25 |
RH-Acked-by: Eric Blake <eblake@redhat.com>
|
|
|
26ba25 |
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
|
|
26ba25 |
RH-Acked-by: Fam Zheng <famz@redhat.com>
|
|
|
26ba25 |
|
|
|
26ba25 |
From: Fam Zheng <famz@redhat.com>
|
|
|
26ba25 |
|
|
|
26ba25 |
in_flight and tracked requests need to be tracked in every layer during
|
|
|
26ba25 |
recursion. For now the only user is qemu-img convert where overlapping
|
|
|
26ba25 |
requests and IOThreads don't exist, therefore this change doesn't make
|
|
|
26ba25 |
much difference form user point of view, but it is incorrect as part of
|
|
|
26ba25 |
the API. Fix it.
|
|
|
26ba25 |
|
|
|
26ba25 |
Reported-by: Kevin Wolf <kwolf@redhat.com>
|
|
|
26ba25 |
Signed-off-by: Fam Zheng <famz@redhat.com>
|
|
|
26ba25 |
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
|
|
|
26ba25 |
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
|
|
26ba25 |
(cherry picked from commit 37aec7d75eb0d035a0db4f2cf9ad8b1b0c10f91b)
|
|
|
26ba25 |
Signed-off-by: John Snow <jsnow@redhat.com>
|
|
|
26ba25 |
---
|
|
|
26ba25 |
block/io.c | 60 +++++++++++++++++++++++++++++-------------------------------
|
|
|
26ba25 |
1 file changed, 29 insertions(+), 31 deletions(-)
|
|
|
26ba25 |
|
|
|
26ba25 |
diff --git a/block/io.c b/block/io.c
|
|
|
26ba25 |
index ac36d1c..136a5d0 100644
|
|
|
26ba25 |
--- a/block/io.c
|
|
|
26ba25 |
+++ b/block/io.c
|
|
|
26ba25 |
@@ -2847,6 +2847,9 @@ static int coroutine_fn bdrv_co_copy_range_internal(BdrvChild *src,
|
|
|
26ba25 |
BdrvRequestFlags flags,
|
|
|
26ba25 |
bool recurse_src)
|
|
|
26ba25 |
{
|
|
|
26ba25 |
+ BdrvTrackedRequest src_req, dst_req;
|
|
|
26ba25 |
+ BlockDriverState *src_bs = src->bs;
|
|
|
26ba25 |
+ BlockDriverState *dst_bs = dst->bs;
|
|
|
26ba25 |
int ret;
|
|
|
26ba25 |
|
|
|
26ba25 |
if (!src || !dst || !src->bs || !dst->bs) {
|
|
|
26ba25 |
@@ -2870,17 +2873,32 @@ static int coroutine_fn bdrv_co_copy_range_internal(BdrvChild *src,
|
|
|
26ba25 |
|| src->bs->encrypted || dst->bs->encrypted) {
|
|
|
26ba25 |
return -ENOTSUP;
|
|
|
26ba25 |
}
|
|
|
26ba25 |
+
|
|
|
26ba25 |
+ bdrv_inc_in_flight(src_bs);
|
|
|
26ba25 |
+ bdrv_inc_in_flight(dst_bs);
|
|
|
26ba25 |
+ tracked_request_begin(&src_req, src_bs, src_offset,
|
|
|
26ba25 |
+ bytes, BDRV_TRACKED_READ);
|
|
|
26ba25 |
+ tracked_request_begin(&dst_req, dst_bs, dst_offset,
|
|
|
26ba25 |
+ bytes, BDRV_TRACKED_WRITE);
|
|
|
26ba25 |
+
|
|
|
26ba25 |
+ wait_serialising_requests(&src_req);
|
|
|
26ba25 |
+ wait_serialising_requests(&dst_req);
|
|
|
26ba25 |
if (recurse_src) {
|
|
|
26ba25 |
- return src->bs->drv->bdrv_co_copy_range_from(src->bs,
|
|
|
26ba25 |
- src, src_offset,
|
|
|
26ba25 |
- dst, dst_offset,
|
|
|
26ba25 |
- bytes, flags);
|
|
|
26ba25 |
+ ret = src->bs->drv->bdrv_co_copy_range_from(src->bs,
|
|
|
26ba25 |
+ src, src_offset,
|
|
|
26ba25 |
+ dst, dst_offset,
|
|
|
26ba25 |
+ bytes, flags);
|
|
|
26ba25 |
} else {
|
|
|
26ba25 |
- return dst->bs->drv->bdrv_co_copy_range_to(dst->bs,
|
|
|
26ba25 |
- src, src_offset,
|
|
|
26ba25 |
- dst, dst_offset,
|
|
|
26ba25 |
- bytes, flags);
|
|
|
26ba25 |
+ ret = dst->bs->drv->bdrv_co_copy_range_to(dst->bs,
|
|
|
26ba25 |
+ src, src_offset,
|
|
|
26ba25 |
+ dst, dst_offset,
|
|
|
26ba25 |
+ bytes, flags);
|
|
|
26ba25 |
}
|
|
|
26ba25 |
+ tracked_request_end(&src_req);
|
|
|
26ba25 |
+ tracked_request_end(&dst_req);
|
|
|
26ba25 |
+ bdrv_dec_in_flight(src_bs);
|
|
|
26ba25 |
+ bdrv_dec_in_flight(dst_bs);
|
|
|
26ba25 |
+ return ret;
|
|
|
26ba25 |
}
|
|
|
26ba25 |
|
|
|
26ba25 |
/* Copy range from @src to @dst.
|
|
|
26ba25 |
@@ -2911,29 +2929,9 @@ int coroutine_fn bdrv_co_copy_range(BdrvChild *src, uint64_t src_offset,
|
|
|
26ba25 |
BdrvChild *dst, uint64_t dst_offset,
|
|
|
26ba25 |
uint64_t bytes, BdrvRequestFlags flags)
|
|
|
26ba25 |
{
|
|
|
26ba25 |
- BdrvTrackedRequest src_req, dst_req;
|
|
|
26ba25 |
- BlockDriverState *src_bs = src->bs;
|
|
|
26ba25 |
- BlockDriverState *dst_bs = dst->bs;
|
|
|
26ba25 |
- int ret;
|
|
|
26ba25 |
-
|
|
|
26ba25 |
- bdrv_inc_in_flight(src_bs);
|
|
|
26ba25 |
- bdrv_inc_in_flight(dst_bs);
|
|
|
26ba25 |
- tracked_request_begin(&src_req, src_bs, src_offset,
|
|
|
26ba25 |
- bytes, BDRV_TRACKED_READ);
|
|
|
26ba25 |
- tracked_request_begin(&dst_req, dst_bs, dst_offset,
|
|
|
26ba25 |
- bytes, BDRV_TRACKED_WRITE);
|
|
|
26ba25 |
-
|
|
|
26ba25 |
- wait_serialising_requests(&src_req);
|
|
|
26ba25 |
- wait_serialising_requests(&dst_req);
|
|
|
26ba25 |
- ret = bdrv_co_copy_range_from(src, src_offset,
|
|
|
26ba25 |
- dst, dst_offset,
|
|
|
26ba25 |
- bytes, flags);
|
|
|
26ba25 |
-
|
|
|
26ba25 |
- tracked_request_end(&src_req);
|
|
|
26ba25 |
- tracked_request_end(&dst_req);
|
|
|
26ba25 |
- bdrv_dec_in_flight(src_bs);
|
|
|
26ba25 |
- bdrv_dec_in_flight(dst_bs);
|
|
|
26ba25 |
- return ret;
|
|
|
26ba25 |
+ return bdrv_co_copy_range_from(src, src_offset,
|
|
|
26ba25 |
+ dst, dst_offset,
|
|
|
26ba25 |
+ bytes, flags);
|
|
|
26ba25 |
}
|
|
|
26ba25 |
|
|
|
26ba25 |
static void bdrv_parent_cb_resize(BlockDriverState *bs)
|
|
|
26ba25 |
--
|
|
|
26ba25 |
1.8.3.1
|
|
|
26ba25 |
|