On Thu, 04/21 10:04, Fam Zheng wrote: > This ensures the bdrv_drained_begin() in block layer is effective and > fixes launchpad bug #1570134. > > Signed-off-by: Fam Zheng <[email protected]> > --- > hw/virtio/virtio.c | 7 ++++--- > 1 file changed, 4 insertions(+), 3 deletions(-) > > diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c > index f745c4a..002c2c6 100644 > --- a/hw/virtio/virtio.c > +++ b/hw/virtio/virtio.c > @@ -1829,10 +1829,11 @@ void > virtio_queue_set_host_notifier_fd_handler(VirtQueue *vq, bool assign, > bool set_handler) > { > if (assign && set_handler) { > - event_notifier_set_handler(&vq->host_notifier, > - virtio_queue_host_notifier_read); > + aio_set_event_notifier(qemu_get_aio_context(), &vq->host_notifier, > + true, virtio_queue_host_notifier_read); > } else { > - event_notifier_set_handler(&vq->host_notifier, NULL); > + aio_set_event_notifier(qemu_get_aio_context(), &vq->host_notifier, > + true, NULL); > } > if (!assign) { > /* Test and clear notifier before after disabling event,
This isn't the right fix, at least not in the intended way. The crash is gone because in this patch the handler is moved from iohandler's AioContext to the main loop AioContext, on which the mirror BH is scheduled, and consequently the mirror BH handler always runs first than the VQ handler. For 2.6 I think what we could do is reverting some changes in 5a7e7a0bad1 for non-dataplane case, i.e. call mirror_exit directly in mirror_run. It's too late today and I'll look into this tomorrow. The fix will probably be left for -rc4. Fam
