We suffer an unfortunate combination of "features" which makes highmem
support on platforms without hardware TLB maintainence broadcast difficult:
- we need kmap_high_get() support for DMA cache coherence
- this requires kmap_high() to take a spinlock with IRQs disabled
- kmap_high() occasionally calls flush_all_zero_pkmaps() to clear
out old mappings
- flush_all_zero_pkmaps() calls flush_tlb_kernel_range(), which
on s/w IPI'd systems eventually calls smp_call_function_many()
- smp_call_function_many() must not be called with IRQs disabled:
WARNING: at kernel/smp.c:380 smp_call_function_many+0xc4/0x240()
Modules linked in:
Backtrace:
[] (dump_backtrace+0x0/0x108) from [] (dump_stack+0x18/0x1c)
r6:c007cd18 r5:c02ff228 r4:0000017c
[] (dump_stack+0x0/0x1c) from [] (warn_slowpath_common+0x50/0x80)
[] (warn_slowpath_common+0x0/0x80) from [] (warn_slowpath_null+0x18/0x1c)
r7:00000003 r6:00000001 r5:c1ff4000 r4:c035fa34
[] (warn_slowpath_null+0x0/0x1c) from [] (smp_call_function_many+0xc4/0x240)
[] (smp_call_function_many+0x0/0x240) from [] (smp_call_function+0x2c/0x38)
[] (smp_call_function+0x0/0x38) from [] (on_each_cpu+0x1c/0x38)
[] (on_each_cpu+0x0/0x38) from [] (flush_tlb_kernel_range+0x50/0x58)
r6:00000001 r5:00000800 r4:c05f3590
[] (flush_tlb_kernel_range+0x0/0x58) from [] (flush_all_zero_pkmaps+0xc0/0xe8)
[] (flush_all_zero_pkmaps+0x0/0xe8) from [] (kmap_high+0x8c/0x1e0)
[] (kmap_high+0x0/0x1e0) from [] (kmap+0x44/0x5c)
[] (kmap+0x0/0x5c) from [] (cramfs_readpage+0x3c/0x194)
[] (cramfs_readpage+0x0/0x194) from [] (__do_page_cache_readahead+0x1f0/0x290)
[] (__do_page_cache_readahead+0x0/0x290) from [] (ra_submit+0x30/0x38)
[] (ra_submit+0x0/0x38) from [] (filemap_fault+0x3dc/0x438)
r4:c1819988
[] (filemap_fault+0x0/0x438) from [] (__do_fault+0x58/0x43c)
[] (__do_fault+0x0/0x43c) from [] (handle_mm_fault+0x104/0x318)
[] (handle_mm_fault+0x0/0x318) from [] (do_page_fault+0x188/0x1e4)
[] (do_page_fault+0x0/0x1e4) from [] (do_translation_fault+0x7c/0x84)
[] (do_translation_fault+0x0/0x84) from [] (do_DataAbort+0x40/0xa4)
r8:c1ff5e20 r7:c0340120 r6:00000805 r5:c1ff5e54 r4:c03400d0
[] (do_DataAbort+0x0/0xa4) from [] (__dabt_svc+0x4c/0x60)
...
So we disable highmem support on these systems.
Signed-off-by: Russell King