]> xenbits.xensource.com Git - xen.git/commitdiff
x86 iommu: Better synchronisation on dirq_mask.
authorKeir Fraser <keir.fraser@citrix.com>
Tue, 22 Apr 2008 10:46:41 +0000 (11:46 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Tue, 22 Apr 2008 10:46:41 +0000 (11:46 +0100)
Signed-off-by: Keir Fraser <keir.fraser@citrix.com>
xen/arch/x86/hvm/svm/intr.c
xen/arch/x86/hvm/vmx/intr.c

index 4b3dcd33add3593872c759ec0b8d7f0dcd38613c..3463ac42a68128b29ef0b58de7c0e12f811d1c09 100644 (file)
@@ -109,8 +109,10 @@ static void svm_dirq_assist(struct vcpu *v)
           irq < NR_IRQS;
           irq = find_next_bit(hvm_irq_dpci->dirq_mask, NR_IRQS, irq + 1) )
     {
+        if ( !test_and_clear_bit(irq, &hvm_irq_dpci->dirq_mask) )
+            continue;
+
         stop_timer(&hvm_irq_dpci->hvm_timer[irq_to_vector(irq)]);
-        clear_bit(irq, &hvm_irq_dpci->dirq_mask);
 
         list_for_each_entry ( digl, &hvm_irq_dpci->mirq[irq].digl_list, list )
         {
index dc47430a63ae54bc37cd1e325fdc9f2d12a00056..3fcfc5217521ac781497053b294db3b5dc7de676 100644 (file)
@@ -118,8 +118,10 @@ static void vmx_dirq_assist(struct vcpu *v)
           irq < NR_IRQS;
           irq = find_next_bit(hvm_irq_dpci->dirq_mask, NR_IRQS, irq + 1) )
     {
+        if ( !test_and_clear_bit(irq, &hvm_irq_dpci->dirq_mask) )
+            continue;
+
         stop_timer(&hvm_irq_dpci->hvm_timer[irq_to_vector(irq)]);
-        clear_bit(irq, &hvm_irq_dpci->dirq_mask);
 
         list_for_each_entry ( digl, &hvm_irq_dpci->mirq[irq].digl_list, list )
         {