# HG changeset patch # Parent e5b12488f07ebb95eec6caf6150f0edf58157494 diff -r e5b12488f07e xen/drivers/passthrough/vtd/iommu.c --- a/xen/drivers/passthrough/vtd/iommu.c Tue Dec 13 17:29:12 2011 +0100 +++ b/xen/drivers/passthrough/vtd/iommu.c Wed Dec 14 10:08:45 2011 +0100 @@ -918,10 +918,9 @@ static void iommu_fault_status(u32 fault } #define PRIMARY_FAULT_REG_LEN (16) -static void iommu_page_fault(int irq, void *dev_id, - struct cpu_user_regs *regs) +static void do_iommu_page_fault(unsigned long iommu_ptr) { - struct iommu *iommu = dev_id; + struct iommu *iommu = (struct iommu*) iommu_ptr; int reg, fault_index; u32 fault_status; unsigned long flags; @@ -996,6 +995,14 @@ clear_overflow: } } +static void iommu_page_fault(int irq, void *dev_id, + struct cpu_user_regs *regs) +{ + struct iommu *iommu = dev_id; + + tasklet_schedule(&iommu->fault_tasklet); +} + static void dma_msi_unmask(struct irq_desc *desc) { struct iommu *iommu = desc->action->dev_id; @@ -2142,6 +2149,9 @@ int __init intel_vtd_setup(void) goto error; } iommu->irq = ret; + + softirq_tasklet_init(&iommu->fault_tasklet, do_iommu_page_fault, + (unsigned long) drhd->iommu); } if ( !iommu_qinval && iommu_intremap ) diff -r e5b12488f07e xen/include/xen/iommu.h --- a/xen/include/xen/iommu.h Tue Dec 13 17:29:12 2011 +0100 +++ b/xen/include/xen/iommu.h Wed Dec 14 10:08:45 2011 +0100 @@ -63,6 +63,7 @@ struct iommu { spinlock_t register_lock; /* protect iommu register handling */ u64 root_maddr; /* root entry machine address */ int irq; + struct tasklet fault_tasklet; struct intel_iommu *intel; unsigned long *domid_bitmap; /* domain id bitmap */ u16 *domid_map; /* domain id mapping array */