KVM: fix crash on irqfd deassign
Michael S. Tsirkin [Thu, 17 Mar 2011 08:53:33 +0000 (10:53 +0200)]
irqfd in kvm used flush_work incorrectly: it assumed that work scheduled
previously can't run after flush_work, but since kvm uses a non-reentrant
workqueue (by means of schedule_work) we need flush_work_sync to get that
guarantee.

Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Reported-by: Jean-Philippe Menil <jean-philippe.menil@univ-nantes.fr>
Tested-by: Jean-Philippe Menil <jean-philippe.menil@univ-nantes.fr>
Signed-off-by: Avi Kivity <avi@redhat.com>

virt/kvm/eventfd.c

index 3656849..0d1fd51 100644 (file)
@@ -90,7 +90,7 @@ irqfd_shutdown(struct work_struct *work)
         * We know no new events will be scheduled at this point, so block
         * until all previously outstanding events have completed
         */
-       flush_work(&irqfd->inject);
+       flush_work_sync(&irqfd->inject);
 
        /*
         * It is now safe to release the object's resources