regression in 6.6.46; arch/x86/mm/pti.c

From: Jamie Heilman
Date: Mon Sep 09 2024 - 01:09:53 EST


3db03fb4995e ("x86/mm: Fix pti_clone_entry_text() for i386") which got
landed in 6.6.46, has introduced two back to back warnings on boot on
my 32bit system (found on 6.6.50):

------------[ cut here ]------------
WARNING: CPU: 0 PID: 1 at arch/x86/mm/pti.c:256 pti_clone_pgtable+0x1ba/0x2e8
Modules linked in:
CPU: 0 PID: 1 Comm: swapper Tainted: G T 6.6.50 #3
Hardware name: To Be Filled By O.E.M. To Be Filled By O.E.M./To be filled by O.E.M., BIOS 080014 06/01/2009
EIP: pti_clone_pgtable+0x1ba/0x2e8
Code: 00 00 89 f8 e8 57 fd ff ff 85 c0 89 c6 74 1d 8b 08 31 d2 89 55 f0 8b 55 f0 89 c8 25 80 00 00 00 89 45 ec 8b 45 ec 09 d0 74 0e <0f> 0b 0f 0b e9 62 ff ff ff 2e 8d 74 26 00 89 c8 31 d2 89 55 f0 83
EAX: 00000080 EBX: 00000000 ECX: 014001e3 EDX: 00000000
ESI: 81c0f050 EDI: 815a4630 EBP: 81caff70 ESP: 81caff44
DS: 007b ES: 007b FS: 0000 GS: 0000 SS: 0068 EFLAGS: 00010202
CR0: 80050033 CR2: ffbff000 CR3: 01830000 CR4: 000006b0
Call Trace:
? show_regs+0x4c/0x5c
? __warn+0x6e/0x114
? pti_clone_pgtable+0x1ba/0x2e8
? pti_clone_pgtable+0x1ba/0x2e8
? report_bug+0xd5/0x110
? exc_overflow+0x58/0x58
? handle_bug+0x31/0x50
? exc_invalid_op+0x1b/0x70
? handle_exception+0x100/0x100
? __SCT__bpf_dispatcher_xdp_call+0x8/0x8
? exc_overflow+0x58/0x58
? pti_clone_pgtable+0x1ba/0x2e8
? exc_overflow+0x58/0x58
? pti_clone_pgtable+0x1ba/0x2e8
? __SCT__bpf_dispatcher_xdp_call+0x8/0x8
? rest_init+0x7c/0x7c
pti_finalize+0x30/0x4c
kernel_init+0x49/0x1c4
? schedule_tail+0x37/0x40
ret_from_fork+0x44/0x50
? rest_init+0x7c/0x7c
ret_from_fork_asm+0x12/0x18
entry_INT80_32+0xef/0xf4
---[ end trace 0000000000000000 ]---
------------[ cut here ]------------
WARNING: CPU: 0 PID: 1 at arch/x86/mm/pti.c:394 pti_clone_pgtable+0x1bc/0x2e8
Modules linked in:
CPU: 0 PID: 1 Comm: swapper Tainted: G W T 6.6.50 #3
Hardware name: To Be Filled By O.E.M. To Be Filled By O.E.M./To be filled by O.E.M., BIOS 080014 06/01/2009
EIP: pti_clone_pgtable+0x1bc/0x2e8
Code: 89 f8 e8 57 fd ff ff 85 c0 89 c6 74 1d 8b 08 31 d2 89 55 f0 8b 55 f0 89 c8 25 80 00 00 00 89 45 ec 8b 45 ec 09 d0 74 0e 0f 0b <0f> 0b e9 62 ff ff ff 2e 8d 74 26 00 89 c8 31 d2 89 55 f0 83 e0 9f
EAX: 00000080 EBX: 00000000 ECX: 014001e3 EDX: 00000000
ESI: 81c0f050 EDI: 815a4630 EBP: 81caff70 ESP: 81caff44
DS: 007b ES: 007b FS: 0000 GS: 0000 SS: 0068 EFLAGS: 00010202
CR0: 80050033 CR2: ffbff000 CR3: 01830000 CR4: 000006b0
Call Trace:
? show_regs+0x4c/0x5c
? __warn+0x6e/0x114
? pti_clone_pgtable+0x1bc/0x2e8
? pti_clone_pgtable+0x1bc/0x2e8
? report_bug+0xd5/0x110
? exc_overflow+0x58/0x58
? handle_bug+0x31/0x50
? exc_invalid_op+0x1b/0x70
? handle_exception+0x100/0x100
? __SCT__bpf_dispatcher_xdp_call+0x8/0x8
? exc_overflow+0x58/0x58
? pti_clone_pgtable+0x1bc/0x2e8
? exc_overflow+0x58/0x58
? pti_clone_pgtable+0x1bc/0x2e8
? __SCT__bpf_dispatcher_xdp_call+0x8/0x8
? rest_init+0x7c/0x7c
pti_finalize+0x30/0x4c
kernel_init+0x49/0x1c4
? schedule_tail+0x37/0x40
ret_from_fork+0x44/0x50
? rest_init+0x7c/0x7c
ret_from_fork_asm+0x12/0x18
entry_INT80_32+0xef/0xf4
---[ end trace 0000000000000000 ]---

Reverting that commit removes the warnings (tested against 6.6.50).
The follow-on commit of c48b5a4cf312 ("x86/mm: Fix PTI for i386 some
more") doesn't apply cleanly to 6.6.50, but I did try out a build of
6.11-rc7 and that works fine too with no warnings on boot.

--
Jamie Heilman http://audible.transient.net/~jamie/