Am 06.09.2012 09:23, schrieb Paolo Bonzini: > Il 05/09/2012 11:57, Bharata B Rao ha scritto: >>>> What could be the issue here ? In general, how do I ensure that my >>>> aio calls get completed correctly in such scenarios where bdrv_read etc >>>> are called from coroutine context rather than from main thread context ? >> One way to handle this is not to do completion from gluster thread but >> instead schedule a BH that does the completion. In fact I had this approach >> in the earlier versions, but resorted to directly calling completion from >> gluster thread as I didn't see the value of using a BH for completion. >> But I guess its indeed needed to support such scenarios (qcow2 image creation >> on gluster backend). > > I think the problem is that we're calling bdrv_drain_all() from > coroutine context. This is problematic because then the current > coroutine won't yield and won't give other coroutines an occasion to run. > > This could be fixed by checking whether we're in coroutine context in > bdrv_drain_all(). If so, instead of draining the queues directly, > schedule a bottom half that does bdrv_drain_all() followed by > qemu_coroutine_enter(), and yield.
Hm, could be an option, but I'm not sure if there's too much magic going on then... > If it works, I think this change would be preferrable to using a "magic" > BH in every driver. The way it works in posix-aio-compat is that the request is first removed from the list and then the callback is called. This way posix_aio_flush() can return 0 and bdrv_drain_all() completes. Kevin