[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] amd iommu: Introduce a new lock for event and ppr logging
# HG changeset patch # User Wei Wang <wei.wang2@xxxxxxx> # Date 1330619754 0 # Node ID ce5ef8a192c1050d85580305921d2e5caf220461 # Parent 2fbac9359e3b4fb61436e6e6653ec266b4f82ba9 amd iommu: Introduce a new lock for event and ppr logging iommu->lock is used with irq disabled, so it cannot be used to protect ppr log. Otherwise, after c/s 24770, get_gfn will trigger a BUG() if called by parse_ppr_log_entry(). This patch adds an additional lock to protect ppr and event pointers in iommu_read_log(). signed-off-by: Wei Wang <wei.wang2@xxxxxxx> Committed-by: Keir Fraser <keir@xxxxxxx> --- diff -r 2fbac9359e3b -r ce5ef8a192c1 xen/drivers/passthrough/amd/iommu_init.c --- a/xen/drivers/passthrough/amd/iommu_init.c Thu Mar 01 16:31:52 2012 +0000 +++ b/xen/drivers/passthrough/amd/iommu_init.c Thu Mar 01 16:35:54 2012 +0000 @@ -367,6 +367,8 @@ u32 tail, head, *entry, tail_offest, head_offset; BUG_ON(!iommu || ((log != &iommu->event_log) && (log != &iommu->ppr_log))); + + spin_lock(&log->lock); /* make sure there's an entry in the log */ tail_offest = ( log == &iommu->event_log ) ? @@ -396,6 +398,8 @@ writel(head, iommu->mmio_base + head_offset); } + spin_unlock(&log->lock); + return 0; } @@ -618,11 +622,11 @@ u32 entry; unsigned long flags; - spin_lock_irqsave(&iommu->lock, flags); - iommu_read_log(iommu, &iommu->event_log, sizeof(event_entry_t), parse_event_log_entry); + spin_lock_irqsave(&iommu->lock, flags); + /*check event overflow */ entry = readl(iommu->mmio_base + IOMMU_STATUS_MMIO_OFFSET); @@ -651,14 +655,10 @@ bus = PCI_BUS(device_id); devfn = PCI_DEVFN2(device_id); - local_irq_enable(); - spin_lock(&pcidevs_lock); pdev = pci_get_pdev(iommu->seg, bus, devfn); spin_unlock(&pcidevs_lock); - local_irq_disable(); - if ( pdev == NULL ) return; @@ -672,10 +672,10 @@ u32 entry; unsigned long flags; - spin_lock_irqsave(&iommu->lock, flags); - iommu_read_log(iommu, &iommu->ppr_log, sizeof(ppr_entry_t), parse_ppr_log_entry); + + spin_lock_irqsave(&iommu->lock, flags); /*check event overflow */ entry = readl(iommu->mmio_base + IOMMU_STATUS_MMIO_OFFSET); @@ -852,6 +852,8 @@ ring_buf->head = 0; ring_buf->tail = 0; + spin_lock_init(&ring_buf->lock); + ring_buf->alloc_size = PAGE_SIZE << get_order_from_bytes(entries * entry_size); ring_buf->entries = ring_buf->alloc_size / entry_size; diff -r 2fbac9359e3b -r ce5ef8a192c1 xen/include/asm-x86/amd-iommu.h --- a/xen/include/asm-x86/amd-iommu.h Thu Mar 01 16:31:52 2012 +0000 +++ b/xen/include/asm-x86/amd-iommu.h Thu Mar 01 16:35:54 2012 +0000 @@ -65,6 +65,7 @@ unsigned long alloc_size; uint32_t tail; uint32_t head; + spinlock_t lock; /* protect buffer pointers */ }; typedef struct iommu_cap { _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |