Blame SOURCES/kvm-block-Increase-BB.in_flight-for-coroutine-and-sync-i.patch

ddf19c
From 52cc1d1cd2f695c5761d65baec961d14552a79ed Mon Sep 17 00:00:00 2001
ddf19c
From: Kevin Wolf <kwolf@redhat.com>
ddf19c
Date: Wed, 8 Apr 2020 17:29:16 +0100
ddf19c
Subject: [PATCH 5/6] block: Increase BB.in_flight for coroutine and sync
ddf19c
 interfaces
ddf19c
ddf19c
RH-Author: Kevin Wolf <kwolf@redhat.com>
ddf19c
Message-id: <20200408172917.18712-6-kwolf@redhat.com>
ddf19c
Patchwork-id: 94600
ddf19c
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH 5/6] block: Increase BB.in_flight for coroutine and sync interfaces
ddf19c
Bugzilla: 1817621
ddf19c
RH-Acked-by: Eric Blake <eblake@redhat.com>
ddf19c
RH-Acked-by: Danilo de Paula <ddepaula@redhat.com>
ddf19c
RH-Acked-by: Max Reitz <mreitz@redhat.com>
ddf19c
ddf19c
External callers of blk_co_*() and of the synchronous blk_*() functions
ddf19c
don't currently increase the BlockBackend.in_flight counter, but calls
ddf19c
from blk_aio_*() do, so there is an inconsistency whether the counter
ddf19c
has been increased or not.
ddf19c
ddf19c
This patch moves the actual operations to static functions that can
ddf19c
later know they will always be called with in_flight increased exactly
ddf19c
once, even for external callers using the blk_co_*() coroutine
ddf19c
interfaces.
ddf19c
ddf19c
If the public blk_co_*() interface is unused, remove it.
ddf19c
ddf19c
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
ddf19c
Message-Id: <20200407121259.21350-3-kwolf@redhat.com>
ddf19c
Reviewed-by: Max Reitz <mreitz@redhat.com>
ddf19c
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
ddf19c
(cherry picked from commit fbb92b6798894d3bf62fe3578d99fa62c720b242)
ddf19c
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
ddf19c
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
ddf19c
---
ddf19c
 block/block-backend.c          | 103 ++++++++++++++++++++++++++++++++---------
ddf19c
 include/sysemu/block-backend.h |   1 -
ddf19c
 2 files changed, 80 insertions(+), 24 deletions(-)
ddf19c
ddf19c
diff --git a/block/block-backend.c b/block/block-backend.c
ddf19c
index 17b2e87..610dbfa 100644
ddf19c
--- a/block/block-backend.c
ddf19c
+++ b/block/block-backend.c
ddf19c
@@ -1147,9 +1147,10 @@ static void coroutine_fn blk_wait_while_drained(BlockBackend *blk)
ddf19c
     }
ddf19c
 }
ddf19c
 
ddf19c
-int coroutine_fn blk_co_preadv(BlockBackend *blk, int64_t offset,
ddf19c
-                               unsigned int bytes, QEMUIOVector *qiov,
ddf19c
-                               BdrvRequestFlags flags)
ddf19c
+/* To be called between exactly one pair of blk_inc/dec_in_flight() */
ddf19c
+static int coroutine_fn
ddf19c
+blk_do_preadv(BlockBackend *blk, int64_t offset, unsigned int bytes,
ddf19c
+              QEMUIOVector *qiov, BdrvRequestFlags flags)
ddf19c
 {
ddf19c
     int ret;
ddf19c
     BlockDriverState *bs;
ddf19c
@@ -1178,10 +1179,24 @@ int coroutine_fn blk_co_preadv(BlockBackend *blk, int64_t offset,
ddf19c
     return ret;
ddf19c
 }
ddf19c
 
ddf19c
-int coroutine_fn blk_co_pwritev_part(BlockBackend *blk, int64_t offset,
ddf19c
-                                     unsigned int bytes,
ddf19c
-                                     QEMUIOVector *qiov, size_t qiov_offset,
ddf19c
-                                     BdrvRequestFlags flags)
ddf19c
+int coroutine_fn blk_co_preadv(BlockBackend *blk, int64_t offset,
ddf19c
+                               unsigned int bytes, QEMUIOVector *qiov,
ddf19c
+                               BdrvRequestFlags flags)
ddf19c
+{
ddf19c
+    int ret;
ddf19c
+
ddf19c
+    blk_inc_in_flight(blk);
ddf19c
+    ret = blk_do_preadv(blk, offset, bytes, qiov, flags);
ddf19c
+    blk_dec_in_flight(blk);
ddf19c
+
ddf19c
+    return ret;
ddf19c
+}
ddf19c
+
ddf19c
+/* To be called between exactly one pair of blk_inc/dec_in_flight() */
ddf19c
+static int coroutine_fn
ddf19c
+blk_do_pwritev_part(BlockBackend *blk, int64_t offset, unsigned int bytes,
ddf19c
+                    QEMUIOVector *qiov, size_t qiov_offset,
ddf19c
+                    BdrvRequestFlags flags)
ddf19c
 {
ddf19c
     int ret;
ddf19c
     BlockDriverState *bs;
ddf19c
@@ -1214,6 +1229,20 @@ int coroutine_fn blk_co_pwritev_part(BlockBackend *blk, int64_t offset,
ddf19c
     return ret;
ddf19c
 }
ddf19c
 
ddf19c
+int coroutine_fn blk_co_pwritev_part(BlockBackend *blk, int64_t offset,
ddf19c
+                                     unsigned int bytes,
ddf19c
+                                     QEMUIOVector *qiov, size_t qiov_offset,
ddf19c
+                                     BdrvRequestFlags flags)
ddf19c
+{
ddf19c
+    int ret;
ddf19c
+
ddf19c
+    blk_inc_in_flight(blk);
ddf19c
+    ret = blk_do_pwritev_part(blk, offset, bytes, qiov, qiov_offset, flags);
ddf19c
+    blk_dec_in_flight(blk);
ddf19c
+
ddf19c
+    return ret;
ddf19c
+}
ddf19c
+
ddf19c
 int coroutine_fn blk_co_pwritev(BlockBackend *blk, int64_t offset,
ddf19c
                                 unsigned int bytes, QEMUIOVector *qiov,
ddf19c
                                 BdrvRequestFlags flags)
ddf19c
@@ -1234,7 +1263,7 @@ static void blk_read_entry(void *opaque)
ddf19c
     BlkRwCo *rwco = opaque;
ddf19c
     QEMUIOVector *qiov = rwco->iobuf;
ddf19c
 
ddf19c
-    rwco->ret = blk_co_preadv(rwco->blk, rwco->offset, qiov->size,
ddf19c
+    rwco->ret = blk_do_preadv(rwco->blk, rwco->offset, qiov->size,
ddf19c
                               qiov, rwco->flags);
ddf19c
     aio_wait_kick();
ddf19c
 }
ddf19c
@@ -1244,8 +1273,8 @@ static void blk_write_entry(void *opaque)
ddf19c
     BlkRwCo *rwco = opaque;
ddf19c
     QEMUIOVector *qiov = rwco->iobuf;
ddf19c
 
ddf19c
-    rwco->ret = blk_co_pwritev(rwco->blk, rwco->offset, qiov->size,
ddf19c
-                               qiov, rwco->flags);
ddf19c
+    rwco->ret = blk_do_pwritev_part(rwco->blk, rwco->offset, qiov->size,
ddf19c
+                                    qiov, 0, rwco->flags);
ddf19c
     aio_wait_kick();
ddf19c
 }
ddf19c
 
ddf19c
@@ -1262,6 +1291,7 @@ static int blk_prw(BlockBackend *blk, int64_t offset, uint8_t *buf,
ddf19c
         .ret    = NOT_DONE,
ddf19c
     };
ddf19c
 
ddf19c
+    blk_inc_in_flight(blk);
ddf19c
     if (qemu_in_coroutine()) {
ddf19c
         /* Fast-path if already in coroutine context */
ddf19c
         co_entry(&rwco);
ddf19c
@@ -1270,6 +1300,7 @@ static int blk_prw(BlockBackend *blk, int64_t offset, uint8_t *buf,
ddf19c
         bdrv_coroutine_enter(blk_bs(blk), co);
ddf19c
         BDRV_POLL_WHILE(blk_bs(blk), rwco.ret == NOT_DONE);
ddf19c
     }
ddf19c
+    blk_dec_in_flight(blk);
ddf19c
 
ddf19c
     return rwco.ret;
ddf19c
 }
ddf19c
@@ -1394,7 +1425,7 @@ static void blk_aio_read_entry(void *opaque)
ddf19c
     }
ddf19c
 
ddf19c
     assert(qiov->size == acb->bytes);
ddf19c
-    rwco->ret = blk_co_preadv(rwco->blk, rwco->offset, acb->bytes,
ddf19c
+    rwco->ret = blk_do_preadv(rwco->blk, rwco->offset, acb->bytes,
ddf19c
                               qiov, rwco->flags);
ddf19c
     blk_aio_complete(acb);
ddf19c
 }
ddf19c
@@ -1412,8 +1443,8 @@ static void blk_aio_write_entry(void *opaque)
ddf19c
     }
ddf19c
 
ddf19c
     assert(!qiov || qiov->size == acb->bytes);
ddf19c
-    rwco->ret = blk_co_pwritev(rwco->blk, rwco->offset, acb->bytes,
ddf19c
-                               qiov, rwco->flags);
ddf19c
+    rwco->ret = blk_do_pwritev_part(rwco->blk, rwco->offset, acb->bytes,
ddf19c
+                                    qiov, 0, rwco->flags);
ddf19c
     blk_aio_complete(acb);
ddf19c
 }
ddf19c
 
ddf19c
@@ -1498,7 +1529,9 @@ void blk_aio_cancel_async(BlockAIOCB *acb)
ddf19c
     bdrv_aio_cancel_async(acb);
ddf19c
 }
ddf19c
 
ddf19c
-int blk_co_ioctl(BlockBackend *blk, unsigned long int req, void *buf)
ddf19c
+/* To be called between exactly one pair of blk_inc/dec_in_flight() */
ddf19c
+static int coroutine_fn
ddf19c
+blk_do_ioctl(BlockBackend *blk, unsigned long int req, void *buf)
ddf19c
 {
ddf19c
     blk_wait_while_drained(blk);
ddf19c
 
ddf19c
@@ -1514,8 +1547,7 @@ static void blk_ioctl_entry(void *opaque)
ddf19c
     BlkRwCo *rwco = opaque;
ddf19c
     QEMUIOVector *qiov = rwco->iobuf;
ddf19c
 
ddf19c
-    rwco->ret = blk_co_ioctl(rwco->blk, rwco->offset,
ddf19c
-                             qiov->iov[0].iov_base);
ddf19c
+    rwco->ret = blk_do_ioctl(rwco->blk, rwco->offset, qiov->iov[0].iov_base);
ddf19c
     aio_wait_kick();
ddf19c
 }
ddf19c
 
ddf19c
@@ -1529,7 +1561,7 @@ static void blk_aio_ioctl_entry(void *opaque)
ddf19c
     BlkAioEmAIOCB *acb = opaque;
ddf19c
     BlkRwCo *rwco = &acb->rwco;
ddf19c
 
ddf19c
-    rwco->ret = blk_co_ioctl(rwco->blk, rwco->offset, rwco->iobuf);
ddf19c
+    rwco->ret = blk_do_ioctl(rwco->blk, rwco->offset, rwco->iobuf);
ddf19c
 
ddf19c
     blk_aio_complete(acb);
ddf19c
 }
ddf19c
@@ -1540,7 +1572,9 @@ BlockAIOCB *blk_aio_ioctl(BlockBackend *blk, unsigned long int req, void *buf,
ddf19c
     return blk_aio_prwv(blk, req, 0, buf, blk_aio_ioctl_entry, 0, cb, opaque);
ddf19c
 }
ddf19c
 
ddf19c
-int blk_co_pdiscard(BlockBackend *blk, int64_t offset, int bytes)
ddf19c
+/* To be called between exactly one pair of blk_inc/dec_in_flight() */
ddf19c
+static int coroutine_fn
ddf19c
+blk_do_pdiscard(BlockBackend *blk, int64_t offset, int bytes)
ddf19c
 {
ddf19c
     int ret;
ddf19c
 
ddf19c
@@ -1559,7 +1593,7 @@ static void blk_aio_pdiscard_entry(void *opaque)
ddf19c
     BlkAioEmAIOCB *acb = opaque;
ddf19c
     BlkRwCo *rwco = &acb->rwco;
ddf19c
 
ddf19c
-    rwco->ret = blk_co_pdiscard(rwco->blk, rwco->offset, acb->bytes);
ddf19c
+    rwco->ret = blk_do_pdiscard(rwco->blk, rwco->offset, acb->bytes);
ddf19c
     blk_aio_complete(acb);
ddf19c
 }
ddf19c
 
ddf19c
@@ -1571,12 +1605,23 @@ BlockAIOCB *blk_aio_pdiscard(BlockBackend *blk,
ddf19c
                         cb, opaque);
ddf19c
 }
ddf19c
 
ddf19c
+int coroutine_fn blk_co_pdiscard(BlockBackend *blk, int64_t offset, int bytes)
ddf19c
+{
ddf19c
+    int ret;
ddf19c
+
ddf19c
+    blk_inc_in_flight(blk);
ddf19c
+    ret = blk_do_pdiscard(blk, offset, bytes);
ddf19c
+    blk_dec_in_flight(blk);
ddf19c
+
ddf19c
+    return ret;
ddf19c
+}
ddf19c
+
ddf19c
 static void blk_pdiscard_entry(void *opaque)
ddf19c
 {
ddf19c
     BlkRwCo *rwco = opaque;
ddf19c
     QEMUIOVector *qiov = rwco->iobuf;
ddf19c
 
ddf19c
-    rwco->ret = blk_co_pdiscard(rwco->blk, rwco->offset, qiov->size);
ddf19c
+    rwco->ret = blk_do_pdiscard(rwco->blk, rwco->offset, qiov->size);
ddf19c
     aio_wait_kick();
ddf19c
 }
ddf19c
 
ddf19c
@@ -1585,7 +1630,8 @@ int blk_pdiscard(BlockBackend *blk, int64_t offset, int bytes)
ddf19c
     return blk_prw(blk, offset, NULL, bytes, blk_pdiscard_entry, 0);
ddf19c
 }
ddf19c
 
ddf19c
-int blk_co_flush(BlockBackend *blk)
ddf19c
+/* To be called between exactly one pair of blk_inc/dec_in_flight() */
ddf19c
+static int coroutine_fn blk_do_flush(BlockBackend *blk)
ddf19c
 {
ddf19c
     blk_wait_while_drained(blk);
ddf19c
 
ddf19c
@@ -1601,7 +1647,7 @@ static void blk_aio_flush_entry(void *opaque)
ddf19c
     BlkAioEmAIOCB *acb = opaque;
ddf19c
     BlkRwCo *rwco = &acb->rwco;
ddf19c
 
ddf19c
-    rwco->ret = blk_co_flush(rwco->blk);
ddf19c
+    rwco->ret = blk_do_flush(rwco->blk);
ddf19c
     blk_aio_complete(acb);
ddf19c
 }
ddf19c
 
ddf19c
@@ -1611,10 +1657,21 @@ BlockAIOCB *blk_aio_flush(BlockBackend *blk,
ddf19c
     return blk_aio_prwv(blk, 0, 0, NULL, blk_aio_flush_entry, 0, cb, opaque);
ddf19c
 }
ddf19c
 
ddf19c
+int coroutine_fn blk_co_flush(BlockBackend *blk)
ddf19c
+{
ddf19c
+    int ret;
ddf19c
+
ddf19c
+    blk_inc_in_flight(blk);
ddf19c
+    ret = blk_do_flush(blk);
ddf19c
+    blk_dec_in_flight(blk);
ddf19c
+
ddf19c
+    return ret;
ddf19c
+}
ddf19c
+
ddf19c
 static void blk_flush_entry(void *opaque)
ddf19c
 {
ddf19c
     BlkRwCo *rwco = opaque;
ddf19c
-    rwco->ret = blk_co_flush(rwco->blk);
ddf19c
+    rwco->ret = blk_do_flush(rwco->blk);
ddf19c
     aio_wait_kick();
ddf19c
 }
ddf19c
 
ddf19c
diff --git a/include/sysemu/block-backend.h b/include/sysemu/block-backend.h
ddf19c
index b198dec..9bbdbd6 100644
ddf19c
--- a/include/sysemu/block-backend.h
ddf19c
+++ b/include/sysemu/block-backend.h
ddf19c
@@ -171,7 +171,6 @@ BlockAIOCB *blk_aio_pdiscard(BlockBackend *blk, int64_t offset, int bytes,
ddf19c
                              BlockCompletionFunc *cb, void *opaque);
ddf19c
 void blk_aio_cancel(BlockAIOCB *acb);
ddf19c
 void blk_aio_cancel_async(BlockAIOCB *acb);
ddf19c
-int blk_co_ioctl(BlockBackend *blk, unsigned long int req, void *buf);
ddf19c
 int blk_ioctl(BlockBackend *blk, unsigned long int req, void *buf);
ddf19c
 BlockAIOCB *blk_aio_ioctl(BlockBackend *blk, unsigned long int req, void *buf,
ddf19c
                           BlockCompletionFunc *cb, void *opaque);
ddf19c
-- 
ddf19c
1.8.3.1
ddf19c