summaryrefslogtreecommitdiffstats
path: root/drivers/staging/media/ipu3
diff options
context:
space:
mode:
authorBingbu Cao <bingbu.cao@intel.com>2020-03-24 05:16:48 +0100
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>2020-04-14 12:32:26 +0200
commite1ebe9f9c88e5a78fcc4670a9063c9b3cd87dda4 (patch)
tree0a3839765a9d631bda0d63ba25bdedc2c57a04fd /drivers/staging/media/ipu3
parent9611ba28d8508dcb92837a47a639b79598cbcc53 (diff)
downloadlinux-stable-e1ebe9f9c88e5a78fcc4670a9063c9b3cd87dda4.tar.gz
linux-stable-e1ebe9f9c88e5a78fcc4670a9063c9b3cd87dda4.tar.bz2
linux-stable-e1ebe9f9c88e5a78fcc4670a9063c9b3cd87dda4.zip
media: staging: imgu: do not hold spinlock during freeing mmu page table
ImgU need set the mmu page table in memory as uncached, and set back to write-back when free the page table by set_memory_wb(), set_memory_wb() can not do flushing without interrupt, so the spinlock should not be hold during ImgU page alloc and free, the interrupt should be enabled during memory cache flush. This patch release spinlock before freeing pages table. Signed-off-by: Bingbu Cao <bingbu.cao@intel.com> Reviewed-by: Tomasz Figa <tfiga@chromium.org> Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com> Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
Diffstat (limited to 'drivers/staging/media/ipu3')
-rw-r--r--drivers/staging/media/ipu3/ipu3-mmu.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/drivers/staging/media/ipu3/ipu3-mmu.c b/drivers/staging/media/ipu3/ipu3-mmu.c
index 5f3ff964f3e7..cb9bf5fb29a5 100644
--- a/drivers/staging/media/ipu3/ipu3-mmu.c
+++ b/drivers/staging/media/ipu3/ipu3-mmu.c
@@ -174,8 +174,10 @@ static u32 *imgu_mmu_get_l2pt(struct imgu_mmu *mmu, u32 l1pt_idx)
spin_lock_irqsave(&mmu->lock, flags);
l2pt = mmu->l2pts[l1pt_idx];
- if (l2pt)
- goto done;
+ if (l2pt) {
+ spin_unlock_irqrestore(&mmu->lock, flags);
+ return l2pt;
+ }
spin_unlock_irqrestore(&mmu->lock, flags);
@@ -190,8 +192,9 @@ static u32 *imgu_mmu_get_l2pt(struct imgu_mmu *mmu, u32 l1pt_idx)
l2pt = mmu->l2pts[l1pt_idx];
if (l2pt) {
+ spin_unlock_irqrestore(&mmu->lock, flags);
imgu_mmu_free_page_table(new_l2pt);
- goto done;
+ return l2pt;
}
l2pt = new_l2pt;
@@ -200,7 +203,6 @@ static u32 *imgu_mmu_get_l2pt(struct imgu_mmu *mmu, u32 l1pt_idx)
pteval = IPU3_ADDR2PTE(virt_to_phys(new_l2pt));
mmu->l1pt[l1pt_idx] = pteval;
-done:
spin_unlock_irqrestore(&mmu->lock, flags);
return l2pt;
}