aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoerg Roedel <joerg.roedel@amd.com>2008-07-03 13:35:08 -0400
committerIngo Molnar <mingo@elte.hu>2008-07-04 05:44:40 -0400
commit999ba417cc1a43881126d08876d5d7e653113ae3 (patch)
tree6e8bcde9d590566e61c96491d3959d9c01c39066
parent5f6a59d8ad55781d4d2ff0d327f84aaeed2c4127 (diff)
x86, AMD IOMMU: flush domain TLB when there is more than one page to flush
This patch changes the domain TLB flushing behavior of the driver. When there is more than one page to flush it flushes the whole domain TLB instead of every single page. So we send only a single command to the IOMMU in every case which is faster to execute. Signed-off-by: Joerg Roedel <joerg.roedel@amd.com> Cc: iommu@lists.linux-foundation.org Cc: bhavna.sarathy@amd.com Cc: robert.richter@amd.com Cc: Joerg Roedel <joerg.roedel@amd.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
-rw-r--r--arch/x86/kernel/amd_iommu.c14
-rw-r--r--include/asm-x86/amd_iommu_types.h2
2 files changed, 12 insertions, 4 deletions
diff --git a/arch/x86/kernel/amd_iommu.c b/arch/x86/kernel/amd_iommu.c
index 329b2c3f2fed..f2766d84c7a0 100644
--- a/arch/x86/kernel/amd_iommu.c
+++ b/arch/x86/kernel/amd_iommu.c
@@ -140,16 +140,22 @@ static int iommu_queue_inv_iommu_pages(struct amd_iommu *iommu,
140static int iommu_flush_pages(struct amd_iommu *iommu, u16 domid, 140static int iommu_flush_pages(struct amd_iommu *iommu, u16 domid,
141 u64 address, size_t size) 141 u64 address, size_t size)
142{ 142{
143 int i; 143 int s = 0;
144 unsigned pages = to_pages(address, size); 144 unsigned pages = to_pages(address, size);
145 145
146 address &= PAGE_MASK; 146 address &= PAGE_MASK;
147 147
148 for (i = 0; i < pages; ++i) { 148 if (pages > 1) {
149 iommu_queue_inv_iommu_pages(iommu, address, domid, 0, 0); 149 /*
150 address += PAGE_SIZE; 150 * If we have to flush more than one page, flush all
151 * TLB entries for this domain
152 */
153 address = CMD_INV_IOMMU_ALL_PAGES_ADDRESS;
154 s = 1;
151 } 155 }
152 156
157 iommu_queue_inv_iommu_pages(iommu, address, domid, 0, s);
158
153 return 0; 159 return 0;
154} 160}
155 161
diff --git a/include/asm-x86/amd_iommu_types.h b/include/asm-x86/amd_iommu_types.h
index 0f395501ab8e..7bfcb47cc452 100644
--- a/include/asm-x86/amd_iommu_types.h
+++ b/include/asm-x86/amd_iommu_types.h
@@ -93,6 +93,8 @@
93#define CMD_INV_IOMMU_PAGES_SIZE_MASK 0x01 93#define CMD_INV_IOMMU_PAGES_SIZE_MASK 0x01
94#define CMD_INV_IOMMU_PAGES_PDE_MASK 0x02 94#define CMD_INV_IOMMU_PAGES_PDE_MASK 0x02
95 95
96#define CMD_INV_IOMMU_ALL_PAGES_ADDRESS 0x7fffffffffffffffULL
97
96/* macros and definitions for device table entries */ 98/* macros and definitions for device table entries */
97#define DEV_ENTRY_VALID 0x00 99#define DEV_ENTRY_VALID 0x00
98#define DEV_ENTRY_TRANSLATION 0x01 100#define DEV_ENTRY_TRANSLATION 0x01