On Tue, Dec 01, 2020 at 04:15:08PM +0100, Thomas Gleixner wrote: > 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); > The result could be seen at http://kernel.montjoie.ovh/129768.log The log is 9Mb, but the ftrace dump seems not terminated, tell me if you need more. Regards