Skip to content

Commit

Permalink
AMD IOMMU: protect completion wait loop with iommu lock
Browse files Browse the repository at this point in the history
The unlocked polling of the ComWaitInt bit in the IOMMU completion wait
path is racy. Protect it with the iommu lock.

Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
  • Loading branch information
Joerg Roedel authored and Ingo Molnar committed Sep 18, 2008
1 parent ee2fa74 commit 7e4f88d
Showing 1 changed file with 8 additions and 4 deletions.
12 changes: 8 additions & 4 deletions arch/x86/kernel/amd_iommu.c
Original file line number Diff line number Diff line change
Expand Up @@ -101,21 +101,23 @@ static int iommu_queue_command(struct amd_iommu *iommu, struct iommu_cmd *cmd)
*/
static int iommu_completion_wait(struct amd_iommu *iommu)
{
int ret, ready = 0;
int ret = 0, ready = 0;
unsigned status = 0;
struct iommu_cmd cmd;
unsigned long i = 0;
unsigned long flags, i = 0;

memset(&cmd, 0, sizeof(cmd));
cmd.data[0] = CMD_COMPL_WAIT_INT_MASK;
CMD_SET_TYPE(&cmd, CMD_COMPL_WAIT);

iommu->need_sync = 0;

ret = iommu_queue_command(iommu, &cmd);
spin_lock_irqsave(&iommu->lock, flags);

ret = __iommu_queue_command(iommu, &cmd);

if (ret)
return ret;
goto out;

while (!ready && (i < EXIT_LOOP_COUNT)) {
++i;
Expand All @@ -130,6 +132,8 @@ static int iommu_completion_wait(struct amd_iommu *iommu)

if (unlikely((i == EXIT_LOOP_COUNT) && printk_ratelimit()))
printk(KERN_WARNING "AMD IOMMU: Completion wait loop failed\n");
out:
spin_unlock_irqrestore(&iommu->lock, flags);

return 0;
}
Expand Down

0 comments on commit 7e4f88d

Please sign in to comment.