提交 bdad13b9 编写于 作者: P Paolo Bonzini 提交者: Stefan Hajnoczi

block: make bdrv_co_is_allocated static

bdrv_is_allocated can detect coroutine context and go through a fast
path, similar to other block layer functions.
Reviewed-by: NEric Blake <eblake@redhat.com>
Signed-off-by: NPaolo Bonzini <pbonzini@redhat.com>
Signed-off-by: NStefan Hajnoczi <stefanha@redhat.com>
上级 df2a6f29
...@@ -2587,7 +2587,7 @@ static int coroutine_fn bdrv_co_do_readv(BlockDriverState *bs, ...@@ -2587,7 +2587,7 @@ static int coroutine_fn bdrv_co_do_readv(BlockDriverState *bs,
if (flags & BDRV_REQ_COPY_ON_READ) { if (flags & BDRV_REQ_COPY_ON_READ) {
int pnum; int pnum;
ret = bdrv_co_is_allocated(bs, sector_num, nb_sectors, &pnum); ret = bdrv_is_allocated(bs, sector_num, nb_sectors, &pnum);
if (ret < 0) { if (ret < 0) {
goto out; goto out;
} }
...@@ -3061,8 +3061,9 @@ typedef struct BdrvCoIsAllocatedData { ...@@ -3061,8 +3061,9 @@ typedef struct BdrvCoIsAllocatedData {
* 'nb_sectors' is the max value 'pnum' should be set to. If nb_sectors goes * 'nb_sectors' is the max value 'pnum' should be set to. If nb_sectors goes
* beyond the end of the disk image it will be clamped. * beyond the end of the disk image it will be clamped.
*/ */
int coroutine_fn bdrv_co_is_allocated(BlockDriverState *bs, int64_t sector_num, static int coroutine_fn bdrv_co_is_allocated(BlockDriverState *bs,
int nb_sectors, int *pnum) int64_t sector_num,
int nb_sectors, int *pnum)
{ {
int64_t n; int64_t n;
...@@ -3112,10 +3113,15 @@ int bdrv_is_allocated(BlockDriverState *bs, int64_t sector_num, int nb_sectors, ...@@ -3112,10 +3113,15 @@ int bdrv_is_allocated(BlockDriverState *bs, int64_t sector_num, int nb_sectors,
.done = false, .done = false,
}; };
co = qemu_coroutine_create(bdrv_is_allocated_co_entry); if (qemu_in_coroutine()) {
qemu_coroutine_enter(co, &data); /* Fast-path if already in coroutine context */
while (!data.done) { bdrv_is_allocated_co_entry(&data);
qemu_aio_wait(); } else {
co = qemu_coroutine_create(bdrv_is_allocated_co_entry);
qemu_coroutine_enter(co, &data);
while (!data.done) {
qemu_aio_wait();
}
} }
return data.ret; return data.ret;
} }
...@@ -3143,8 +3149,8 @@ int coroutine_fn bdrv_co_is_allocated_above(BlockDriverState *top, ...@@ -3143,8 +3149,8 @@ int coroutine_fn bdrv_co_is_allocated_above(BlockDriverState *top,
intermediate = top; intermediate = top;
while (intermediate && intermediate != base) { while (intermediate && intermediate != base) {
int pnum_inter; int pnum_inter;
ret = bdrv_co_is_allocated(intermediate, sector_num, nb_sectors, ret = bdrv_is_allocated(intermediate, sector_num, nb_sectors,
&pnum_inter); &pnum_inter);
if (ret < 0) { if (ret < 0) {
return ret; return ret;
} else if (ret) { } else if (ret) {
......
...@@ -289,14 +289,14 @@ static void coroutine_fn backup_run(void *opaque) ...@@ -289,14 +289,14 @@ static void coroutine_fn backup_run(void *opaque)
* backing file. */ * backing file. */
for (i = 0; i < BACKUP_SECTORS_PER_CLUSTER;) { for (i = 0; i < BACKUP_SECTORS_PER_CLUSTER;) {
/* bdrv_co_is_allocated() only returns true/false based /* bdrv_is_allocated() only returns true/false based
* on the first set of sectors it comes across that * on the first set of sectors it comes across that
* are are all in the same state. * are are all in the same state.
* For that reason we must verify each sector in the * For that reason we must verify each sector in the
* backup cluster length. We end up copying more than * backup cluster length. We end up copying more than
* needed but at some point that is always the case. */ * needed but at some point that is always the case. */
alloced = alloced =
bdrv_co_is_allocated(bs, bdrv_is_allocated(bs,
start * BACKUP_SECTORS_PER_CLUSTER + i, start * BACKUP_SECTORS_PER_CLUSTER + i,
BACKUP_SECTORS_PER_CLUSTER - i, &n); BACKUP_SECTORS_PER_CLUSTER - i, &n);
i += n; i += n;
......
...@@ -62,7 +62,7 @@ static int coroutine_fn raw_co_is_allocated(BlockDriverState *bs, ...@@ -62,7 +62,7 @@ static int coroutine_fn raw_co_is_allocated(BlockDriverState *bs,
int64_t sector_num, int nb_sectors, int64_t sector_num, int nb_sectors,
int *pnum) int *pnum)
{ {
return bdrv_co_is_allocated(bs->file, sector_num, nb_sectors, pnum); return bdrv_is_allocated(bs->file, sector_num, nb_sectors, pnum);
} }
static int coroutine_fn raw_co_write_zeroes(BlockDriverState *bs, static int coroutine_fn raw_co_write_zeroes(BlockDriverState *bs,
......
...@@ -119,8 +119,8 @@ wait: ...@@ -119,8 +119,8 @@ wait:
break; break;
} }
ret = bdrv_co_is_allocated(bs, sector_num, ret = bdrv_is_allocated(bs, sector_num,
STREAM_BUFFER_SIZE / BDRV_SECTOR_SIZE, &n); STREAM_BUFFER_SIZE / BDRV_SECTOR_SIZE, &n);
if (ret == 1) { if (ret == 1) {
/* Allocated in the top, no need to copy. */ /* Allocated in the top, no need to copy. */
copy = false; copy = false;
......
...@@ -179,8 +179,6 @@ int coroutine_fn bdrv_co_writev(BlockDriverState *bs, int64_t sector_num, ...@@ -179,8 +179,6 @@ int coroutine_fn bdrv_co_writev(BlockDriverState *bs, int64_t sector_num,
*/ */
int coroutine_fn bdrv_co_write_zeroes(BlockDriverState *bs, int64_t sector_num, int coroutine_fn bdrv_co_write_zeroes(BlockDriverState *bs, int64_t sector_num,
int nb_sectors); int nb_sectors);
int coroutine_fn bdrv_co_is_allocated(BlockDriverState *bs, int64_t sector_num,
int nb_sectors, int *pnum);
int coroutine_fn bdrv_co_is_allocated_above(BlockDriverState *top, int coroutine_fn bdrv_co_is_allocated_above(BlockDriverState *top,
BlockDriverState *base, BlockDriverState *base,
int64_t sector_num, int64_t sector_num,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册