|
|
8b1478 |
From 207dc8620ffb1a1bdbfaddba5208a82f93058b2c Mon Sep 17 00:00:00 2001
|
|
|
8b1478 |
From: Maxim Levitsky <mlevitsk@redhat.com>
|
|
|
8b1478 |
Date: Wed, 5 Jun 2019 13:57:02 +0200
|
|
|
8b1478 |
Subject: [PATCH 14/23] file-posix: Avoid aio_worker() for
|
|
|
8b1478 |
QEMU_AIO_WRITE_ZEROES
|
|
|
8b1478 |
|
|
|
8b1478 |
RH-Author: Maxim Levitsky <mlevitsk@redhat.com>
|
|
|
8b1478 |
Message-id: <20190605135705.24526-7-mlevitsk@redhat.com>
|
|
|
8b1478 |
Patchwork-id: 88561
|
|
|
8b1478 |
O-Subject: [RHEL-7.7 qemu-kvm-rhev PATCH 6/9] file-posix: Avoid aio_worker() for QEMU_AIO_WRITE_ZEROES
|
|
|
8b1478 |
Bugzilla: 1648622
|
|
|
8b1478 |
RH-Acked-by: Max Reitz <mreitz@redhat.com>
|
|
|
8b1478 |
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
|
|
8b1478 |
RH-Acked-by: John Snow <jsnow@redhat.com>
|
|
|
8b1478 |
|
|
|
8b1478 |
From: Kevin Wolf <kwolf@redhat.com>
|
|
|
8b1478 |
|
|
|
8b1478 |
aio_worker() doesn't add anything interesting, it's only a useless
|
|
|
8b1478 |
indirection. Call the handler function directly instead.
|
|
|
8b1478 |
|
|
|
8b1478 |
As we know that this handler function is only called from coroutine
|
|
|
8b1478 |
context and the coroutine stays around until the worker thread finishes,
|
|
|
8b1478 |
we can keep RawPosixAIOData on the stack.
|
|
|
8b1478 |
|
|
|
8b1478 |
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
|
|
8b1478 |
|
|
|
8b1478 |
Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1648622
|
|
|
8b1478 |
|
|
|
8b1478 |
Signed-off-by: Maxim Levitsky <mlevitsk@redhat.com>
|
|
|
8b1478 |
(Cherry picked from 7154d8ae66c75c97b08c8f1c80dd6f46f0dbffca)
|
|
|
8b1478 |
|
|
|
8b1478 |
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
|
|
8b1478 |
---
|
|
|
8b1478 |
block/file-posix.c | 53 ++++++++++++++++++++++++++++++++++-------------------
|
|
|
8b1478 |
1 file changed, 34 insertions(+), 19 deletions(-)
|
|
|
8b1478 |
|
|
|
8b1478 |
diff --git a/block/file-posix.c b/block/file-posix.c
|
|
|
8b1478 |
index 74da336..90c719f 100644
|
|
|
8b1478 |
--- a/block/file-posix.c
|
|
|
8b1478 |
+++ b/block/file-posix.c
|
|
|
8b1478 |
@@ -1465,8 +1465,9 @@ static ssize_t handle_aiocb_write_zeroes_block(RawPosixAIOData *aiocb)
|
|
|
8b1478 |
return ret;
|
|
|
8b1478 |
}
|
|
|
8b1478 |
|
|
|
8b1478 |
-static ssize_t handle_aiocb_write_zeroes(RawPosixAIOData *aiocb)
|
|
|
8b1478 |
+static int handle_aiocb_write_zeroes(void *opaque)
|
|
|
8b1478 |
{
|
|
|
8b1478 |
+ RawPosixAIOData *aiocb = opaque;
|
|
|
8b1478 |
#if defined(CONFIG_FALLOCATE) || defined(CONFIG_XFS)
|
|
|
8b1478 |
BDRVRawState *s = aiocb->bs->opaque;
|
|
|
8b1478 |
#endif
|
|
|
8b1478 |
@@ -1530,8 +1531,9 @@ static ssize_t handle_aiocb_write_zeroes(RawPosixAIOData *aiocb)
|
|
|
8b1478 |
return -ENOTSUP;
|
|
|
8b1478 |
}
|
|
|
8b1478 |
|
|
|
8b1478 |
-static ssize_t handle_aiocb_write_zeroes_unmap(RawPosixAIOData *aiocb)
|
|
|
8b1478 |
+static int handle_aiocb_write_zeroes_unmap(void *opaque)
|
|
|
8b1478 |
{
|
|
|
8b1478 |
+ RawPosixAIOData *aiocb = opaque;
|
|
|
8b1478 |
BDRVRawState *s G_GNUC_UNUSED = aiocb->bs->opaque;
|
|
|
8b1478 |
int ret;
|
|
|
8b1478 |
|
|
|
8b1478 |
@@ -1797,11 +1799,7 @@ static int aio_worker(void *arg)
|
|
|
8b1478 |
ret = handle_aiocb_discard(aiocb);
|
|
|
8b1478 |
break;
|
|
|
8b1478 |
case QEMU_AIO_WRITE_ZEROES:
|
|
|
8b1478 |
- ret = handle_aiocb_write_zeroes(aiocb);
|
|
|
8b1478 |
- break;
|
|
|
8b1478 |
case QEMU_AIO_WRITE_ZEROES | QEMU_AIO_DISCARD:
|
|
|
8b1478 |
- ret = handle_aiocb_write_zeroes_unmap(aiocb);
|
|
|
8b1478 |
- break;
|
|
|
8b1478 |
case QEMU_AIO_COPY_RANGE:
|
|
|
8b1478 |
ret = handle_aiocb_copy_range(aiocb);
|
|
|
8b1478 |
break;
|
|
|
8b1478 |
@@ -2518,18 +2516,41 @@ static coroutine_fn BlockAIOCB *raw_aio_pdiscard(BlockDriverState *bs,
|
|
|
8b1478 |
cb, opaque, QEMU_AIO_DISCARD);
|
|
|
8b1478 |
}
|
|
|
8b1478 |
|
|
|
8b1478 |
-static int coroutine_fn raw_co_pwrite_zeroes(
|
|
|
8b1478 |
- BlockDriverState *bs, int64_t offset,
|
|
|
8b1478 |
- int bytes, BdrvRequestFlags flags)
|
|
|
8b1478 |
+static int coroutine_fn
|
|
|
8b1478 |
+raw_do_pwrite_zeroes(BlockDriverState *bs, int64_t offset, int bytes,
|
|
|
8b1478 |
+ BdrvRequestFlags flags, bool blkdev)
|
|
|
8b1478 |
{
|
|
|
8b1478 |
BDRVRawState *s = bs->opaque;
|
|
|
8b1478 |
- int operation = QEMU_AIO_WRITE_ZEROES;
|
|
|
8b1478 |
+ RawPosixAIOData acb;
|
|
|
8b1478 |
+ ThreadPoolFunc *handler;
|
|
|
8b1478 |
+
|
|
|
8b1478 |
+ acb = (RawPosixAIOData) {
|
|
|
8b1478 |
+ .bs = bs,
|
|
|
8b1478 |
+ .aio_fildes = s->fd,
|
|
|
8b1478 |
+ .aio_type = QEMU_AIO_WRITE_ZEROES,
|
|
|
8b1478 |
+ .aio_offset = offset,
|
|
|
8b1478 |
+ .aio_nbytes = bytes,
|
|
|
8b1478 |
+ };
|
|
|
8b1478 |
+
|
|
|
8b1478 |
+ if (blkdev) {
|
|
|
8b1478 |
+ acb.aio_type |= QEMU_AIO_BLKDEV;
|
|
|
8b1478 |
+ }
|
|
|
8b1478 |
|
|
|
8b1478 |
if (flags & BDRV_REQ_MAY_UNMAP) {
|
|
|
8b1478 |
- operation |= QEMU_AIO_DISCARD;
|
|
|
8b1478 |
+ acb.aio_type |= QEMU_AIO_DISCARD;
|
|
|
8b1478 |
+ handler = handle_aiocb_write_zeroes_unmap;
|
|
|
8b1478 |
+ } else {
|
|
|
8b1478 |
+ handler = handle_aiocb_write_zeroes;
|
|
|
8b1478 |
}
|
|
|
8b1478 |
|
|
|
8b1478 |
- return paio_submit_co(bs, s->fd, offset, NULL, bytes, operation);
|
|
|
8b1478 |
+ return raw_thread_pool_submit(bs, handler, &acb;;
|
|
|
8b1478 |
+}
|
|
|
8b1478 |
+
|
|
|
8b1478 |
+static int coroutine_fn raw_co_pwrite_zeroes(
|
|
|
8b1478 |
+ BlockDriverState *bs, int64_t offset,
|
|
|
8b1478 |
+ int bytes, BdrvRequestFlags flags)
|
|
|
8b1478 |
+{
|
|
|
8b1478 |
+ return raw_do_pwrite_zeroes(bs, offset, bytes, flags, false);
|
|
|
8b1478 |
}
|
|
|
8b1478 |
|
|
|
8b1478 |
static int raw_get_info(BlockDriverState *bs, BlockDriverInfo *bdi)
|
|
|
8b1478 |
@@ -3093,8 +3114,6 @@ static coroutine_fn BlockAIOCB *hdev_aio_pdiscard(BlockDriverState *bs,
|
|
|
8b1478 |
static coroutine_fn int hdev_co_pwrite_zeroes(BlockDriverState *bs,
|
|
|
8b1478 |
int64_t offset, int bytes, BdrvRequestFlags flags)
|
|
|
8b1478 |
{
|
|
|
8b1478 |
- BDRVRawState *s = bs->opaque;
|
|
|
8b1478 |
- int operation = QEMU_AIO_WRITE_ZEROES | QEMU_AIO_BLKDEV;
|
|
|
8b1478 |
int rc;
|
|
|
8b1478 |
|
|
|
8b1478 |
rc = fd_open(bs);
|
|
|
8b1478 |
@@ -3102,11 +3121,7 @@ static coroutine_fn int hdev_co_pwrite_zeroes(BlockDriverState *bs,
|
|
|
8b1478 |
return rc;
|
|
|
8b1478 |
}
|
|
|
8b1478 |
|
|
|
8b1478 |
- if (flags & BDRV_REQ_MAY_UNMAP) {
|
|
|
8b1478 |
- operation |= QEMU_AIO_DISCARD;
|
|
|
8b1478 |
- }
|
|
|
8b1478 |
-
|
|
|
8b1478 |
- return paio_submit_co(bs, s->fd, offset, NULL, bytes, operation);
|
|
|
8b1478 |
+ return raw_do_pwrite_zeroes(bs, offset, bytes, flags, true);
|
|
|
8b1478 |
}
|
|
|
8b1478 |
|
|
|
8b1478 |
static int coroutine_fn hdev_co_create_opts(const char *filename, QemuOpts *opts,
|
|
|
8b1478 |
--
|
|
|
8b1478 |
1.8.3.1
|
|
|
8b1478 |
|