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

Reply via email to