From 3e9215796e22dd0d5f4c0f1d7d6851918d580c94 Mon Sep 17 00:00:00 2001 From: Joerg Roedel Date: Fri, 11 Jul 2008 17:14:27 +0200 Subject: [PATCH] --- yaml --- r: 104319 b: refs/heads/master c: 136f78a19cf94d469f31a4009c7c0ac2301fbbf0 h: refs/heads/master i: 104317: 3713013682cad6c2b2c1d2889b7c0336e4938b12 104315: 80e3c04798cc3b850344b37c03ef5b8bd6a0d74a 104311: 04642b0a03cbc8be961d81f9224439341cd95be2 104303: b5f43275cc2bdc61d0ff83835a308788673a38ed 104287: 35bf520ea93d885a4b1273a156fda87f0ae02026 104255: 540f138c0a2352d3abb3520ac2ba75086933fe9c 104191: 48eb18563cd8036976572066f7d8429414f03158 v: v3 --- [refs] | 2 +- trunk/arch/x86/kernel/amd_iommu.c | 10 +++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index 9ecd8793058f..528932b2d6c8 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 9a836de0c9944c42d006ec241712c72e74737c73 +refs/heads/master: 136f78a19cf94d469f31a4009c7c0ac2301fbbf0 diff --git a/trunk/arch/x86/kernel/amd_iommu.c b/trunk/arch/x86/kernel/amd_iommu.c index 9098f047c1a9..7fa2d5d57dd8 100644 --- a/trunk/arch/x86/kernel/amd_iommu.c +++ b/trunk/arch/x86/kernel/amd_iommu.c @@ -32,6 +32,8 @@ #define to_pages(addr, size) \ (round_up(((addr) & ~PAGE_MASK) + (size), PAGE_SIZE) >> PAGE_SHIFT) +#define EXIT_LOOP_COUNT 10000000 + static DEFINE_RWLOCK(amd_iommu_devtable_lock); /* @@ -106,6 +108,7 @@ static int iommu_completion_wait(struct amd_iommu *iommu) struct command cmd; volatile u64 ready = 0; unsigned long ready_phys = virt_to_phys(&ready); + unsigned long i = 0; memset(&cmd, 0, sizeof(cmd)); cmd.data[0] = LOW_U32(ready_phys) | CMD_COMPL_WAIT_STORE_MASK; @@ -120,8 +123,13 @@ static int iommu_completion_wait(struct amd_iommu *iommu) if (ret) return ret; - while (!ready) + while (!ready && (i < EXIT_LOOP_COUNT)) { + ++i; cpu_relax(); + } + + if (unlikely((i == EXIT_LOOP_COUNT) && printk_ratelimit())) + printk(KERN_WARNING "AMD IOMMU: Completion wait loop failed\n"); return 0; }