[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL v2 17/20] aio_wait_kick: add missing memory barrier
From: |
Kevin Wolf |
Subject: |
[PULL v2 17/20] aio_wait_kick: add missing memory barrier |
Date: |
Fri, 24 Jun 2022 17:41:00 +0200 |
From: Emanuele Giuseppe Esposito <eesposit@redhat.com>
It seems that aio_wait_kick always required a memory barrier
or atomic operation in the caller, but nobody actually
took care of doing it.
Let's put the barrier in the function instead, and pair it
with another one in AIO_WAIT_WHILE. Read aio_wait_kick()
comment for further explanation.
Suggested-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Emanuele Giuseppe Esposito <eesposit@redhat.com>
Message-Id: <20220524173054.12651-1-eesposit@redhat.com>
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
include/block/aio-wait.h | 2 ++
util/aio-wait.c | 16 +++++++++++++++-
2 files changed, 17 insertions(+), 1 deletion(-)
diff --git a/include/block/aio-wait.h b/include/block/aio-wait.h
index b39eefb38d..54840f8622 100644
--- a/include/block/aio-wait.h
+++ b/include/block/aio-wait.h
@@ -81,6 +81,8 @@ extern AioWait global_aio_wait;
AioContext *ctx_ = (ctx); \
/* Increment wait_->num_waiters before evaluating cond. */ \
qatomic_inc(&wait_->num_waiters); \
+ /* Paired with smp_mb in aio_wait_kick(). */ \
+ smp_mb(); \
if (ctx_ && in_aio_context_home_thread(ctx_)) { \
while ((cond)) { \
aio_poll(ctx_, true); \
diff --git a/util/aio-wait.c b/util/aio-wait.c
index bdb3d3af22..98c5accd29 100644
--- a/util/aio-wait.c
+++ b/util/aio-wait.c
@@ -35,7 +35,21 @@ static void dummy_bh_cb(void *opaque)
void aio_wait_kick(void)
{
- /* The barrier (or an atomic op) is in the caller. */
+ /*
+ * Paired with smp_mb in AIO_WAIT_WHILE. Here we have:
+ * write(condition);
+ * aio_wait_kick() {
+ * smp_mb();
+ * read(num_waiters);
+ * }
+ *
+ * And in AIO_WAIT_WHILE:
+ * write(num_waiters);
+ * smp_mb();
+ * read(condition);
+ */
+ smp_mb();
+
if (qatomic_read(&global_aio_wait.num_waiters)) {
aio_bh_schedule_oneshot(qemu_get_aio_context(), dummy_bh_cb, NULL);
}
--
2.35.3
- [PULL v2 09/20] linux-headers: Add vduse.h, (continued)
- [PULL v2 09/20] linux-headers: Add vduse.h, Kevin Wolf, 2022/06/24
- [PULL v2 11/20] vduse-blk: Implement vduse-blk export, Kevin Wolf, 2022/06/24
- [PULL v2 10/20] libvduse: Add VDUSE (vDPA Device in Userspace) library, Kevin Wolf, 2022/06/24
- [PULL v2 08/20] block/export: Abstract out the logic of virtio-blk I/O process, Kevin Wolf, 2022/06/24
- [PULL v2 14/20] qsd: document vduse-blk exports, Kevin Wolf, 2022/06/24
- [PULL v2 15/20] block/rbd: report a better error when namespace does not exist, Kevin Wolf, 2022/06/24
- [PULL v2 12/20] vduse-blk: Add vduse-blk resize support, Kevin Wolf, 2022/06/24
- [PULL v2 16/20] block/gluster: correctly set max_pdiscard, Kevin Wolf, 2022/06/24
- [PULL v2 17/20] aio_wait_kick: add missing memory barrier,
Kevin Wolf <=
- [PULL v2 19/20] vduse-blk: Add serial option, Kevin Wolf, 2022/06/24
- [PULL v2 18/20] nbd: Drop dead code spotted by Coverity, Kevin Wolf, 2022/06/24
- [PULL v2 20/20] vduse-blk: Add name option, Kevin Wolf, 2022/06/24
- Re: [PULL v2 00/20] Block layer patches, Richard Henderson, 2022/06/24