diff options
| author | Joerg Roedel <joerg.roedel@amd.com> | 2008-12-02 14:16:03 -0500 |
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2008-12-03 04:02:41 -0500 |
| commit | 70d7d357578245f1993fd2d3ccd26088bcd38941 (patch) | |
| tree | a0fe9f283dfc802dcaf8dec9bacf7a4cce43d466 /arch | |
| parent | 7b1dedca42ac0d0d0be01e39d8461bb53a2389b3 (diff) | |
x86: fix broken flushing in GART nofullflush path
Impact: remove stale IOTLB entries
In the non-default nofullflush case the GART is only flushed when
next_bit wraps around. But it can happen that an unmap operation unmaps
memory which is behind the current next_bit location. If these addresses
are reused it may result in stale GART IO/TLB entries. Fix this by
setting the GART next_bit always behind an unmapped location.
Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch')
| -rw-r--r-- | arch/x86/kernel/pci-gart_64.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/arch/x86/kernel/pci-gart_64.c b/arch/x86/kernel/pci-gart_64.c index a42b02b4df68..ba7ad83e20a8 100644 --- a/arch/x86/kernel/pci-gart_64.c +++ b/arch/x86/kernel/pci-gart_64.c | |||
| @@ -123,6 +123,8 @@ static void free_iommu(unsigned long offset, int size) | |||
| 123 | 123 | ||
| 124 | spin_lock_irqsave(&iommu_bitmap_lock, flags); | 124 | spin_lock_irqsave(&iommu_bitmap_lock, flags); |
| 125 | iommu_area_free(iommu_gart_bitmap, offset, size); | 125 | iommu_area_free(iommu_gart_bitmap, offset, size); |
| 126 | if (offset >= next_bit) | ||
| 127 | next_bit = offset + size; | ||
| 126 | spin_unlock_irqrestore(&iommu_bitmap_lock, flags); | 128 | spin_unlock_irqrestore(&iommu_bitmap_lock, flags); |
| 127 | } | 129 | } |
| 128 | 130 | ||
