mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-03 15:53:54 -06:00
file-posix: Avoid aio_worker() for QEMU_AIO_WRITE_ZEROES
aio_worker() doesn't add anything interesting, it's only a useless indirection. Call the handler function directly instead. As we know that this handler function is only called from coroutine context and the coroutine stays around until the worker thread finishes, we can keep RawPosixAIOData on the stack. Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
58a209c437
commit
7154d8ae66
1 changed files with 36 additions and 21 deletions
|
@ -1464,8 +1464,9 @@ static ssize_t handle_aiocb_write_zeroes_block(RawPosixAIOData *aiocb)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t handle_aiocb_write_zeroes(RawPosixAIOData *aiocb)
|
static int handle_aiocb_write_zeroes(void *opaque)
|
||||||
{
|
{
|
||||||
|
RawPosixAIOData *aiocb = opaque;
|
||||||
#if defined(CONFIG_FALLOCATE) || defined(CONFIG_XFS)
|
#if defined(CONFIG_FALLOCATE) || defined(CONFIG_XFS)
|
||||||
BDRVRawState *s = aiocb->bs->opaque;
|
BDRVRawState *s = aiocb->bs->opaque;
|
||||||
#endif
|
#endif
|
||||||
|
@ -1529,8 +1530,9 @@ static ssize_t handle_aiocb_write_zeroes(RawPosixAIOData *aiocb)
|
||||||
return -ENOTSUP;
|
return -ENOTSUP;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t handle_aiocb_write_zeroes_unmap(RawPosixAIOData *aiocb)
|
static int handle_aiocb_write_zeroes_unmap(void *opaque)
|
||||||
{
|
{
|
||||||
|
RawPosixAIOData *aiocb = opaque;
|
||||||
BDRVRawState *s G_GNUC_UNUSED = aiocb->bs->opaque;
|
BDRVRawState *s G_GNUC_UNUSED = aiocb->bs->opaque;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
@ -1805,11 +1807,7 @@ static int aio_worker(void *arg)
|
||||||
ret = handle_aiocb_discard(aiocb);
|
ret = handle_aiocb_discard(aiocb);
|
||||||
break;
|
break;
|
||||||
case QEMU_AIO_WRITE_ZEROES:
|
case QEMU_AIO_WRITE_ZEROES:
|
||||||
ret = handle_aiocb_write_zeroes(aiocb);
|
|
||||||
break;
|
|
||||||
case QEMU_AIO_WRITE_ZEROES | QEMU_AIO_DISCARD:
|
case QEMU_AIO_WRITE_ZEROES | QEMU_AIO_DISCARD:
|
||||||
ret = handle_aiocb_write_zeroes_unmap(aiocb);
|
|
||||||
break;
|
|
||||||
case QEMU_AIO_COPY_RANGE:
|
case QEMU_AIO_COPY_RANGE:
|
||||||
case QEMU_AIO_TRUNCATE:
|
case QEMU_AIO_TRUNCATE:
|
||||||
g_assert_not_reached();
|
g_assert_not_reached();
|
||||||
|
@ -2631,18 +2629,41 @@ raw_co_pdiscard(BlockDriverState *bs, int64_t offset, int bytes)
|
||||||
return paio_submit_co(bs, s->fd, offset, NULL, bytes, QEMU_AIO_DISCARD);
|
return paio_submit_co(bs, s->fd, offset, NULL, bytes, QEMU_AIO_DISCARD);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int coroutine_fn
|
||||||
|
raw_do_pwrite_zeroes(BlockDriverState *bs, int64_t offset, int bytes,
|
||||||
|
BdrvRequestFlags flags, bool blkdev)
|
||||||
|
{
|
||||||
|
BDRVRawState *s = bs->opaque;
|
||||||
|
RawPosixAIOData acb;
|
||||||
|
ThreadPoolFunc *handler;
|
||||||
|
|
||||||
|
acb = (RawPosixAIOData) {
|
||||||
|
.bs = bs,
|
||||||
|
.aio_fildes = s->fd,
|
||||||
|
.aio_type = QEMU_AIO_WRITE_ZEROES,
|
||||||
|
.aio_offset = offset,
|
||||||
|
.aio_nbytes = bytes,
|
||||||
|
};
|
||||||
|
|
||||||
|
if (blkdev) {
|
||||||
|
acb.aio_type |= QEMU_AIO_BLKDEV;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (flags & BDRV_REQ_MAY_UNMAP) {
|
||||||
|
acb.aio_type |= QEMU_AIO_DISCARD;
|
||||||
|
handler = handle_aiocb_write_zeroes_unmap;
|
||||||
|
} else {
|
||||||
|
handler = handle_aiocb_write_zeroes;
|
||||||
|
}
|
||||||
|
|
||||||
|
return raw_thread_pool_submit(bs, handler, &acb);
|
||||||
|
}
|
||||||
|
|
||||||
static int coroutine_fn raw_co_pwrite_zeroes(
|
static int coroutine_fn raw_co_pwrite_zeroes(
|
||||||
BlockDriverState *bs, int64_t offset,
|
BlockDriverState *bs, int64_t offset,
|
||||||
int bytes, BdrvRequestFlags flags)
|
int bytes, BdrvRequestFlags flags)
|
||||||
{
|
{
|
||||||
BDRVRawState *s = bs->opaque;
|
return raw_do_pwrite_zeroes(bs, offset, bytes, flags, false);
|
||||||
int operation = QEMU_AIO_WRITE_ZEROES;
|
|
||||||
|
|
||||||
if (flags & BDRV_REQ_MAY_UNMAP) {
|
|
||||||
operation |= QEMU_AIO_DISCARD;
|
|
||||||
}
|
|
||||||
|
|
||||||
return paio_submit_co(bs, s->fd, offset, NULL, bytes, operation);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int raw_get_info(BlockDriverState *bs, BlockDriverInfo *bdi)
|
static int raw_get_info(BlockDriverState *bs, BlockDriverInfo *bdi)
|
||||||
|
@ -3147,8 +3168,6 @@ hdev_co_pdiscard(BlockDriverState *bs, int64_t offset, int bytes)
|
||||||
static coroutine_fn int hdev_co_pwrite_zeroes(BlockDriverState *bs,
|
static coroutine_fn int hdev_co_pwrite_zeroes(BlockDriverState *bs,
|
||||||
int64_t offset, int bytes, BdrvRequestFlags flags)
|
int64_t offset, int bytes, BdrvRequestFlags flags)
|
||||||
{
|
{
|
||||||
BDRVRawState *s = bs->opaque;
|
|
||||||
int operation = QEMU_AIO_WRITE_ZEROES | QEMU_AIO_BLKDEV;
|
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
rc = fd_open(bs);
|
rc = fd_open(bs);
|
||||||
|
@ -3156,11 +3175,7 @@ static coroutine_fn int hdev_co_pwrite_zeroes(BlockDriverState *bs,
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (flags & BDRV_REQ_MAY_UNMAP) {
|
return raw_do_pwrite_zeroes(bs, offset, bytes, flags, true);
|
||||||
operation |= QEMU_AIO_DISCARD;
|
|
||||||
}
|
|
||||||
|
|
||||||
return paio_submit_co(bs, s->fd, offset, NULL, bytes, operation);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int coroutine_fn hdev_co_create_opts(const char *filename, QemuOpts *opts,
|
static int coroutine_fn hdev_co_create_opts(const char *filename, QemuOpts *opts,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue