aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kernel/amd_iommu.c
diff options
context:
space:
mode:
authorJiri Slaby <jirislaby@gmail.com>2009-05-28 09:54:48 +0200
committerJoerg Roedel <joerg.roedel@amd.com>2009-06-03 10:34:55 +0200
commit367d04c4ec02dad34d80452e32e3370db7fb6fee (patch)
treec6be71774b788662618c45470fc02b85e1797e26 /arch/x86/kernel/amd_iommu.c
parentamd iommu: properly detach from protection domain on ->remove (diff)
downloadlinux-dev-367d04c4ec02dad34d80452e32e3370db7fb6fee.tar.xz
linux-dev-367d04c4ec02dad34d80452e32e3370db7fb6fee.zip
amd_iommu: fix lock imbalance
In alloc_coherent there is an omitted unlock on the path where mapping fails. Add the unlock. [ Impact: fix lock imbalance in alloc_coherent ] Signed-off-by: Jiri Slaby <jirislaby@gmail.com> Cc: Joerg Roedel <joerg.roedel@amd.com> Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
Diffstat (limited to 'arch/x86/kernel/amd_iommu.c')
-rw-r--r--arch/x86/kernel/amd_iommu.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/arch/x86/kernel/amd_iommu.c b/arch/x86/kernel/amd_iommu.c
index d6898833c363..9f89bb645b31 100644
--- a/arch/x86/kernel/amd_iommu.c
+++ b/arch/x86/kernel/amd_iommu.c
@@ -1541,8 +1541,10 @@ static void *alloc_coherent(struct device *dev, size_t size,
*dma_addr = __map_single(dev, iommu, domain->priv, paddr,
size, DMA_BIDIRECTIONAL, true, dma_mask);
- if (*dma_addr == bad_dma_address)
+ if (*dma_addr == bad_dma_address) {
+ spin_unlock_irqrestore(&domain->lock, flags);
goto out_free;
+ }
iommu_completion_wait(iommu);