qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Stefan Hajnoczi <stefanha@redhat.com>
To: qemu-devel@nongnu.org
Cc: "Philippe Mathieu-Daudé" <philmd@linaro.org>,
	"Stefan Hajnoczi" <stefanha@redhat.com>,
	"Vladimir Sementsov-Ogievskiy" <vsementsov@yandex-team.ru>,
	"Cleber Rosa" <crosa@redhat.com>,
	"Xie Changlong" <xiechanglong.d@gmail.com>,
	"Paul Durrant" <paul@xen.org>, "Ari Sundholm" <ari@tuxera.com>,
	"Jason Wang" <jasowang@redhat.com>,
	"Eric Blake" <eblake@redhat.com>, "John Snow" <jsnow@redhat.com>,
	"Eduardo Habkost" <eduardo@habkost.net>,
	"Wen Congyang" <wencongyang2@huawei.com>,
	"Alberto Garcia" <berto@igalia.com>,
	"Anthony Perard" <anthony.perard@citrix.com>,
	"Michael S. Tsirkin" <mst@redhat.com>,
	"Stefano Stabellini" <sstabellini@kernel.org>,
	qemu-block@nongnu.org, "Juan Quintela" <quintela@redhat.com>,
	"Paolo Bonzini" <pbonzini@redhat.com>,
	"Kevin Wolf" <kwolf@redhat.com>, "Coiby Xu" <Coiby.Xu@gmail.com>,
	"Fabiano Rosas" <farosas@suse.de>,
	"Hanna Reitz" <hreitz@redhat.com>,
	"Zhang Chen" <chen.zhang@intel.com>,
	"Daniel P. Berrangé" <berrange@redhat.com>,
	"Pavel Dovgalyuk" <pavel.dovgaluk@ispras.ru>,
	"Peter Xu" <peterx@redhat.com>,
	"Emanuele Giuseppe Esposito" <eesposit@redhat.com>,
	"Fam Zheng" <fam@euphon.net>,
	"Leonardo Bras" <leobras@redhat.com>,
	"David Hildenbrand" <david@redhat.com>,
	"Li Zhijian" <lizhijian@fujitsu.com>,
	xen-devel@lists.xenproject.org
Subject: [PATCH v2 11/14] docs: remove AioContext lock from IOThread docs
Date: Tue,  5 Dec 2023 13:20:08 -0500	[thread overview]
Message-ID: <20231205182011.1976568-12-stefanha@redhat.com> (raw)
In-Reply-To: <20231205182011.1976568-1-stefanha@redhat.com>

Encourage the use of locking primitives and stop mentioning the
AioContext lock since it is being removed.

Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
---
 docs/devel/multiple-iothreads.txt | 45 +++++++++++--------------------
 1 file changed, 15 insertions(+), 30 deletions(-)

diff --git a/docs/devel/multiple-iothreads.txt b/docs/devel/multiple-iothreads.txt
index a3e949f6b3..4865196bde 100644
--- a/docs/devel/multiple-iothreads.txt
+++ b/docs/devel/multiple-iothreads.txt
@@ -88,27 +88,18 @@ loop, depending on which AioContext instance the caller passes in.
 
 How to synchronize with an IOThread
 -----------------------------------
-AioContext is not thread-safe so some rules must be followed when using file
-descriptors, event notifiers, timers, or BHs across threads:
+Variables that can be accessed by multiple threads require some form of
+synchronization such as qemu_mutex_lock(), rcu_read_lock(), etc.
 
-1. AioContext functions can always be called safely.  They handle their
-own locking internally.
-
-2. Other threads wishing to access the AioContext must use
-aio_context_acquire()/aio_context_release() for mutual exclusion.  Once the
-context is acquired no other thread can access it or run event loop iterations
-in this AioContext.
-
-Legacy code sometimes nests aio_context_acquire()/aio_context_release() calls.
-Do not use nesting anymore, it is incompatible with the BDRV_POLL_WHILE() macro
-used in the block layer and can lead to hangs.
-
-There is currently no lock ordering rule if a thread needs to acquire multiple
-AioContexts simultaneously.  Therefore, it is only safe for code holding the
-QEMU global mutex to acquire other AioContexts.
+AioContext functions like aio_set_fd_handler(), aio_set_event_notifier(),
+aio_bh_new(), and aio_timer_new() are thread-safe. They can be used to trigger
+activity in an IOThread.
 
 Side note: the best way to schedule a function call across threads is to call
-aio_bh_schedule_oneshot().  No acquire/release or locking is needed.
+aio_bh_schedule_oneshot().
+
+The main loop thread can wait synchronously for a condition using
+AIO_WAIT_WHILE().
 
 AioContext and the block layer
 ------------------------------
@@ -124,22 +115,16 @@ Block layer code must therefore expect to run in an IOThread and avoid using
 old APIs that implicitly use the main loop.  See the "How to program for
 IOThreads" above for information on how to do that.
 
-If main loop code such as a QMP function wishes to access a BlockDriverState
-it must first call aio_context_acquire(bdrv_get_aio_context(bs)) to ensure
-that callbacks in the IOThread do not run in parallel.
-
 Code running in the monitor typically needs to ensure that past
 requests from the guest are completed.  When a block device is running
 in an IOThread, the IOThread can also process requests from the guest
 (via ioeventfd).  To achieve both objects, wrap the code between
 bdrv_drained_begin() and bdrv_drained_end(), thus creating a "drained
-section".  The functions must be called between aio_context_acquire()
-and aio_context_release().  You can freely release and re-acquire the
-AioContext within a drained section.
+section".
 
-Long-running jobs (usually in the form of coroutines) are best scheduled in
-the BlockDriverState's AioContext to avoid the need to acquire/release around
-each bdrv_*() call.  The functions bdrv_add/remove_aio_context_notifier,
-or alternatively blk_add/remove_aio_context_notifier if you use BlockBackends,
-can be used to get a notification whenever bdrv_try_change_aio_context() moves a
+Long-running jobs (usually in the form of coroutines) are often scheduled in
+the BlockDriverState's AioContext.  The functions
+bdrv_add/remove_aio_context_notifier, or alternatively
+blk_add/remove_aio_context_notifier if you use BlockBackends, can be used to
+get a notification whenever bdrv_try_change_aio_context() moves a
 BlockDriverState to a different AioContext.
-- 
2.43.0



  parent reply	other threads:[~2023-12-05 18:23 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-12-05 18:19 [PATCH v2 00/14] aio: remove AioContext lock Stefan Hajnoczi
2023-12-05 18:19 ` [PATCH v2 01/14] virtio-scsi: replace AioContext lock with tmf_bh_lock Stefan Hajnoczi
2023-12-05 18:19 ` [PATCH v2 02/14] scsi: assert that callbacks run in the correct AioContext Stefan Hajnoczi
2023-12-18 15:35   ` Kevin Wolf
2023-12-05 18:20 ` [PATCH v2 03/14] tests: remove aio_context_acquire() tests Stefan Hajnoczi
2023-12-05 18:20 ` [PATCH v2 04/14] aio: make aio_context_acquire()/aio_context_release() a no-op Stefan Hajnoczi
2023-12-19 15:28   ` Kevin Wolf
2023-12-19 18:19     ` Kevin Wolf
2023-12-19 21:23       ` Stefan Hajnoczi
2023-12-20  9:32         ` Kevin Wolf
2023-12-20 13:40           ` Stefan Hajnoczi
2023-12-21  0:30       ` Stefan Hajnoczi
2023-12-05 18:20 ` [PATCH v2 05/14] graph-lock: remove AioContext locking Stefan Hajnoczi
2023-12-05 18:20 ` [PATCH v2 06/14] block: " Stefan Hajnoczi
2023-12-19 15:58   ` Kevin Wolf
2023-12-19 20:04     ` Stefan Hajnoczi
2023-12-20  9:19       ` Kevin Wolf
2023-12-05 18:20 ` [PATCH v2 07/14] block: remove bdrv_co_lock() Stefan Hajnoczi
2023-12-18 15:35   ` Kevin Wolf
2023-12-05 18:20 ` [PATCH v2 08/14] scsi: remove AioContext locking Stefan Hajnoczi
2023-12-18 15:35   ` Kevin Wolf
2023-12-05 18:20 ` [PATCH v2 09/14] aio-wait: draw equivalence between AIO_WAIT_WHILE() and AIO_WAIT_WHILE_UNLOCKED() Stefan Hajnoczi
2023-12-18 15:35   ` Kevin Wolf
2023-12-05 18:20 ` [PATCH v2 10/14] aio: remove aio_context_acquire()/aio_context_release() API Stefan Hajnoczi
2023-12-18 15:36   ` Kevin Wolf
2023-12-05 18:20 ` Stefan Hajnoczi [this message]
2023-12-05 18:20 ` [PATCH v2 12/14] scsi: remove outdated AioContext lock comment Stefan Hajnoczi
2023-12-05 18:20 ` [PATCH v2 13/14] job: remove outdated AioContext locking comments Stefan Hajnoczi
2023-12-05 18:20 ` [PATCH v2 14/14] block: " Stefan Hajnoczi
2023-12-19 12:11   ` Kevin Wolf
2023-12-19 13:03 ` [PATCH v2 00/14] aio: remove AioContext lock Kevin Wolf

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=20231205182011.1976568-12-stefanha@redhat.com \
    --to=stefanha@redhat.com \
    --cc=Coiby.Xu@gmail.com \
    --cc=anthony.perard@citrix.com \
    --cc=ari@tuxera.com \
    --cc=berrange@redhat.com \
    --cc=berto@igalia.com \
    --cc=chen.zhang@intel.com \
    --cc=crosa@redhat.com \
    --cc=david@redhat.com \
    --cc=eblake@redhat.com \
    --cc=eduardo@habkost.net \
    --cc=eesposit@redhat.com \
    --cc=fam@euphon.net \
    --cc=farosas@suse.de \
    --cc=hreitz@redhat.com \
    --cc=jasowang@redhat.com \
    --cc=jsnow@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=leobras@redhat.com \
    --cc=lizhijian@fujitsu.com \
    --cc=mst@redhat.com \
    --cc=paul@xen.org \
    --cc=pavel.dovgaluk@ispras.ru \
    --cc=pbonzini@redhat.com \
    --cc=peterx@redhat.com \
    --cc=philmd@linaro.org \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --cc=quintela@redhat.com \
    --cc=sstabellini@kernel.org \
    --cc=vsementsov@yandex-team.ru \
    --cc=wencongyang2@huawei.com \
    --cc=xen-devel@lists.xenproject.org \
    --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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).