Blame SOURCES/kvm-file-posix-Avoid-aio_worker-for-QEMU_AIO_WRITE_ZEROE.patch

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