Am 29.11.2017 um 15:49 hat Fam Zheng geschrieben: > While we look at the fixes for 2.11, I briefly prototyped this series > to see if it makes sense as a simplification of the drain API for > 2.12. > > The idea is to let AioContext manage quiesce callbacks, then the block > layer only needs to do the in-flight request waiting. This lets us get > rid of the callback recursion (both up and down).
So essentially you don't drain individual nodes any more, but whole AioContexts. I have a feeeling that this would be a step in the wrong direction. Not only would it completely bypass the path I/O requests take and potentially drain a lot more than is actually necessary, but it also requires that all nodes that are connected in a tree are in the same AioContext. Paolo can say more on this, but my understanding was that the long-term plan is to make the block layer fully thread safe so that any thread could call things on any node. I remember Paolo saying that AioContext was even fully going away in the future. I don't see how this is compatible with your approach. And finally, I don't really think that the recursion is even a problem. The problem is with graph changes made by callbacks that drain allows to run. With your changes, it might be a bit easier to avoid that bdrv_drain() itself gets into trouble due to graph changes, but this doesn't solve the problem for any (possibly indirect) callers of bdrv_drain(). Kevin