All of lore.kernel.org
 help / color / mirror / Atom feed
From: Emanuele Giuseppe Esposito <eesposit@redhat.com>
To: qemu-block@nongnu.org
Cc: Kevin Wolf <kwolf@redhat.com>, Hanna Reitz <hreitz@redhat.com>,
	Paolo Bonzini <pbonzini@redhat.com>, John Snow <jsnow@redhat.com>,
	Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>,
	Wen Congyang <wencongyang2@huawei.com>,
	Xie Changlong <xiechanglong.d@gmail.com>,
	Markus Armbruster <armbru@redhat.com>,
	Stefan Hajnoczi <stefanha@redhat.com>, Fam Zheng <fam@euphon.net>,
	qemu-devel@nongnu.org,
	Emanuele Giuseppe Esposito <eesposit@redhat.com>,
	Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>
Subject: [PATCH v9 04/21] aio-wait.h: introduce AIO_WAIT_WHILE_UNLOCKED
Date: Wed,  6 Jul 2022 16:15:16 -0400	[thread overview]
Message-ID: <20220706201533.289775-5-eesposit@redhat.com> (raw)
In-Reply-To: <20220706201533.289775-1-eesposit@redhat.com>

Same as AIO_WAIT_WHILE macro, but if we are in the Main loop
do not release and then acquire ctx_ 's aiocontext.

Once all Aiocontext locks go away, this macro will replace
AIO_WAIT_WHILE.

Signed-off-by: Emanuele Giuseppe Esposito <eesposit@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>
---
 include/block/aio-wait.h | 17 +++++++++++++----
 1 file changed, 13 insertions(+), 4 deletions(-)

diff --git a/include/block/aio-wait.h b/include/block/aio-wait.h
index 54840f8622..a61f82c617 100644
--- a/include/block/aio-wait.h
+++ b/include/block/aio-wait.h
@@ -59,10 +59,13 @@ typedef struct {
 extern AioWait global_aio_wait;
 
 /**
- * AIO_WAIT_WHILE:
+ * _AIO_WAIT_WHILE:
  * @ctx: the aio context, or NULL if multiple aio contexts (for which the
  *       caller does not hold a lock) are involved in the polling condition.
  * @cond: wait while this conditional expression is true
+ * @unlock: whether to unlock and then lock again @ctx. This apples
+ * only when waiting for another AioContext from the main loop.
+ * Otherwise it's ignored.
  *
  * Wait while a condition is true.  Use this to implement synchronous
  * operations that require event loop activity.
@@ -75,7 +78,7 @@ extern AioWait global_aio_wait;
  * wait on conditions between two IOThreads since that could lead to deadlock,
  * go via the main loop instead.
  */
-#define AIO_WAIT_WHILE(ctx, cond) ({                               \
+#define _AIO_WAIT_WHILE(ctx, cond, unlock) ({                      \
     bool waited_ = false;                                          \
     AioWait *wait_ = &global_aio_wait;                             \
     AioContext *ctx_ = (ctx);                                      \
@@ -92,11 +95,11 @@ extern AioWait global_aio_wait;
         assert(qemu_get_current_aio_context() ==                   \
                qemu_get_aio_context());                            \
         while ((cond)) {                                           \
-            if (ctx_) {                                            \
+            if (unlock && ctx_) {                                  \
                 aio_context_release(ctx_);                         \
             }                                                      \
             aio_poll(qemu_get_aio_context(), true);                \
-            if (ctx_) {                                            \
+            if (unlock && ctx_) {                                  \
                 aio_context_acquire(ctx_);                         \
             }                                                      \
             waited_ = true;                                        \
@@ -105,6 +108,12 @@ extern AioWait global_aio_wait;
     qatomic_dec(&wait_->num_waiters);                              \
     waited_; })
 
+#define AIO_WAIT_WHILE(ctx, cond)                                  \
+    _AIO_WAIT_WHILE(ctx, cond, true)
+
+#define AIO_WAIT_WHILE_UNLOCKED(ctx, cond)                         \
+    _AIO_WAIT_WHILE(ctx, cond, false)
+
 /**
  * aio_wait_kick:
  * Wake up the main thread if it is waiting on AIO_WAIT_WHILE().  During
-- 
2.31.1



  parent reply	other threads:[~2022-07-06 21:49 UTC|newest]

Thread overview: 53+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-07-06 20:15 [PATCH v9 00/21] job: replace AioContext lock with job_mutex Emanuele Giuseppe Esposito
2022-07-06 20:15 ` [PATCH v9 01/21] job.c: make job_mutex and job_lock/unlock() public Emanuele Giuseppe Esposito
2022-07-06 20:15 ` [PATCH v9 02/21] job.h: categorize fields in struct Job Emanuele Giuseppe Esposito
2022-07-06 20:15 ` [PATCH v9 03/21] job.c: API functions not used outside should be static Emanuele Giuseppe Esposito
2022-07-06 20:15 ` Emanuele Giuseppe Esposito [this message]
2022-07-06 20:15 ` [PATCH v9 05/21] job.c: add job_lock/unlock while keeping job.h intact Emanuele Giuseppe Esposito
2022-07-08 19:25   ` Vladimir Sementsov-Ogievskiy
2022-07-11  7:30     ` Emanuele Giuseppe Esposito
2022-07-11 10:40       ` Vladimir Sementsov-Ogievskiy
2022-07-06 20:15 ` [PATCH v9 06/21] job: move and update comments from blockjob.c Emanuele Giuseppe Esposito
2022-07-11  8:56   ` Vladimir Sementsov-Ogievskiy
2022-07-06 20:15 ` [PATCH v9 07/21] blockjob: introduce block_job _locked() APIs Emanuele Giuseppe Esposito
2022-07-11 12:04   ` Vladimir Sementsov-Ogievskiy
2022-07-11 12:24     ` Emanuele Giuseppe Esposito
2022-07-06 20:15 ` [PATCH v9 08/21] jobs: add job lock in find_* functions Emanuele Giuseppe Esposito
2022-07-11 12:20   ` Vladimir Sementsov-Ogievskiy
2022-07-06 20:15 ` [PATCH v9 09/21] jobs: use job locks also in the unit tests Emanuele Giuseppe Esposito
2022-07-11 13:08   ` Vladimir Sementsov-Ogievskiy
2022-07-19 12:00     ` Emanuele Giuseppe Esposito
2022-07-20 13:06       ` Vladimir Sementsov-Ogievskiy
2022-07-20 14:22         ` Emanuele Giuseppe Esposito
2022-07-06 20:15 ` [PATCH v9 10/21] block/mirror.c: use of job helpers in drivers to avoid TOC/TOU Emanuele Giuseppe Esposito
2022-07-11 13:15   ` Vladimir Sementsov-Ogievskiy
2022-07-06 20:15 ` [PATCH v9 11/21] jobs: group together API calls under the same job lock Emanuele Giuseppe Esposito
2022-07-11 13:26   ` Vladimir Sementsov-Ogievskiy
2022-07-19 12:40     ` Emanuele Giuseppe Esposito
2022-07-20 13:10       ` Vladimir Sementsov-Ogievskiy
2022-07-06 20:15 ` [PATCH v9 12/21] commit and mirror: create new nodes using bdrv_get_aio_context, and not the job aiocontext Emanuele Giuseppe Esposito
2022-07-11 13:32   ` Vladimir Sementsov-Ogievskiy
2022-07-06 20:15 ` [PATCH v9 13/21] job: detect change of aiocontext within job coroutine Emanuele Giuseppe Esposito
2022-07-11 13:59   ` Vladimir Sementsov-Ogievskiy
2022-07-06 20:15 ` [PATCH v9 14/21] jobs: protect job.aio_context with BQL and job_mutex Emanuele Giuseppe Esposito
2022-07-11 14:19   ` Vladimir Sementsov-Ogievskiy
2022-07-19 12:48     ` Emanuele Giuseppe Esposito
2022-07-06 20:15 ` [PATCH v9 15/21] job.c: enable job lock/unlock and remove Aiocontext locks Emanuele Giuseppe Esposito
2022-07-11 14:33   ` Vladimir Sementsov-Ogievskiy
2022-07-19 12:51     ` Emanuele Giuseppe Esposito
2022-07-06 20:15 ` [PATCH v9 16/21] block_job_query: remove atomic read Emanuele Giuseppe Esposito
2022-07-11 14:37   ` Vladimir Sementsov-Ogievskiy
2022-07-06 20:15 ` [PATCH v9 17/21] blockjob.h: categorize fields in struct BlockJob Emanuele Giuseppe Esposito
2022-07-11 14:44   ` Vladimir Sementsov-Ogievskiy
2022-07-19 12:53     ` Emanuele Giuseppe Esposito
2022-07-06 20:15 ` [PATCH v9 18/21] blockjob: rename notifier callbacks as _locked Emanuele Giuseppe Esposito
2022-07-11 14:47   ` Vladimir Sementsov-Ogievskiy
2022-07-06 20:15 ` [PATCH v9 19/21] blockjob: protect iostatus field in BlockJob struct Emanuele Giuseppe Esposito
2022-07-11 14:51   ` Vladimir Sementsov-Ogievskiy
2022-07-19 13:07     ` Emanuele Giuseppe Esposito
2022-07-20 13:15       ` Vladimir Sementsov-Ogievskiy
2022-07-20 14:06         ` Emanuele Giuseppe Esposito
2022-07-06 20:15 ` [PATCH v9 20/21] blockjob: remove unused functions Emanuele Giuseppe Esposito
2022-07-06 20:15 ` [PATCH v9 21/21] job: " Emanuele Giuseppe Esposito
2022-07-11 15:57 ` [PATCH v9 00/21] job: replace AioContext lock with job_mutex Vladimir Sementsov-Ogievskiy
2022-07-19 13:13   ` Emanuele Giuseppe Esposito

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20220706201533.289775-5-eesposit@redhat.com \
    --to=eesposit@redhat.com \
    --cc=armbru@redhat.com \
    --cc=fam@euphon.net \
    --cc=hreitz@redhat.com \
    --cc=jsnow@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --cc=stefanha@redhat.com \
    --cc=vsementsov@virtuozzo.com \
    --cc=vsementsov@yandex-team.ru \
    --cc=wencongyang2@huawei.com \
    --cc=xiechanglong.d@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.