Commit 17187cb6 authored by Vladimir Sementsov-Ogievskiy's avatar Vladimir Sementsov-Ogievskiy Committed by Max Reitz
Browse files

block/block-copy: factor out find_conflicting_inflight_req



Split find_conflicting_inflight_req to be used separately.

Signed-off-by: default avatarVladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Reviewed-by: default avatarAndrey Shinkevich <andrey.shinkevich@virtuozzo.com>
Reviewed-by: default avatarMax Reitz <mreitz@redhat.com>
Message-Id: <20200311103004.7649-6-vsementsov@virtuozzo.com>
Signed-off-by: default avatarMax Reitz <mreitz@redhat.com>
parent 2d57511a
Loading
Loading
Loading
Loading
+19 −12
Original line number Diff line number Diff line
@@ -24,23 +24,30 @@
#define BLOCK_COPY_MAX_BUFFER (1 * MiB)
#define BLOCK_COPY_MAX_MEM (128 * MiB)

static void coroutine_fn block_copy_wait_inflight_reqs(BlockCopyState *s,
static BlockCopyInFlightReq *find_conflicting_inflight_req(BlockCopyState *s,
                                                           int64_t start,
                                                           int64_t end)
{
    BlockCopyInFlightReq *req;
    bool waited;

    do {
        waited = false;
    QLIST_FOREACH(req, &s->inflight_reqs, list) {
        if (end > req->start_byte && start < req->end_byte) {
                qemu_co_queue_wait(&req->wait_queue, NULL);
                waited = true;
                break;
            return req;
        }
    }

    return NULL;
}

static void coroutine_fn block_copy_wait_inflight_reqs(BlockCopyState *s,
                                                       int64_t start,
                                                       int64_t end)
{
    BlockCopyInFlightReq *req;

    while ((req = find_conflicting_inflight_req(s, start, end))) {
        qemu_co_queue_wait(&req->wait_queue, NULL);
    }
    } while (waited);
}

static void block_copy_inflight_req_begin(BlockCopyState *s,