vtd: Only kill_timer() an init_timer()'ed timer.
authorKeir Fraser <keir.fraser@citrix.com>
Mon, 28 Jun 2010 15:45:19 +0000 (16:45 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Mon, 28 Jun 2010 15:45:19 +0000 (16:45 +0100)
Signed-off-by: Keir Fraser <keir.fraser@citrix.com>
xen/drivers/passthrough/io.c
xen/drivers/passthrough/pci.c
xen/include/xen/iommu.h

index 8e14af75a2a29adf1b6c0d2ce71790f13dbd26af..e7a6eb01dea947c77c0a75b9720ec799a125d688 100644 (file)
@@ -28,7 +28,7 @@
 
 static void hvm_dirq_assist(unsigned long _d);
 
-static int pt_irq_need_timer(uint32_t flags)
+bool_t pt_irq_need_timer(uint32_t flags)
 {
     return !(flags & (HVM_IRQ_DPCI_GUEST_MSI | HVM_IRQ_DPCI_TRANSLATE));
 }
index bd8da7fe1a12a9b255bc28f8384f5a2ed85e0df6..d6d833142bc6842512a11e9eeb52561cb61edf64 100644 (file)
@@ -260,7 +260,9 @@ static void pci_clean_dpci_irqs(struct domain *d)
               i = find_next_bit(hvm_irq_dpci->mapping, d->nr_pirqs, i + 1) )
         {
             pirq_guest_unbind(d, i);
-            kill_timer(&hvm_irq_dpci->hvm_timer[domain_pirq_to_irq(d, i)]);
+
+            if ( pt_irq_need_timer(hvm_irq_dpci->mirq[i].flags) )
+                kill_timer(&hvm_irq_dpci->hvm_timer[domain_pirq_to_irq(d, i)]);
 
             list_for_each_safe ( digl_list, tmp,
                                  &hvm_irq_dpci->mirq[i].digl_list )
index 5181ffc5be69c08223e0425086d0e64fe60063e1..49f9a34eda82448c9b8d4d471fa60d74b6342e37 100644 (file)
@@ -100,6 +100,7 @@ void hvm_dpci_isairq_eoi(struct domain *d, unsigned int isairq);
 struct hvm_irq_dpci *domain_get_irq_dpci(struct domain *domain);
 int domain_set_irq_dpci(struct domain *domain, struct hvm_irq_dpci *dpci);
 void free_hvm_irq_dpci(struct hvm_irq_dpci *dpci);
+bool_t pt_irq_need_timer(uint32_t flags);
 
 #define PT_IRQ_TIME_OUT MILLISECS(8)
 #define VTDPREFIX "[VT-D]"