# HG changeset patch # User Keir Fraser # Date 1277739919 -3600 # Node ID 059a12afce52a213db56bd8e9442d9eeadfdd34c # Parent 7e46fdbe8a1187cee2ab609256300d7967f37f06 vtd: Only kill_timer() an init_timer()'ed timer. Signed-off-by: Keir Fraser Index: xen-4.0.1-testing/xen/drivers/passthrough/io.c =================================================================== --- xen-4.0.1-testing.orig/xen/drivers/passthrough/io.c +++ xen-4.0.1-testing/xen/drivers/passthrough/io.c @@ -27,7 +27,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: xen-4.0.1-testing/xen/drivers/passthrough/pci.c =================================================================== --- xen-4.0.1-testing.orig/xen/drivers/passthrough/pci.c +++ xen-4.0.1-testing/xen/drivers/passthrough/pci.c @@ -257,7 +257,9 @@ static void pci_clean_dpci_irqs(struct 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: xen-4.0.1-testing/xen/include/xen/iommu.h =================================================================== --- xen-4.0.1-testing.orig/xen/include/xen/iommu.h +++ xen-4.0.1-testing/xen/include/xen/iommu.h @@ -103,6 +103,7 @@ void hvm_dpci_isairq_eoi(struct domain * 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]"