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