65 lines
3.0 KiB
Diff
65 lines
3.0 KiB
Diff
From 0e651f939d3fd65071a8edc8090a777bdb45b921 Mon Sep 17 00:00:00 2001
|
|
From: Kevin Wolf <kwolf@redhat.com>
|
|
Date: Wed, 10 Oct 2018 20:21:57 +0100
|
|
Subject: aio-wait: Increase num_waiters even in home thread
|
|
|
|
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
|
Message-id: <20181010202213.7372-19-kwolf@redhat.com>
|
|
Patchwork-id: 82609
|
|
O-Subject: [RHEL-8 qemu-kvm PATCH 28/44] aio-wait: Increase num_waiters even in home thread
|
|
Bugzilla: 1637976
|
|
RH-Acked-by: Max Reitz <mreitz@redhat.com>
|
|
RH-Acked-by: John Snow <jsnow@redhat.com>
|
|
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
|
|
|
Even if AIO_WAIT_WHILE() is called in the home context of the
|
|
AioContext, we still want to allow the condition to change depending on
|
|
other threads as long as they kick the AioWait. Specfically block jobs
|
|
can be running in an I/O thread and should then be able to kick a drain
|
|
in the main loop context.
|
|
|
|
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
|
Reviewed-by: Fam Zheng <famz@redhat.com>
|
|
(cherry picked from commit 486574483aba988c83b20e7d3f1ccd50c4c333d8)
|
|
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
|
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
|
---
|
|
include/block/aio-wait.h | 6 +++---
|
|
1 file changed, 3 insertions(+), 3 deletions(-)
|
|
|
|
diff --git a/include/block/aio-wait.h b/include/block/aio-wait.h
|
|
index c85a62f..600fad1 100644
|
|
--- a/include/block/aio-wait.h
|
|
+++ b/include/block/aio-wait.h
|
|
@@ -76,6 +76,8 @@ typedef struct {
|
|
bool waited_ = false; \
|
|
AioWait *wait_ = (wait); \
|
|
AioContext *ctx_ = (ctx); \
|
|
+ /* Increment wait_->num_waiters before evaluating cond. */ \
|
|
+ atomic_inc(&wait_->num_waiters); \
|
|
if (ctx_ && in_aio_context_home_thread(ctx_)) { \
|
|
while ((cond)) { \
|
|
aio_poll(ctx_, true); \
|
|
@@ -84,8 +86,6 @@ typedef struct {
|
|
} else { \
|
|
assert(qemu_get_current_aio_context() == \
|
|
qemu_get_aio_context()); \
|
|
- /* Increment wait_->num_waiters before evaluating cond. */ \
|
|
- atomic_inc(&wait_->num_waiters); \
|
|
while ((cond)) { \
|
|
if (ctx_) { \
|
|
aio_context_release(ctx_); \
|
|
@@ -96,8 +96,8 @@ typedef struct {
|
|
} \
|
|
waited_ = true; \
|
|
} \
|
|
- atomic_dec(&wait_->num_waiters); \
|
|
} \
|
|
+ atomic_dec(&wait_->num_waiters); \
|
|
waited_; })
|
|
|
|
/**
|
|
--
|
|
1.8.3.1
|
|
|