aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86
diff options
context:
space:
mode:
authorJoerg Roedel <joerg.roedel@amd.com>2008-09-17 07:47:25 -0400
committerIngo Molnar <mingo@elte.hu>2008-09-18 03:25:04 -0400
commitee2fa7435b6dddf1ca119f298ad0100cf50c0397 (patch)
tree358bd578bc7e0f555307b7bd30464e27c9992e04 /arch/x86
parentba0593bf553c450a03dbc5f8c1f0ff58b778a0c8 (diff)
AMD IOMMU: set iommu sunc flag after command queuing
The iommu->need_sync flag must be set after the command is queued to avoid race conditions. Signed-off-by: Joerg Roedel <joerg.roedel@amd.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch/x86')
-rw-r--r--arch/x86/kernel/amd_iommu.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/arch/x86/kernel/amd_iommu.c b/arch/x86/kernel/amd_iommu.c
index 69b4d060b21c..a96d8c049a88 100644
--- a/arch/x86/kernel/amd_iommu.c
+++ b/arch/x86/kernel/amd_iommu.c
@@ -140,6 +140,7 @@ static int iommu_completion_wait(struct amd_iommu *iommu)
140static int iommu_queue_inv_dev_entry(struct amd_iommu *iommu, u16 devid) 140static int iommu_queue_inv_dev_entry(struct amd_iommu *iommu, u16 devid)
141{ 141{
142 struct iommu_cmd cmd; 142 struct iommu_cmd cmd;
143 int ret;
143 144
144 BUG_ON(iommu == NULL); 145 BUG_ON(iommu == NULL);
145 146
@@ -147,9 +148,11 @@ static int iommu_queue_inv_dev_entry(struct amd_iommu *iommu, u16 devid)
147 CMD_SET_TYPE(&cmd, CMD_INV_DEV_ENTRY); 148 CMD_SET_TYPE(&cmd, CMD_INV_DEV_ENTRY);
148 cmd.data[0] = devid; 149 cmd.data[0] = devid;
149 150
151 ret = iommu_queue_command(iommu, &cmd);
152
150 iommu->need_sync = 1; 153 iommu->need_sync = 1;
151 154
152 return iommu_queue_command(iommu, &cmd); 155 return ret;
153} 156}
154 157
155/* 158/*
@@ -159,6 +162,7 @@ static int iommu_queue_inv_iommu_pages(struct amd_iommu *iommu,
159 u64 address, u16 domid, int pde, int s) 162 u64 address, u16 domid, int pde, int s)
160{ 163{
161 struct iommu_cmd cmd; 164 struct iommu_cmd cmd;
165 int ret;
162 166
163 memset(&cmd, 0, sizeof(cmd)); 167 memset(&cmd, 0, sizeof(cmd));
164 address &= PAGE_MASK; 168 address &= PAGE_MASK;
@@ -171,9 +175,11 @@ static int iommu_queue_inv_iommu_pages(struct amd_iommu *iommu,
171 if (pde) /* PDE bit - we wan't flush everything not only the PTEs */ 175 if (pde) /* PDE bit - we wan't flush everything not only the PTEs */
172 cmd.data[2] |= CMD_INV_IOMMU_PAGES_PDE_MASK; 176 cmd.data[2] |= CMD_INV_IOMMU_PAGES_PDE_MASK;
173 177
178 ret = iommu_queue_command(iommu, &cmd);
179
174 iommu->need_sync = 1; 180 iommu->need_sync = 1;
175 181
176 return iommu_queue_command(iommu, &cmd); 182 return ret;
177} 183}
178 184
179/* 185/*