On 1/31/22 15:54, Kevin Wolf wrote:
So I guess the decision depends on what you're going to use the
categories in the future. I get the feeling that we have one more
category than this series introduces:
* Global State (must run from the main thread/hold the BQL)
* I/O (can be called in any thread under the AioContext lock, doesn't
modify global state, drain waits for it to complete)
* Common (doesn't even touch global state)
* iothread dependent (can run without the BQL, but only in one specific
iothread while holding its AioContext lock; this would cover at least
AIO_WAIT_WHILE() and all of its indirect callers)
Yes, I agree.
bdrv_drained_begin and friends are somewhat like a coroutine-level
lock/unlock primitive, so they need to be available in both the main
thread and the iothread. They could be called iothread dependent,
AioContext dependent, or perhaps "global or I/O".
That said, even if they are a different category, I think it makes sense
to leave them in the same header file as I/O functions, because I/O
functions are locked out between drained_begin and drained_end.
Paolo