* [linux-next:master] [block] ec7f31b2a2: BUG:unable_to_handle_page_fault_for_address
@ 2025-11-11 6:23 kernel test robot
2025-11-11 7:48 ` poison_element vs highmem, was " Christoph Hellwig
0 siblings, 1 reply; 6+ messages in thread
From: kernel test robot @ 2025-11-11 6:23 UTC (permalink / raw)
To: Christoph Hellwig
Cc: oe-lkp, lkp, Jens Axboe, Martin K. Petersen, Johannes Thumshirn,
Anuj Gupta, Kanchan Joshi, linux-block, linux-kernel, oliver.sang
Hello,
kernel test robot noticed "BUG:unable_to_handle_page_fault_for_address" on:
commit: ec7f31b2a2d3bf6b9e4d4b8cd156587f1d0607d5 ("block: make bio auto-integrity deadlock safe")
https://git.kernel.org/cgit/linux/kernel/git/next/linux-next.git master
[test failed on linux-next/master 9c0826a5d9aa4d52206dd89976858457a2a8a7ed]
in testcase: boot
config: i386-randconfig-016-20251107
compiler: clang-20
test machine: qemu-system-x86_64 -enable-kvm -cpu SandyBridge -smp 2 -m 32G
(please refer to attached dmesg/kmsg for entire log/backtrace)
+------------------------------------------------+------------+------------+
| | eef09f742b | ec7f31b2a2 |
+------------------------------------------------+------------+------------+
| BUG:unable_to_handle_page_fault_for_address | 0 | 6 |
| Oops:Oops:#[##] | 0 | 6 |
| EIP:memset | 0 | 6 |
| Kernel_panic-not_syncing:Fatal_exception | 0 | 6 |
+------------------------------------------------+------------+------------+
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <oliver.sang@intel.com>
| Closes: https://lore.kernel.org/oe-lkp/202511111411.9ebfa1ba-lkp@intel.com
[ 1.770141][ T1] BUG: unable to handle page fault for address: fffba000
[ 1.771287][ T1] #PF: supervisor write access in kernel mode
[ 1.772177][ T1] #PF: error_code(0x0002) - not-present page
[ 1.772326][ T1] *pde = 03171067 *pte = 00000000
[ 1.772326][ T1] Oops: Oops: 0002 [#1]
[ 1.772326][ T1] CPU: 0 UID: 0 PID: 1 Comm: swapper/0 Tainted: G T 6.18.0-rc2-00031-gec7f31b2a2d3 #1 NONE a1d066dfe789f54bc7645c7989957d2bdee593ca
[ 1.772326][ T1] Tainted: [T]=RANDSTRUCT
[ 1.772326][ T1] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.16.3-debian-1.16.3-2 04/01/2014
[ 1.772326][ T1] EIP: memset (arch/x86/include/asm/string_32.h:168 arch/x86/lib/memcpy_32.c:17)
[ 1.772326][ T1] Code: a5 8b 4d f4 83 e1 03 74 02 f3 a4 83 c4 04 5e 5f 5d 2e e9 73 41 01 00 90 90 90 3e 8d 74 26 00 55 89 e5 57 56 89 c6 89 d0 89 f7 <f3> aa 89 f0 5e 5f 5d 2e e9 53 41 01 00 cc cc cc 55 89 e5 53 57 56
All code
========
0: a5 movsl %ds:(%rsi),%es:(%rdi)
1: 8b 4d f4 mov -0xc(%rbp),%ecx
4: 83 e1 03 and $0x3,%ecx
7: 74 02 je 0xb
9: f3 a4 rep movsb %ds:(%rsi),%es:(%rdi)
b: 83 c4 04 add $0x4,%esp
e: 5e pop %rsi
f: 5f pop %rdi
10: 5d pop %rbp
11: 2e e9 73 41 01 00 cs jmp 0x1418a
17: 90 nop
18: 90 nop
19: 90 nop
1a: 3e 8d 74 26 00 ds lea 0x0(%rsi,%riz,1),%esi
1f: 55 push %rbp
20: 89 e5 mov %esp,%ebp
22: 57 push %rdi
23: 56 push %rsi
24: 89 c6 mov %eax,%esi
26: 89 d0 mov %edx,%eax
28: 89 f7 mov %esi,%edi
2a:* f3 aa rep stos %al,%es:(%rdi) <-- trapping instruction
2c: 89 f0 mov %esi,%eax
2e: 5e pop %rsi
2f: 5f pop %rdi
30: 5d pop %rbp
31: 2e e9 53 41 01 00 cs jmp 0x1418a
37: cc int3
38: cc int3
39: cc int3
3a: 55 push %rbp
3b: 89 e5 mov %esp,%ebp
3d: 53 push %rbx
3e: 57 push %rdi
3f: 56 push %rsi
Code starting with the faulting instruction
===========================================
0: f3 aa rep stos %al,%es:(%rdi)
2: 89 f0 mov %esi,%eax
4: 5e pop %rsi
5: 5f pop %rdi
6: 5d pop %rbp
7: 2e e9 53 41 01 00 cs jmp 0x14160
d: cc int3
e: cc int3
f: cc int3
10: 55 push %rbp
11: 89 e5 mov %esp,%ebp
13: 53 push %rbx
14: 57 push %rdi
15: 56 push %rsi
[ 1.772326][ T1] EAX: 0000006b EBX: 00000015 ECX: 001fefff EDX: 0000006b
[ 1.772326][ T1] ESI: fffb9000 EDI: fffba000 EBP: c611fbf0 ESP: c611fbe8
[ 1.772326][ T1] DS: 007b ES: 007b FS: 0000 GS: 0000 SS: 0068 EFLAGS: 00010287
[ 1.772326][ T1] CR0: 80050033 CR2: fffba000 CR3: 0316e000 CR4: 00040690
[ 1.772326][ T1] Call Trace:
[ 1.772326][ T1] poison_element (mm/mempool.c:83 mm/mempool.c:102)
[ 1.772326][ T1] mempool_init_node (mm/mempool.c:142 mm/mempool.c:226)
[ 1.772326][ T1] mempool_init_noprof (mm/mempool.c:250 (discriminator 1))
[ 1.772326][ T1] ? mempool_alloc_pages (mm/mempool.c:640)
[ 1.772326][ T1] bio_integrity_initfn (block/bio-integrity.c:483 (discriminator 8))
[ 1.772326][ T1] ? mempool_alloc_pages (mm/mempool.c:640)
[ 1.772326][ T1] do_one_initcall (init/main.c:1283)
[ 1.772326][ T1] ? kvm_sched_clock_read (arch/x86/kernel/kvmclock.c:91)
[ 1.772326][ T1] ? sched_clock_noinstr (arch/x86/kernel/tsc.c:271)
[ 1.772326][ T1] ? local_clock_noinstr (kernel/sched/clock.c:272 kernel/sched/clock.c:309)
[ 1.772326][ T1] ? __lock_acquire (kernel/locking/lockdep.c:4674 kernel/locking/lockdep.c:5191)
[ 1.772326][ T1] ? kvm_sched_clock_read (arch/x86/kernel/kvmclock.c:91)
[ 1.772326][ T1] ? sched_clock_noinstr (arch/x86/kernel/tsc.c:271)
[ 1.772326][ T1] ? local_clock_noinstr (kernel/sched/clock.c:272 kernel/sched/clock.c:309)
[ 1.772326][ T1] ? local_clock (arch/x86/include/asm/preempt.h:85 (discriminator 9) kernel/sched/clock.c:319 (discriminator 9))
[ 1.772326][ T1] ? lock_release (kernel/locking/lockdep.c:353 kernel/locking/lockdep.c:5542 kernel/locking/lockdep.c:5889)
[ 1.772326][ T1] ? clockevents_program_event (kernel/time/clockevents.c:?)
[ 1.772326][ T1] ? ktime_get (include/linux/seqlock.h:391 (discriminator 3) include/linux/seqlock.h:411 (discriminator 3) kernel/time/timekeeping.c:828 (discriminator 3))
[ 1.772326][ T1] ? sched_balance_trigger (kernel/sched/fair.c:?)
[ 1.772326][ T1] ? run_posix_cpu_timers (include/linux/sched/deadline.h:15 include/linux/sched/deadline.h:24 kernel/time/posix-cpu-timers.c:1123 kernel/time/posix-cpu-timers.c:1428)
[ 1.772326][ T1] ? clockevents_program_event (kernel/time/clockevents.c:336)
[ 1.772326][ T1] ? update_process_times (kernel/time/timer.c:2481)
[ 1.772326][ T1] ? tick_handle_periodic (kernel/time/tick-common.c:120)
[ 1.772326][ T1] ? vmware_sched_clock (arch/x86/kernel/apic/apic.c:1052)
[ 1.772326][ T1] ? trace_hardirqs_on (kernel/trace/trace_preemptirq.c:80)
[ 1.772326][ T1] ? irqentry_exit (kernel/entry/common.c:224 (discriminator 32768))
[ 1.772326][ T1] ? sysvec_apic_timer_interrupt (arch/x86/kernel/apic/apic.c:1052 (discriminator 6))
[ 1.772326][ T1] ? handle_exception (arch/x86/entry/entry_32.S:1055)
[ 1.772326][ T1] ? netdev_bits (lib/vsprintf.c:650 lib/vsprintf.c:695 lib/vsprintf.c:721 lib/vsprintf.c:1787)
[ 1.772326][ T1] ? strlen (arch/x86/lib/string_32.c:167)
[ 1.772326][ T1] ? next_arg (lib/cmdline.c:273)
[ 1.772326][ T1] ? parameq (kernel/params.c:90 (discriminator 1) kernel/params.c:99 (discriminator 1))
[ 1.772326][ T1] ? deadline_init (block/bio-integrity.c:482)
[ 1.772326][ T1] do_initcall_level (init/main.c:1344 (discriminator 6))
[ 1.772326][ T1] do_initcalls (init/main.c:1358 (discriminator 2))
[ 1.772326][ T1] do_basic_setup (init/main.c:1381)
[ 1.772326][ T1] kernel_init_freeable (init/main.c:1597)
[ 1.772326][ T1] ? rest_init (init/main.c:1475)
[ 1.772326][ T1] kernel_init (init/main.c:1485)
[ 1.772326][ T1] ret_from_fork (arch/x86/kernel/process.c:164)
[ 1.772326][ T1] ? rest_init (init/main.c:1475)
[ 1.772326][ T1] ret_from_fork_asm (arch/x86/entry/entry_32.S:737)
[ 1.772326][ T1] entry_INT80_32 (arch/x86/entry/entry_32.S:945)
[ 1.772326][ T1] Modules linked in:
[ 1.772326][ T1] CR2: 00000000fffba000
[ 1.772326][ T1] ---[ end trace 0000000000000000 ]---
[ 1.772326][ T1] EIP: memset (arch/x86/include/asm/string_32.h:168 arch/x86/lib/memcpy_32.c:17)
[ 1.772326][ T1] Code: a5 8b 4d f4 83 e1 03 74 02 f3 a4 83 c4 04 5e 5f 5d 2e e9 73 41 01 00 90 90 90 3e 8d 74 26 00 55 89 e5 57 56 89 c6 89 d0 89 f7 <f3> aa 89 f0 5e 5f 5d 2e e9 53 41 01 00 cc cc cc 55 89 e5 53 57 56
All code
========
0: a5 movsl %ds:(%rsi),%es:(%rdi)
1: 8b 4d f4 mov -0xc(%rbp),%ecx
4: 83 e1 03 and $0x3,%ecx
7: 74 02 je 0xb
9: f3 a4 rep movsb %ds:(%rsi),%es:(%rdi)
b: 83 c4 04 add $0x4,%esp
e: 5e pop %rsi
f: 5f pop %rdi
10: 5d pop %rbp
11: 2e e9 73 41 01 00 cs jmp 0x1418a
17: 90 nop
18: 90 nop
19: 90 nop
1a: 3e 8d 74 26 00 ds lea 0x0(%rsi,%riz,1),%esi
1f: 55 push %rbp
20: 89 e5 mov %esp,%ebp
22: 57 push %rdi
23: 56 push %rsi
24: 89 c6 mov %eax,%esi
26: 89 d0 mov %edx,%eax
28: 89 f7 mov %esi,%edi
2a:* f3 aa rep stos %al,%es:(%rdi) <-- trapping instruction
2c: 89 f0 mov %esi,%eax
2e: 5e pop %rsi
2f: 5f pop %rdi
30: 5d pop %rbp
31: 2e e9 53 41 01 00 cs jmp 0x1418a
37: cc int3
38: cc int3
39: cc int3
3a: 55 push %rbp
3b: 89 e5 mov %esp,%ebp
The kernel config and materials to reproduce are available at:
https://download.01.org/0day-ci/archive/20251111/202511111411.9ebfa1ba-lkp@intel.com
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 6+ messages in thread
* poison_element vs highmem, was Re: [linux-next:master] [block] ec7f31b2a2: BUG:unable_to_handle_page_fault_for_address
2025-11-11 6:23 [linux-next:master] [block] ec7f31b2a2: BUG:unable_to_handle_page_fault_for_address kernel test robot
@ 2025-11-11 7:48 ` Christoph Hellwig
2025-11-12 9:33 ` Vlastimil Babka
0 siblings, 1 reply; 6+ messages in thread
From: Christoph Hellwig @ 2025-11-11 7:48 UTC (permalink / raw)
To: kernel test robot
Cc: Vlastimil Babka, Andrew Morton, Christoph Lameter, David Rientjes,
Roman Gushchin, Harry Yoo, linux-mm, oe-lkp, lkp, Jens Axboe,
Martin K. Petersen, Johannes Thumshirn, Anuj Gupta, Kanchan Joshi,
linux-block, linux-kernel
Looks like this is due to the code in poison_element, which tries
to memset more than PAGE_SIZE for a single page. This probably
implies we are the first users of the mempool page helpers for order > 0,
or at least the first one tested by anyone on 32-bit with highmem :)
That code seems to come from
commit bdfedb76f4f5aa5e37380e3b71adee4a39f30fc6
Author: David Rientjes <rientjes@google.com>
Date: Wed Apr 15 16:14:17 2015 -0700
mm, mempool: poison elements backed by slab allocator
originally. The easiest fix would be to just skip poisoning for this
case, although that would reduce the usefulness of the poisoning.
On Tue, Nov 11, 2025 at 02:23:39PM +0800, kernel test robot wrote:
>
>
> Hello,
>
> kernel test robot noticed "BUG:unable_to_handle_page_fault_for_address" on:
>
> commit: ec7f31b2a2d3bf6b9e4d4b8cd156587f1d0607d5 ("block: make bio auto-integrity deadlock safe")
> https://git.kernel.org/cgit/linux/kernel/git/next/linux-next.git master
>
> [test failed on linux-next/master 9c0826a5d9aa4d52206dd89976858457a2a8a7ed]
>
> in testcase: boot
>
> config: i386-randconfig-016-20251107
> compiler: clang-20
> test machine: qemu-system-x86_64 -enable-kvm -cpu SandyBridge -smp 2 -m 32G
> [ 1.772326][ T1] Call Trace:
> [ 1.772326][ T1] poison_element (mm/mempool.c:83 mm/mempool.c:102)
> [ 1.772326][ T1] mempool_init_node (mm/mempool.c:142 mm/mempool.c:226)
> [ 1.772326][ T1] mempool_init_noprof (mm/mempool.c:250 (discriminator 1))
> [ 1.772326][ T1] ? mempool_alloc_pages (mm/mempool.c:640)
> [ 1.772326][ T1] bio_integrity_initfn (block/bio-integrity.c:483 (discriminator 8))
> [ 1.772326][ T1] ? mempool_alloc_pages (mm/mempool.c:640)
> [ 1.772326][ T1] do_one_initcall (init/main.c:1283)
> [ 1.772326][ T1] ? kvm_sched_clock_read (arch/x86/kernel/kvmclock.c:91)
> [ 1.772326][ T1] ? sched_clock_noinstr (arch/x86/kernel/tsc.c:271)
> [ 1.772326][ T1] ? local_clock_noinstr (kernel/sched/clock.c:272 kernel/sched/clock.c:309)
> [ 1.772326][ T1] ? __lock_acquire (kernel/locking/lockdep.c:4674 kernel/locking/lockdep.c:5191)
> [ 1.772326][ T1] ? kvm_sched_clock_read (arch/x86/kernel/kvmclock.c:91)
> [ 1.772326][ T1] ? sched_clock_noinstr (arch/x86/kernel/tsc.c:271)
> [ 1.772326][ T1] ? local_clock_noinstr (kernel/sched/clock.c:272 kernel/sched/clock.c:309)
> [ 1.772326][ T1] ? local_clock (arch/x86/include/asm/preempt.h:85 (discriminator 9) kernel/sched/clock.c:319 (discriminator 9))
> [ 1.772326][ T1] ? lock_release (kernel/locking/lockdep.c:353 kernel/locking/lockdep.c:5542 kernel/locking/lockdep.c:5889)
> [ 1.772326][ T1] ? clockevents_program_event (kernel/time/clockevents.c:?)
> [ 1.772326][ T1] ? ktime_get (include/linux/seqlock.h:391 (discriminator 3) include/linux/seqlock.h:411 (discriminator 3) kernel/time/timekeeping.c:828 (discriminator 3))
> [ 1.772326][ T1] ? sched_balance_trigger (kernel/sched/fair.c:?)
> [ 1.772326][ T1] ? run_posix_cpu_timers (include/linux/sched/deadline.h:15 include/linux/sched/deadline.h:24 kernel/time/posix-cpu-timers.c:1123 kernel/time/posix-cpu-timers.c:1428)
> [ 1.772326][ T1] ? clockevents_program_event (kernel/time/clockevents.c:336)
> [ 1.772326][ T1] ? update_process_times (kernel/time/timer.c:2481)
> [ 1.772326][ T1] ? tick_handle_periodic (kernel/time/tick-common.c:120)
> [ 1.772326][ T1] ? vmware_sched_clock (arch/x86/kernel/apic/apic.c:1052)
> [ 1.772326][ T1] ? trace_hardirqs_on (kernel/trace/trace_preemptirq.c:80)
> [ 1.772326][ T1] ? irqentry_exit (kernel/entry/common.c:224 (discriminator 32768))
> [ 1.772326][ T1] ? sysvec_apic_timer_interrupt (arch/x86/kernel/apic/apic.c:1052 (discriminator 6))
> [ 1.772326][ T1] ? handle_exception (arch/x86/entry/entry_32.S:1055)
> [ 1.772326][ T1] ? netdev_bits (lib/vsprintf.c:650 lib/vsprintf.c:695 lib/vsprintf.c:721 lib/vsprintf.c:1787)
> [ 1.772326][ T1] ? strlen (arch/x86/lib/string_32.c:167)
> [ 1.772326][ T1] ? next_arg (lib/cmdline.c:273)
> [ 1.772326][ T1] ? parameq (kernel/params.c:90 (discriminator 1) kernel/params.c:99 (discriminator 1))
> [ 1.772326][ T1] ? deadline_init (block/bio-integrity.c:482)
> [ 1.772326][ T1] do_initcall_level (init/main.c:1344 (discriminator 6))
> [ 1.772326][ T1] do_initcalls (init/main.c:1358 (discriminator 2))
> [ 1.772326][ T1] do_basic_setup (init/main.c:1381)
> [ 1.772326][ T1] kernel_init_freeable (init/main.c:1597)
> [ 1.772326][ T1] ? rest_init (init/main.c:1475)
> [ 1.772326][ T1] kernel_init (init/main.c:1485)
> [ 1.772326][ T1] ret_from_fork (arch/x86/kernel/process.c:164)
> [ 1.772326][ T1] ? rest_init (init/main.c:1475)
> [ 1.772326][ T1] ret_from_fork_asm (arch/x86/entry/entry_32.S:737)
> [ 1.772326][ T1] entry_INT80_32 (arch/x86/entry/entry_32.S:945)
> [ 1.772326][ T1] Modules linked in:
> [ 1.772326][ T1] CR2: 00000000fffba000
> [ 1.772326][ T1] ---[ end trace 0000000000000000 ]---
> [ 1.772326][ T1] EIP: memset (arch/x86/include/asm/string_32.h:168 arch/x86/lib/memcpy_32.c:17)
> [ 1.772326][ T1] Code: a5 8b 4d f4 83 e1 03 74 02 f3 a4 83 c4 04 5e 5f 5d 2e e9 73 41 01 00 90 90 90 3e 8d 74 26 00 55 89 e5 57 56 89 c6 89 d0 89 f7 <f3> aa 89 f0 5e 5f 5d 2e e9 53 41 01 00 cc cc cc 55 89 e5 53 57 56
> All code
> ========
> 0: a5 movsl %ds:(%rsi),%es:(%rdi)
> 1: 8b 4d f4 mov -0xc(%rbp),%ecx
> 4: 83 e1 03 and $0x3,%ecx
> 7: 74 02 je 0xb
> 9: f3 a4 rep movsb %ds:(%rsi),%es:(%rdi)
> b: 83 c4 04 add $0x4,%esp
> e: 5e pop %rsi
> f: 5f pop %rdi
> 10: 5d pop %rbp
> 11: 2e e9 73 41 01 00 cs jmp 0x1418a
> 17: 90 nop
> 18: 90 nop
> 19: 90 nop
> 1a: 3e 8d 74 26 00 ds lea 0x0(%rsi,%riz,1),%esi
> 1f: 55 push %rbp
> 20: 89 e5 mov %esp,%ebp
> 22: 57 push %rdi
> 23: 56 push %rsi
> 24: 89 c6 mov %eax,%esi
> 26: 89 d0 mov %edx,%eax
> 28: 89 f7 mov %esi,%edi
> 2a:* f3 aa rep stos %al,%es:(%rdi) <-- trapping instruction
> 2c: 89 f0 mov %esi,%eax
> 2e: 5e pop %rsi
> 2f: 5f pop %rdi
> 30: 5d pop %rbp
> 31: 2e e9 53 41 01 00 cs jmp 0x1418a
> 37: cc int3
> 38: cc int3
> 39: cc int3
> 3a: 55 push %rbp
> 3b: 89 e5 mov %esp,%ebp
>
>
> The kernel config and materials to reproduce are available at:
> https://download.01.org/0day-ci/archive/20251111/202511111411.9ebfa1ba-lkp@intel.com
>
>
>
> --
> 0-DAY CI Kernel Test Service
> https://github.com/intel/lkp-tests/wiki
---end quoted text---
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: poison_element vs highmem, was Re: [linux-next:master] [block] ec7f31b2a2: BUG:unable_to_handle_page_fault_for_address
2025-11-11 7:48 ` poison_element vs highmem, was " Christoph Hellwig
@ 2025-11-12 9:33 ` Vlastimil Babka
2025-11-13 7:44 ` Oliver Sang
0 siblings, 1 reply; 6+ messages in thread
From: Vlastimil Babka @ 2025-11-12 9:33 UTC (permalink / raw)
To: Christoph Hellwig, kernel test robot
Cc: Andrew Morton, Christoph Lameter, David Rientjes, Roman Gushchin,
Harry Yoo, linux-mm, oe-lkp, lkp, Jens Axboe, Martin K. Petersen,
Johannes Thumshirn, Anuj Gupta, Kanchan Joshi, linux-block,
linux-kernel
On 11/11/25 08:48, Christoph Hellwig wrote:
> Looks like this is due to the code in poison_element, which tries
> to memset more than PAGE_SIZE for a single page. This probably
> implies we are the first users of the mempool page helpers for order > 0,
> or at least the first one tested by anyone on 32-bit with highmem :)
>
> That code seems to come from
>
> commit bdfedb76f4f5aa5e37380e3b71adee4a39f30fc6
> Author: David Rientjes <rientjes@google.com>
> Date: Wed Apr 15 16:14:17 2015 -0700
>
> mm, mempool: poison elements backed by slab allocator
>
> originally. The easiest fix would be to just skip poisoning for this
> case, although that would reduce the usefulness of the poisoning.
#syz test
----8<----
From 4d97b55c208c611cb01062e0fbf9dbda9f5617d5 Mon Sep 17 00:00:00 2001
From: Vlastimil Babka <vbabka@suse.cz>
Date: Wed, 12 Nov 2025 10:29:52 +0100
Subject: [PATCH] mm/mempool: fix poisoning order>0 pages with HIGHMEM
Signed-off-by: Vlastimil Babka <vbabka@suse.cz>
---
mm/mempool.c | 28 ++++++++++++++++++++++------
1 file changed, 22 insertions(+), 6 deletions(-)
diff --git a/mm/mempool.c b/mm/mempool.c
index 1c38e873e546..75fea9441b93 100644
--- a/mm/mempool.c
+++ b/mm/mempool.c
@@ -68,10 +68,18 @@ static void check_element(mempool_t *pool, void *element)
} else if (pool->free == mempool_free_pages) {
/* Mempools backed by page allocator */
int order = (int)(long)pool->pool_data;
- void *addr = kmap_local_page((struct page *)element);
+#ifdef CONFIG_HIGHMEM
+ for (int i = 0; i < (1 << order); i++) {
+ struct page *page = (struct page *)element;
+ void *addr = kmap_local_page(page + i);
- __check_element(pool, addr, 1UL << (PAGE_SHIFT + order));
- kunmap_local(addr);
+ __check_element(pool, addr, PAGE_SIZE);
+ kunmap_local(addr);
+ }
+#else
+ void *addr = page_address((struct page *)element);
+ __check_element(pool, addr, PAGE_SIZE << order);
+#endif
}
}
@@ -97,10 +105,18 @@ static void poison_element(mempool_t *pool, void *element)
} else if (pool->alloc == mempool_alloc_pages) {
/* Mempools backed by page allocator */
int order = (int)(long)pool->pool_data;
- void *addr = kmap_local_page((struct page *)element);
+#ifdef CONFIG_HIGHMEM
+ for (int i = 0; i < (1 << order); i++) {
+ struct page *page = (struct page *)element;
+ void *addr = kmap_local_page(page + i);
- __poison_element(addr, 1UL << (PAGE_SHIFT + order));
- kunmap_local(addr);
+ __poison_element(addr, PAGE_SIZE);
+ kunmap_local(addr);
+ }
+#else
+ void *addr = page_address((struct page *)element);
+ __poison_element(addr, PAGE_SIZE << order);
+#endif
}
}
#else /* CONFIG_SLUB_DEBUG_ON */
--
2.51.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: poison_element vs highmem, was Re: [linux-next:master] [block] ec7f31b2a2: BUG:unable_to_handle_page_fault_for_address
2025-11-12 9:33 ` Vlastimil Babka
@ 2025-11-13 7:44 ` Oliver Sang
2025-11-13 13:48 ` Vlastimil Babka
0 siblings, 1 reply; 6+ messages in thread
From: Oliver Sang @ 2025-11-13 7:44 UTC (permalink / raw)
To: Vlastimil Babka
Cc: Christoph Hellwig, Andrew Morton, Christoph Lameter,
David Rientjes, Roman Gushchin, Harry Yoo, linux-mm, oe-lkp, lkp,
Jens Axboe, Martin K. Petersen, Johannes Thumshirn, Anuj Gupta,
Kanchan Joshi, linux-block, linux-kernel, oliver.sang
hi, Vlastimil Babka,
On Wed, Nov 12, 2025 at 10:33:32AM +0100, Vlastimil Babka wrote:
> On 11/11/25 08:48, Christoph Hellwig wrote:
> > Looks like this is due to the code in poison_element, which tries
> > to memset more than PAGE_SIZE for a single page. This probably
> > implies we are the first users of the mempool page helpers for order > 0,
> > or at least the first one tested by anyone on 32-bit with highmem :)
> >
> > That code seems to come from
> >
> > commit bdfedb76f4f5aa5e37380e3b71adee4a39f30fc6
> > Author: David Rientjes <rientjes@google.com>
> > Date: Wed Apr 15 16:14:17 2015 -0700
> >
> > mm, mempool: poison elements backed by slab allocator
> >
> > originally. The easiest fix would be to just skip poisoning for this
> > case, although that would reduce the usefulness of the poisoning.
>
> #syz test
we applied below patch upon ec7f31b2a2 directly, and confirmed the issue we
reported gone now with the patch.
Tested-by: kernel test robot <oliver.sang@intel.com>
BTW, we are kernel test robot, not the syzbot :) thanks
>
> ----8<----
> From 4d97b55c208c611cb01062e0fbf9dbda9f5617d5 Mon Sep 17 00:00:00 2001
> From: Vlastimil Babka <vbabka@suse.cz>
> Date: Wed, 12 Nov 2025 10:29:52 +0100
> Subject: [PATCH] mm/mempool: fix poisoning order>0 pages with HIGHMEM
>
> Signed-off-by: Vlastimil Babka <vbabka@suse.cz>
> ---
> mm/mempool.c | 28 ++++++++++++++++++++++------
> 1 file changed, 22 insertions(+), 6 deletions(-)
>
> diff --git a/mm/mempool.c b/mm/mempool.c
> index 1c38e873e546..75fea9441b93 100644
> --- a/mm/mempool.c
> +++ b/mm/mempool.c
> @@ -68,10 +68,18 @@ static void check_element(mempool_t *pool, void *element)
> } else if (pool->free == mempool_free_pages) {
> /* Mempools backed by page allocator */
> int order = (int)(long)pool->pool_data;
> - void *addr = kmap_local_page((struct page *)element);
> +#ifdef CONFIG_HIGHMEM
> + for (int i = 0; i < (1 << order); i++) {
> + struct page *page = (struct page *)element;
> + void *addr = kmap_local_page(page + i);
>
> - __check_element(pool, addr, 1UL << (PAGE_SHIFT + order));
> - kunmap_local(addr);
> + __check_element(pool, addr, PAGE_SIZE);
> + kunmap_local(addr);
> + }
> +#else
> + void *addr = page_address((struct page *)element);
> + __check_element(pool, addr, PAGE_SIZE << order);
> +#endif
> }
> }
>
> @@ -97,10 +105,18 @@ static void poison_element(mempool_t *pool, void *element)
> } else if (pool->alloc == mempool_alloc_pages) {
> /* Mempools backed by page allocator */
> int order = (int)(long)pool->pool_data;
> - void *addr = kmap_local_page((struct page *)element);
> +#ifdef CONFIG_HIGHMEM
> + for (int i = 0; i < (1 << order); i++) {
> + struct page *page = (struct page *)element;
> + void *addr = kmap_local_page(page + i);
>
> - __poison_element(addr, 1UL << (PAGE_SHIFT + order));
> - kunmap_local(addr);
> + __poison_element(addr, PAGE_SIZE);
> + kunmap_local(addr);
> + }
> +#else
> + void *addr = page_address((struct page *)element);
> + __poison_element(addr, PAGE_SIZE << order);
> +#endif
> }
> }
> #else /* CONFIG_SLUB_DEBUG_ON */
> --
> 2.51.1
>
>
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: poison_element vs highmem, was Re: [linux-next:master] [block] ec7f31b2a2: BUG:unable_to_handle_page_fault_for_address
2025-11-13 7:44 ` Oliver Sang
@ 2025-11-13 13:48 ` Vlastimil Babka
2025-11-13 14:48 ` Christoph Hellwig
0 siblings, 1 reply; 6+ messages in thread
From: Vlastimil Babka @ 2025-11-13 13:48 UTC (permalink / raw)
To: Oliver Sang
Cc: Christoph Hellwig, Andrew Morton, Christoph Lameter,
David Rientjes, Roman Gushchin, Harry Yoo, linux-mm, oe-lkp, lkp,
Jens Axboe, Martin K. Petersen, Johannes Thumshirn, Anuj Gupta,
Kanchan Joshi, linux-block, linux-kernel
On 11/13/25 08:44, Oliver Sang wrote:
> hi, Vlastimil Babka,
>
> On Wed, Nov 12, 2025 at 10:33:32AM +0100, Vlastimil Babka wrote:
>> On 11/11/25 08:48, Christoph Hellwig wrote:
>> > Looks like this is due to the code in poison_element, which tries
>> > to memset more than PAGE_SIZE for a single page. This probably
>> > implies we are the first users of the mempool page helpers for order > 0,
>> > or at least the first one tested by anyone on 32-bit with highmem :)
>> >
>> > That code seems to come from
>> >
>> > commit bdfedb76f4f5aa5e37380e3b71adee4a39f30fc6
>> > Author: David Rientjes <rientjes@google.com>
>> > Date: Wed Apr 15 16:14:17 2015 -0700
>> >
>> > mm, mempool: poison elements backed by slab allocator
>> >
>> > originally. The easiest fix would be to just skip poisoning for this
>> > case, although that would reduce the usefulness of the poisoning.
>>
>> #syz test
>
> we applied below patch upon ec7f31b2a2 directly, and confirmed the issue we
> reported gone now with the patch.
>
> Tested-by: kernel test robot <oliver.sang@intel.com>
Thanks!
> BTW, we are kernel test robot, not the syzbot :) thanks
Yeah I realized only after sending...
I'll make this a full patch then. How urgent is it, Christoph? I suppose
this is related to the bulk mempool changes, and we discussed the users will
target 6.20 (7.0?) merge window? So landing this fix in 6.19 is enough?
>> ----8<----
>> From 4d97b55c208c611cb01062e0fbf9dbda9f5617d5 Mon Sep 17 00:00:00 2001
>> From: Vlastimil Babka <vbabka@suse.cz>
>> Date: Wed, 12 Nov 2025 10:29:52 +0100
>> Subject: [PATCH] mm/mempool: fix poisoning order>0 pages with HIGHMEM
>>
>> Signed-off-by: Vlastimil Babka <vbabka@suse.cz>
>> ---
>> mm/mempool.c | 28 ++++++++++++++++++++++------
>> 1 file changed, 22 insertions(+), 6 deletions(-)
>>
>> diff --git a/mm/mempool.c b/mm/mempool.c
>> index 1c38e873e546..75fea9441b93 100644
>> --- a/mm/mempool.c
>> +++ b/mm/mempool.c
>> @@ -68,10 +68,18 @@ static void check_element(mempool_t *pool, void *element)
>> } else if (pool->free == mempool_free_pages) {
>> /* Mempools backed by page allocator */
>> int order = (int)(long)pool->pool_data;
>> - void *addr = kmap_local_page((struct page *)element);
>> +#ifdef CONFIG_HIGHMEM
>> + for (int i = 0; i < (1 << order); i++) {
>> + struct page *page = (struct page *)element;
>> + void *addr = kmap_local_page(page + i);
>>
>> - __check_element(pool, addr, 1UL << (PAGE_SHIFT + order));
>> - kunmap_local(addr);
>> + __check_element(pool, addr, PAGE_SIZE);
>> + kunmap_local(addr);
>> + }
>> +#else
>> + void *addr = page_address((struct page *)element);
>> + __check_element(pool, addr, PAGE_SIZE << order);
>> +#endif
>> }
>> }
>>
>> @@ -97,10 +105,18 @@ static void poison_element(mempool_t *pool, void *element)
>> } else if (pool->alloc == mempool_alloc_pages) {
>> /* Mempools backed by page allocator */
>> int order = (int)(long)pool->pool_data;
>> - void *addr = kmap_local_page((struct page *)element);
>> +#ifdef CONFIG_HIGHMEM
>> + for (int i = 0; i < (1 << order); i++) {
>> + struct page *page = (struct page *)element;
>> + void *addr = kmap_local_page(page + i);
>>
>> - __poison_element(addr, 1UL << (PAGE_SHIFT + order));
>> - kunmap_local(addr);
>> + __poison_element(addr, PAGE_SIZE);
>> + kunmap_local(addr);
>> + }
>> +#else
>> + void *addr = page_address((struct page *)element);
>> + __poison_element(addr, PAGE_SIZE << order);
>> +#endif
>> }
>> }
>> #else /* CONFIG_SLUB_DEBUG_ON */
>> --
>> 2.51.1
>>
>>
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: poison_element vs highmem, was Re: [linux-next:master] [block] ec7f31b2a2: BUG:unable_to_handle_page_fault_for_address
2025-11-13 13:48 ` Vlastimil Babka
@ 2025-11-13 14:48 ` Christoph Hellwig
0 siblings, 0 replies; 6+ messages in thread
From: Christoph Hellwig @ 2025-11-13 14:48 UTC (permalink / raw)
To: Vlastimil Babka
Cc: Oliver Sang, Christoph Hellwig, Andrew Morton, Christoph Lameter,
David Rientjes, Roman Gushchin, Harry Yoo, linux-mm, oe-lkp, lkp,
Jens Axboe, Martin K. Petersen, Johannes Thumshirn, Anuj Gupta,
Kanchan Joshi, linux-block, linux-kernel
On Thu, Nov 13, 2025 at 02:48:06PM +0100, Vlastimil Babka wrote:
> I'll make this a full patch then. How urgent is it, Christoph? I suppose
> this is related to the bulk mempool changes, and we discussed the users will
> target 6.20 (7.0?) merge window? So landing this fix in 6.19 is enough?
The trigger is a change in the block tree that is in linux-next. So 6.19
should be fine, although getting it into linux-next ASAP would be great.
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2025-11-13 14:48 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-11-11 6:23 [linux-next:master] [block] ec7f31b2a2: BUG:unable_to_handle_page_fault_for_address kernel test robot
2025-11-11 7:48 ` poison_element vs highmem, was " Christoph Hellwig
2025-11-12 9:33 ` Vlastimil Babka
2025-11-13 7:44 ` Oliver Sang
2025-11-13 13:48 ` Vlastimil Babka
2025-11-13 14:48 ` Christoph Hellwig
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).