aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Waychison <mikew@google.com>2006-04-21 09:43:25 +0200
committerGreg Kroah-Hartman <gregkh@suse.de>2006-05-01 12:03:42 -0700
commitc89ce82c2d942daacc7d7f5d3efafe7dba70bd23 (patch)
treea497456b81e016a4893a2d3927475eb282b75ef9
parent355bd3d4ea761a66880088ac2d0c5c95866df4a6 (diff)
[PATCH] x86_64: Fix a race in the free_iommu path.
We do this by removing a micro-optimization that tries to avoid grabbing the iommu_bitmap_lock spinlock and using a bus-locked operation. This still races with other simultaneous alloc_iommu or free_iommu(size > 1) which both use bus-unlocked operations. The end result of this race is eventually ending up with an iommu_gart_bitmap that has bits errornously set all over, making large contiguous iommu space allocations fail with 'PCI-DMA: Out of IOMMU space'. Signed-off-by: Mike Waychison <mikew@google.com> Signed-off-by: Andi Kleen <ak@suse.de> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r--arch/x86_64/kernel/pci-gart.c4
1 files changed, 0 insertions, 4 deletions
diff --git a/arch/x86_64/kernel/pci-gart.c b/arch/x86_64/kernel/pci-gart.c
index 0c3f052ba6ce..b9dbe3ce967c 100644
--- a/arch/x86_64/kernel/pci-gart.c
+++ b/arch/x86_64/kernel/pci-gart.c
@@ -114,10 +114,6 @@ static unsigned long alloc_iommu(int size)
static void free_iommu(unsigned long offset, int size)
{
unsigned long flags;
- if (size == 1) {
- clear_bit(offset, iommu_gart_bitmap);
- return;
- }
spin_lock_irqsave(&iommu_bitmap_lock, flags);
__clear_bit_string(iommu_gart_bitmap, offset, size);
spin_unlock_irqrestore(&iommu_bitmap_lock, flags);