Thread (9 messages) 9 messages, 3 authors, 2023-01-26

Re: [PATCH] powerpc/kasan/book3s_64: warn when running with hash MMU

From: Michael Ellerman <mpe@ellerman.id.au>
Date: 2022-10-06 04:11:48
Subsystem: linux for powerpc (32-bit and 64-bit), the rest · Maintainers: Madhavan Srinivasan, Michael Ellerman, Linus Torvalds

Nathan Lynch [off-list ref] writes:
kasan is known to crash at boot on book3s_64 with non-radix MMU. As
noted in commit 41b7a347bf14 ("powerpc: Book3S 64-bit outline-only
KASAN support"):

  A kernel with CONFIG_KASAN=y will crash during boot on a machine
  using HPT translation because not all the entry points to the
  generic KASAN code are protected with a call to kasan_arch_is_ready().
I guess I thought there was some plan to fix that.

But maybe I'm misremembering. Looking now it's not entirely straight
forward with the way the headers are structured. So I guess I'm wrong
about that.
Such crashes look like this:

  BUG: Unable to handle kernel data access at 0xc00e00000308b100
  Faulting instruction address: 0xc0000000006d0fcc
  Oops: Kernel access of bad area, sig: 11 [#1]
  LE PAGE_SIZE=64K MMU=Hash SMP NR_CPUS=2048 NUMA pSeries
  CPU: 0 PID: 1 Comm: swapper/0 Not tainted 6.0.0-rc5-02183-g3ab165dea2a2 #13
  [...regs...]
  NIP [c0000000006d0fcc] kasan_byte_accessible+0xc/0x20
  LR [c0000000006cd9cc] __kasan_check_byte+0x2c/0xa0
  Call Trace:
  [c00000001688f930] [c00000001688f970] 0xc00000001688f970 (unreliable)
  [c00000001688f970] [c0000000005f6a74] ksize+0x34/0xa0
  [c00000001688f9a0] [c0000000024c03a8] __alloc_skb+0xd8/0x2d0
  [c00000001688fa00] [c0000000003c48c0] audit_log_start+0x260/0x660
  [c00000001688fb30] [c0000000003c50ec] audit_log+0x3c/0x70
  [c00000001688fb60] [c00000000404590c] audit_init+0x188/0x1ac
  [c00000001688fbe0] [c0000000000127e0] do_one_initcall+0xe0/0x610
  [c00000001688fcd0] [c00000000400a1f0] kernel_init_freeable+0x4c0/0x574
  [c00000001688fda0] [c000000000013450] kernel_init+0x30/0x1d0
  [c00000001688fe10] [c00000000000cd54] ret_from_kernel_thread+0x5c/0x64

If you look carefully enough at the full kernel output, you might
notice this message, much earlier:

  KASAN not enabled as it requires radix!

But the eventual oops does not carry any indication that the real
problem was detected early on and is a known limitation.

Change init_book3s_64.c::kasan_init() to emit a warning backtrace and
taint the kernel when not running on radix. When the kernel likely
oopses later, the 'W' taint flag in the report should help minimize
developer time spent trying to understand what's gone wrong.
Should we just panic() directly?

It's too earily in kasan_init(), nothing gets to the console.

But we have kasan_late_init() already, the patch below seems to work and
gives us:

  Booting Linux via __start() @ 0x0000000000400000 ...
  [    0.000000][    T0] hash-mmu: Page sizes from device-tree:
  [    0.000000][    T0] hash-mmu: base_shift=12: shift=12, sllp=0x0000, avpnm=0x00000000, tlbiel=1, penc=0
  [    0.000000][    T0] hash-mmu: base_shift=16: shift=16, sllp=0x0110, avpnm=0x00000000, tlbiel=1, penc=1
  [    0.000000][    T0] Using 1TB segments
  [    0.000000][    T0] hash-mmu: Initializing hash mmu with SLB
  [    0.000000][    T0] Linux version 6.0.0-rc2-00225-g8b68240ff7d7-dirty (michael@alpine1-p1) (gcc (Ubuntu 11.2.0-7ubuntu2) 11.2.0, GNU ld (GNU Binutils for Ubuntu) 2.37) #403 SMP Thu Oct 6 14:53:58 AEDT 2022
  [    0.000000][    T0] KASAN not enabled as it requires radix!
  ...
  [    0.000000][    T0] mem auto-init: stack:off, heap alloc:off, heap free:off
  [    0.000000][    T0] stackdepot hash table entries: 1048576 (order: 7, 8388608 bytes, linear)
  [    0.000000][    T0] Kernel panic - not syncing: KASAN enabled kernel can't boot with Hash MMU!
  [    0.000000][    T0] CPU: 0 PID: 0 Comm: swapper Not tainted 6.0.0-rc2-00225-g8b68240ff7d7-dirty #403
  [    0.000000][    T0] Hardware name: IBM pSeries (emulated by qemu) POWER8 (raw) 0x4d0200 0xf000004 of:SLOF,HEAD pSeries
  [    0.000000][    T0] Call Trace:
  [    0.000000][    T0] [c0000000031efd20] [c000000000bf5450] dump_stack_lvl+0x74/0xa8 (unreliable)
  [    0.000000][    T0] [c0000000031efd60] [c00000000017d160] panic+0x1b0/0x480
  [    0.000000][    T0] [c0000000031efe00] [c00000000201e028] kasan_late_init+0x30/0x34
  [    0.000000][    T0] [c0000000031efe60] [c000000002018c4c] mem_init+0xc8/0xec
  [    0.000000][    T0] [c0000000031efe90] [c000000002004538] mm_init+0x84/0xbc
  [    0.000000][    T0] [c0000000031eff00] [c0000000020047a0] start_kernel+0x1cc/0x4bc
  [    0.000000][    T0] [c0000000031eff90] [c00000000000d998] start_here_common+0x1c/0x84

cheers

diff --git a/arch/powerpc/mm/kasan/init_book3s_64.c b/arch/powerpc/mm/kasan/init_book3s_64.c
index 9300d641cf9a..cc1b4ee8be53 100644
--- a/arch/powerpc/mm/kasan/init_book3s_64.c
+++ b/arch/powerpc/mm/kasan/init_book3s_64.c
@@ -101,4 +101,8 @@ void __init kasan_init(void)
 
 void __init kasan_early_init(void) { }
 
-void __init kasan_late_init(void) { }
+void __init kasan_late_init(void)
+{
+	if (!radix_enabled())
+		panic("KASAN enabled kernel can't boot with Hash MMU!");
+}
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help