mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-02 15:23:53 -06:00
AioContext: speed up aio_notify
In many cases, the call to event_notifier_set in aio_notify is unnecessary. In particular, if we are executing aio_dispatch, or if aio_poll is not blocking, we know that we will soon get to the next loop iteration (if necessary); the thread that hosts the AioContext's event loop does not need any nudging. The patch includes a Promela formal model that shows that this really works and does not need any further complication such as generation counts. It needs a memory barrier though. The generation counts are not needed because any change to ctx->dispatching after the memory barrier is okay for aio_notify. If it changes from zero to one, it is the right thing to skip event_notifier_set. If it changes from one to zero, the event_notifier_set is unnecessary but harmless. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
ef508f427b
commit
0ceb849bd3
4 changed files with 164 additions and 2 deletions
|
@ -60,8 +60,14 @@ struct AioContext {
|
|||
*/
|
||||
int walking_handlers;
|
||||
|
||||
/* Used to avoid unnecessary event_notifier_set calls in aio_notify.
|
||||
* Writes protected by lock or BQL, reads are lockless.
|
||||
*/
|
||||
bool dispatching;
|
||||
|
||||
/* lock to protect between bh's adders and deleter */
|
||||
QemuMutex bh_lock;
|
||||
|
||||
/* Anchor of the list of Bottom Halves belonging to the context */
|
||||
struct QEMUBH *first_bh;
|
||||
|
||||
|
@ -83,6 +89,9 @@ struct AioContext {
|
|||
QEMUTimerListGroup tlg;
|
||||
};
|
||||
|
||||
/* Used internally to synchronize aio_poll against qemu_bh_schedule. */
|
||||
void aio_set_dispatching(AioContext *ctx, bool dispatching);
|
||||
|
||||
/**
|
||||
* aio_context_new: Allocate a new AioContext.
|
||||
*
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue