Re: crypto: sun4i-ss: error with kmap
From: Thomas Gleixner <hidden>
Date: 2020-12-01 15:15:53
Also in:
linux-crypto, lkml
Subsystem:
memory management, memory management - core, the rest · Maintainers:
Andrew Morton, David Hildenbrand, Linus Torvalds
On Tue, Dec 01 2020 at 15:45, Corentin Labbe wrote:
On Tue, Dec 01, 2020 at 03:16:36PM +0100, Thomas Gleixner wrote:
In fact the warn was a bit later so I added:
preempt_disable();
idx = arch_kmap_local_unmap_idx(kmap_local_idx(), addr);
- WARN_ON_ONCE(addr != __fix_to_virt(FIX_KMAP_BEGIN + idx));
+ if (WARN_ON_ONCE(addr != __fix_to_virt(FIX_KMAP_BEGIN + idx)))
+ pr_err("kunmap_local: vaddr %lx\n", (unsigned long) vaddr);
arch_kmap_local_pre_unmap(addr);
pte_clear(&init_mm, addr, kmap_pte - idx);
and this give kunmap_local: vaddr ffefe000
which looks like a valid one.
Can you apply the patch below and add 'ftrace_dump_on_oops' on the
command line or enable it in /proc/sys/kernel/ftrace_dump_on_oops before
starting the test.
That should spill out the trace after crashing.
Thanks,
tglx
---diff --git a/mm/highmem.c b/mm/highmem.c
index b49364a306b8..461fe2c26107 100644
--- a/mm/highmem.c
+++ b/mm/highmem.c@@ -485,6 +485,7 @@ static inline bool kmap_high_unmap_local(unsigned long vaddr) { #ifdef ARCH_NEEDS_KMAP_HIGH_GET if (vaddr >= PKMAP_ADDR(0) && vaddr < PKMAP_ADDR(LAST_PKMAP)) { + trace_printk("kunmap_high: %lx\n", vaddr); kunmap_high(pte_page(pkmap_page_table[PKMAP_NR(vaddr)])); return true; }
@@ -520,6 +521,7 @@ void *__kmap_local_pfn_prot(unsigned long pfn, pgprot_t prot) preempt_disable(); idx = arch_kmap_local_map_idx(kmap_local_idx_push(), pfn); vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx); + trace_printk("kmap_local_pfn: %d %lx\n", idx, (unsigned long) vaddr); BUG_ON(!pte_none(*(kmap_pte - idx))); pteval = pfn_pte(pfn, prot); set_pte_at(&init_mm, vaddr, kmap_pte - idx, pteval);
@@ -545,8 +547,10 @@ void *__kmap_local_page_prot(struct page *page, pgprot_t prot) /* Try kmap_high_get() if architecture has it enabled */ kmap = arch_kmap_local_high_get(page); - if (kmap) + if (kmap) { + trace_printk("kmap_local_high_get: %lx\n", (unsigned long) kmap); return kmap; + } return __kmap_local_pfn_prot(page_to_pfn(page), prot); }
@@ -578,6 +582,7 @@ void kunmap_local_indexed(void *vaddr) preempt_disable(); idx = arch_kmap_local_unmap_idx(kmap_local_idx(), addr); + trace_printk("kunmap_local: %i %lx\n", idx, (unsigned long) vaddr); WARN_ON_ONCE(addr != __fix_to_virt(FIX_KMAP_BEGIN + idx)); arch_kmap_local_pre_unmap(addr);
_______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel