On Thu, Mar 05, 2020 at 06:28:29PM +0100, Paolo Bonzini wrote: > On 05/03/20 18:08, Stefan Hajnoczi wrote: > > + /* > > + * List of handlers participating in userspace polling. Accessed > > almost > > + * exclusively from aio_poll() and therefore not an RCU list. > > Protected by > > + * ctx->list_lock. > > + */ > > + AioHandlerList poll_aio_handlers; > > + > > Not sure I understand the "almost" part. If it's accessed only from > aio_poll() it is protected via either AIO_WAIT_WHILE or the BQL, not by > ctx->list_lock; if it's protected by ctx->list_lock (using > qemu_lockcnt_inc in readers), it is an RCU list.
aio_remove_fd_handler() removes nodes from the list during aio_set_fd_handler(), but only while holding ctx->list_lock and the count is zero (no readers). All other access is done from with ctx->list_lock incremented. This code needs to be reentrant in case of nested aio_poll() but nothing else will access the list at the same time. Therefore RCU is not needed. ctx->list_lock acts more like a rwlock. Stefan
signature.asc
Description: PGP signature