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

Reply via email to