diff mbox series

mm: vma remove the redundant avc binded with old folio

Message ID 20240820143359.199-1-justinjiang@vivo.com (mailing list archive)
State New
Headers show
Series mm: vma remove the redundant avc binded with old folio | expand

Commit Message

zhiguojiang Aug. 20, 2024, 2:33 p.m. UTC
After do_wp_page, the vma established a new mapping relationship with
the new folio, and released the mapping relationship with the old folio.
However, the avc binding relationship between the vma and the anon_vma
in old folio still exists, and old folio can still traverse the
unrelated vma during rmap. This is incorrent and will increase the 
rmap redundant overhead.

This patch will remove the avc binding relationship between vma and
anon_vma in old folio, alleviating rmap overhead.

Signed-off-by: Zhiguo Jiang <justinjiang@vivo.com>
---
 include/linux/rmap.h |  1 +
 mm/memory.c          |  8 ++++++++
 mm/rmap.c            | 40 ++++++++++++++++++++++++++++++++++++++++
 3 files changed, 49 insertions(+)

Comments

kernel test robot Aug. 23, 2024, 2:33 a.m. UTC | #1
Hello,

kernel test robot noticed "WARNING:at_mm/rmap.c:#unlink_anon_vmas" on:

commit: ae307233d6efc18c3d6015b127b099450ca8588e ("[PATCH] mm: vma remove the redundant avc binded with old folio")
url: https://github.com/intel-lab-lkp/linux/commits/Zhiguo-Jiang/mm-vma-remove-the-redundant-avc-binded-with-old-folio/20240820-223531
base: https://git.kernel.org/cgit/linux/kernel/git/akpm/mm.git mm-everything
patch link: https://lore.kernel.org/all/20240820143359.199-1-justinjiang@vivo.com/
patch subject: [PATCH] mm: vma remove the redundant avc binded with old folio

in testcase: boot

compiler: gcc-12
test machine: qemu-system-x86_64 -enable-kvm -cpu SandyBridge -smp 2 -m 16G

(please refer to attached dmesg/kmsg for entire log/backtrace)


+----------------------------------------+------------+------------+
|                                        | 75bee94793 | ae307233d6 |
+----------------------------------------+------------+------------+
| WARNING:at_mm/rmap.c:#unlink_anon_vmas | 0          | 6          |
| RIP:unlink_anon_vmas                   | 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/202408230938.43f55b4-lkp@intel.com


[   36.655884][  T197] ------------[ cut here ]------------
[ 36.656843][ T197] WARNING: CPU: 1 PID: 197 at mm/rmap.c:443 unlink_anon_vmas (mm/rmap.c:443 (discriminator 1)) 
[   36.658183][  T197] Modules linked in: sg ata_piix libata crc32_pclmul crc32c_intel scsi_mod polyval_clmulni polyval_generic ghash_clmulni_intel sha512_ssse3 aesni_intel scsi_common cmdlinepart
[   36.660508][  T197] CPU: 1 UID: 0 PID: 197 Comm: lkp-bootstrap Tainted: G                T  6.11.0-rc3-00378-gae307233d6ef #1 5ff8330b382acbcd2719e520175822ac6c64d0eb
[   36.662685][  T197] Tainted: [T]=RANDSTRUCT
[ 36.663288][ T197] RIP: 0010:unlink_anon_vmas (mm/rmap.c:443 (discriminator 1)) 
[ 36.668434][ T197] Code: 7f fe ff ff 48 83 c4 28 5b 5d 41 5c 41 5d 41 5e 41 5f 31 c0 31 d2 31 c9 31 f6 31 ff 45 31 c0 45 31 c9 c3 90 0f 0b 90 eb ad 90 <0f> 0b 90 eb 82 90 0f 0b 90 48 8d 7e 08 e8 2d a2 bf ff e9 ca fc ff
All code
========
   0:	7f fe                	jg     0x0
   2:	ff                   	(bad)
   3:	ff 48 83             	decl   -0x7d(%rax)
   6:	c4                   	(bad)
   7:	28 5b 5d             	sub    %bl,0x5d(%rbx)
   a:	41 5c                	pop    %r12
   c:	41 5d                	pop    %r13
   e:	41 5e                	pop    %r14
  10:	41 5f                	pop    %r15
  12:	31 c0                	xor    %eax,%eax
  14:	31 d2                	xor    %edx,%edx
  16:	31 c9                	xor    %ecx,%ecx
  18:	31 f6                	xor    %esi,%esi
  1a:	31 ff                	xor    %edi,%edi
  1c:	45 31 c0             	xor    %r8d,%r8d
  1f:	45 31 c9             	xor    %r9d,%r9d
  22:	c3                   	ret
  23:	90                   	nop
  24:	0f 0b                	ud2
  26:	90                   	nop
  27:	eb ad                	jmp    0xffffffffffffffd6
  29:	90                   	nop
  2a:*	0f 0b                	ud2		<-- trapping instruction
  2c:	90                   	nop
  2d:	eb 82                	jmp    0xffffffffffffffb1
  2f:	90                   	nop
  30:	0f 0b                	ud2
  32:	90                   	nop
  33:	48 8d 7e 08          	lea    0x8(%rsi),%rdi
  37:	e8 2d a2 bf ff       	call   0xffffffffffbfa269
  3c:	e9                   	.byte 0xe9
  3d:	ca fc ff             	lret   $0xfffc

Code starting with the faulting instruction
===========================================
   0:	0f 0b                	ud2
   2:	90                   	nop
   3:	eb 82                	jmp    0xffffffffffffff87
   5:	90                   	nop
   6:	0f 0b                	ud2
   8:	90                   	nop
   9:	48 8d 7e 08          	lea    0x8(%rsi),%rdi
   d:	e8 2d a2 bf ff       	call   0xffffffffffbfa23f
  12:	e9                   	.byte 0xe9
  13:	ca fc ff             	lret   $0xfffc
[   36.671148][  T197] RSP: 0000:ffffc900019ffad8 EFLAGS: 00010202
[   36.671931][  T197] RAX: 1ffff1102e73f0bf RBX: ffff888173c55ab0 RCX: 0000000000000000
[   36.672880][  T197] RDX: 1ffff110241d68e2 RSI: 0000000000000000 RDI: ffff8881739f85f8
[   36.673933][  T197] RBP: ffff888120eb4700 R08: 0000000000000000 R09: 0000000000000000
[   36.675002][  T197] R10: 0000000000000000 R11: 0000000000000000 R12: ffff8881739f8550
[   36.676082][  T197] R13: ffff888173c55aa0 R14: dffffc0000000000 R15: ffff888120eb4710
[   36.677134][  T197] FS:  0000000000000000(0000) GS:ffff8883af300000(0000) knlGS:0000000000000000
[   36.678328][  T197] CS:  0010 DS: 002b ES: 002b CR0: 0000000080050033
[   36.679207][  T197] CR2: 000000005663e33c CR3: 000000012021c000 CR4: 00000000000406b0
[   36.680251][  T197] Call Trace:
[   36.680681][  T197]  <TASK>
[ 36.681079][ T197] ? __warn (kernel/panic.c:735) 
[ 36.681682][ T197] ? unlink_anon_vmas (mm/rmap.c:443 (discriminator 1)) 
[ 36.682312][ T197] ? report_bug (lib/bug.c:180 lib/bug.c:219) 
[ 36.682920][ T197] ? handle_bug (arch/x86/kernel/traps.c:239) 
[ 36.683494][ T197] ? exc_invalid_op (arch/x86/kernel/traps.c:260 (discriminator 1)) 
[ 36.684125][ T197] ? asm_exc_invalid_op (arch/x86/include/asm/idtentry.h:621) 
[ 36.684804][ T197] ? unlink_anon_vmas (mm/rmap.c:443 (discriminator 1)) 
[ 36.685501][ T197] ? unlink_anon_vmas (mm/rmap.c:400) 
[ 36.686185][ T197] free_pgtables (mm/memory.c:410) 
[ 36.686819][ T197] ? free_pgd_range (mm/memory.c:367) 
[ 36.687466][ T197] ? preempt_count_add (include/linux/ftrace.h:976 kernel/sched/core.c:5634 kernel/sched/core.c:5659) 
[ 36.688179][ T197] exit_mmap (mm/mmap.c:1934) 
[ 36.688758][ T197] ? trace_contention_end (include/trace/events/lock.h:122 (discriminator 52)) 
[ 36.689496][ T197] ? do_vma_munmap (mm/mmap.c:1895) 
[ 36.690125][ T197] ? __mutex_lock (arch/x86/include/asm/preempt.h:103 kernel/locking/mutex.c:618 kernel/locking/mutex.c:752) 
[ 36.690779][ T197] ? __mutex_unlock_slowpath (arch/x86/include/asm/atomic64_64.h:101 include/linux/atomic/atomic-arch-fallback.h:4329 include/linux/atomic/atomic-long.h:1506 include/linux/atomic/atomic-instrumented.h:4481 kernel/locking/mutex.c:929) 
[ 36.691585][ T197] __mmput (kernel/fork.c:1346) 
[ 36.692143][ T197] exit_mm (kernel/exit.c:572) 
[ 36.692699][ T197] do_exit (arch/x86/include/asm/jump_label.h:27 include/linux/jump_label.h:207 include/trace/events/sched.h:333 kernel/exit.c:930) 
[ 36.693256][ T197] ? do_raw_spin_lock (arch/x86/include/asm/atomic.h:107 include/linux/atomic/atomic-arch-fallback.h:2170 include/linux/atomic/atomic-instrumented.h:1302 include/asm-generic/qspinlock.h:111 kernel/locking/spinlock_debug.c:116) 
[ 36.693947][ T197] ? stack_not_used (kernel/exit.c:878) 
[ 36.694605][ T197] ? _raw_spin_unlock_irq (arch/x86/include/asm/irqflags.h:42 arch/x86/include/asm/irqflags.h:97 include/linux/spinlock_api_smp.h:159 kernel/locking/spinlock.c:202) 
[ 36.695304][ T197] do_group_exit (kernel/exit.c:1069) 
[ 36.695908][ T197] __ia32_sys_exit_group (kernel/exit.c:1097) 
[ 36.696561][ T197] ia32_sys_call (??:?) 
[ 36.697142][ T197] do_int80_emulation (arch/x86/entry/common.c:165 arch/x86/entry/common.c:253) 
[ 36.697852][ T197] asm_int80_emulation (arch/x86/include/asm/idtentry.h:626) 
[   36.698504][  T197] RIP: 0023:0xf7f03092
[ 36.699039][ T197] Code: Unable to access opcode bytes at 0xf7f03068.

Code starting with the faulting instruction
===========================================
[   36.699967][  T197] RSP: 002b:00000000ffcfddd8 EFLAGS: 00000296 ORIG_RAX: 00000000000000fc
[   36.701055][  T197] RAX: ffffffffffffffda RBX: 0000000000000000 RCX: 0000000003323d2f
[   36.702120][  T197] RDX: 00000000ffcfde00 RSI: 0000000056633734 RDI: 00000000f7ef8000
[   36.703147][  T197] RBP: 00000000ffcfdef8 R08: 0000000000000000 R09: 0000000000000000
[   36.704165][  T197] R10: 0000000000000000 R11: 0000000000000000 R12: 0000000000000000
[   36.705185][  T197] R13: 0000000000000000 R14: 0000000000000000 R15: 0000000000000000
[   36.706281][  T197]  </TASK>
[   36.706698][  T197] irq event stamp: 10051
[ 36.707257][ T197] hardirqs last enabled at (10059): console_unlock (arch/x86/include/asm/irqflags.h:26 arch/x86/include/asm/irqflags.h:87 arch/x86/include/asm/irqflags.h:147 kernel/printk/printk.c:341 kernel/printk/printk.c:2801 kernel/printk/printk.c:3120) 
[ 36.708455][ T197] hardirqs last disabled at (10066): console_unlock (kernel/printk/printk.c:339 kernel/printk/printk.c:2801 kernel/printk/printk.c:3120) 
[ 36.709660][ T197] softirqs last enabled at (10006): handle_softirqs (arch/x86/include/asm/preempt.h:26 kernel/softirq.c:401 kernel/softirq.c:582) 
[ 36.710805][ T197] softirqs last disabled at (9997): irq_exit_rcu (kernel/softirq.c:589 kernel/softirq.c:428 kernel/softirq.c:637 kernel/softirq.c:649) 
[   36.711941][  T197] ---[ end trace 0000000000000000 ]---


The kernel config and materials to reproduce are available at:
https://download.01.org/0day-ci/archive/20240823/202408230938.43f55b4-lkp@intel.com
zhiguojiang Aug. 23, 2024, 2:04 p.m. UTC | #2
在 2024/8/23 10:33, kernel test robot 写道:
> [Some people who received this message don't often get email from oliver.sang@intel.com. Learn why this is important at https://aka.ms/LearnAboutSenderIdentification ]
>
> Hello,
>
> kernel test robot noticed "WARNING:at_mm/rmap.c:#unlink_anon_vmas" on:
>
> commit: ae307233d6efc18c3d6015b127b099450ca8588e ("[PATCH] mm: vma remove the redundant avc binded with old folio")
> url: https://github.com/intel-lab-lkp/linux/commits/Zhiguo-Jiang/mm-vma-remove-the-redundant-avc-binded-with-old-folio/20240820-223531
> base: https://git.kernel.org/cgit/linux/kernel/git/akpm/mm.git mm-everything
> patch link: https://lore.kernel.org/all/20240820143359.199-1-justinjiang@vivo.com/
> patch subject: [PATCH] mm: vma remove the redundant avc binded with old folio
>
> in testcase: boot
>
> compiler: gcc-12
> test machine: qemu-system-x86_64 -enable-kvm -cpu SandyBridge -smp 2 -m 16G
>
> (please refer to attached dmesg/kmsg for entire log/backtrace)
>
>
> +----------------------------------------+------------+------------+
> |                                        | 75bee94793 | ae307233d6 |
> +----------------------------------------+------------+------------+
> | WARNING:at_mm/rmap.c:#unlink_anon_vmas | 0          | 6          |
> | RIP:unlink_anon_vmas                   | 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/202408230938.43f55b4-lkp@intel.com
Fix the issue, please help to review again.
https://lore.kernel.org/linux-mm/20240823140139.263-1-justinjiang@vivo.com/T/#u

Thanks
Zhiguo
>
>
> [   36.655884][  T197] ------------[ cut here ]------------
> [ 36.656843][ T197] WARNING: CPU: 1 PID: 197 at mm/rmap.c:443 unlink_anon_vmas (mm/rmap.c:443 (discriminator 1))
> [   36.658183][  T197] Modules linked in: sg ata_piix libata crc32_pclmul crc32c_intel scsi_mod polyval_clmulni polyval_generic ghash_clmulni_intel sha512_ssse3 aesni_intel scsi_common cmdlinepart
> [   36.660508][  T197] CPU: 1 UID: 0 PID: 197 Comm: lkp-bootstrap Tainted: G                T  6.11.0-rc3-00378-gae307233d6ef #1 5ff8330b382acbcd2719e520175822ac6c64d0eb
> [   36.662685][  T197] Tainted: [T]=RANDSTRUCT
> [ 36.663288][ T197] RIP: 0010:unlink_anon_vmas (mm/rmap.c:443 (discriminator 1))
> [ 36.668434][ T197] Code: 7f fe ff ff 48 83 c4 28 5b 5d 41 5c 41 5d 41 5e 41 5f 31 c0 31 d2 31 c9 31 f6 31 ff 45 31 c0 45 31 c9 c3 90 0f 0b 90 eb ad 90 <0f> 0b 90 eb 82 90 0f 0b 90 48 8d 7e 08 e8 2d a2 bf ff e9 ca fc ff
> All code
> ========
>     0:   7f fe                   jg     0x0
>     2:   ff                      (bad)
>     3:   ff 48 83                decl   -0x7d(%rax)
>     6:   c4                      (bad)
>     7:   28 5b 5d                sub    %bl,0x5d(%rbx)
>     a:   41 5c                   pop    %r12
>     c:   41 5d                   pop    %r13
>     e:   41 5e                   pop    %r14
>    10:   41 5f                   pop    %r15
>    12:   31 c0                   xor    %eax,%eax
>    14:   31 d2                   xor    %edx,%edx
>    16:   31 c9                   xor    %ecx,%ecx
>    18:   31 f6                   xor    %esi,%esi
>    1a:   31 ff                   xor    %edi,%edi
>    1c:   45 31 c0                xor    %r8d,%r8d
>    1f:   45 31 c9                xor    %r9d,%r9d
>    22:   c3                      ret
>    23:   90                      nop
>    24:   0f 0b                   ud2
>    26:   90                      nop
>    27:   eb ad                   jmp    0xffffffffffffffd6
>    29:   90                      nop
>    2a:*  0f 0b                   ud2             <-- trapping instruction
>    2c:   90                      nop
>    2d:   eb 82                   jmp    0xffffffffffffffb1
>    2f:   90                      nop
>    30:   0f 0b                   ud2
>    32:   90                      nop
>    33:   48 8d 7e 08             lea    0x8(%rsi),%rdi
>    37:   e8 2d a2 bf ff          call   0xffffffffffbfa269
>    3c:   e9                      .byte 0xe9
>    3d:   ca fc ff                lret   $0xfffc
>
> Code starting with the faulting instruction
> ===========================================
>     0:   0f 0b                   ud2
>     2:   90                      nop
>     3:   eb 82                   jmp    0xffffffffffffff87
>     5:   90                      nop
>     6:   0f 0b                   ud2
>     8:   90                      nop
>     9:   48 8d 7e 08             lea    0x8(%rsi),%rdi
>     d:   e8 2d a2 bf ff          call   0xffffffffffbfa23f
>    12:   e9                      .byte 0xe9
>    13:   ca fc ff                lret   $0xfffc
> [   36.671148][  T197] RSP: 0000:ffffc900019ffad8 EFLAGS: 00010202
> [   36.671931][  T197] RAX: 1ffff1102e73f0bf RBX: ffff888173c55ab0 RCX: 0000000000000000
> [   36.672880][  T197] RDX: 1ffff110241d68e2 RSI: 0000000000000000 RDI: ffff8881739f85f8
> [   36.673933][  T197] RBP: ffff888120eb4700 R08: 0000000000000000 R09: 0000000000000000
> [   36.675002][  T197] R10: 0000000000000000 R11: 0000000000000000 R12: ffff8881739f8550
> [   36.676082][  T197] R13: ffff888173c55aa0 R14: dffffc0000000000 R15: ffff888120eb4710
> [   36.677134][  T197] FS:  0000000000000000(0000) GS:ffff8883af300000(0000) knlGS:0000000000000000
> [   36.678328][  T197] CS:  0010 DS: 002b ES: 002b CR0: 0000000080050033
> [   36.679207][  T197] CR2: 000000005663e33c CR3: 000000012021c000 CR4: 00000000000406b0
> [   36.680251][  T197] Call Trace:
> [   36.680681][  T197]  <TASK>
> [ 36.681079][ T197] ? __warn (kernel/panic.c:735)
> [ 36.681682][ T197] ? unlink_anon_vmas (mm/rmap.c:443 (discriminator 1))
> [ 36.682312][ T197] ? report_bug (lib/bug.c:180 lib/bug.c:219)
> [ 36.682920][ T197] ? handle_bug (arch/x86/kernel/traps.c:239)
> [ 36.683494][ T197] ? exc_invalid_op (arch/x86/kernel/traps.c:260 (discriminator 1))
> [ 36.684125][ T197] ? asm_exc_invalid_op (arch/x86/include/asm/idtentry.h:621)
> [ 36.684804][ T197] ? unlink_anon_vmas (mm/rmap.c:443 (discriminator 1))
> [ 36.685501][ T197] ? unlink_anon_vmas (mm/rmap.c:400)
> [ 36.686185][ T197] free_pgtables (mm/memory.c:410)
> [ 36.686819][ T197] ? free_pgd_range (mm/memory.c:367)
> [ 36.687466][ T197] ? preempt_count_add (include/linux/ftrace.h:976 kernel/sched/core.c:5634 kernel/sched/core.c:5659)
> [ 36.688179][ T197] exit_mmap (mm/mmap.c:1934)
> [ 36.688758][ T197] ? trace_contention_end (include/trace/events/lock.h:122 (discriminator 52))
> [ 36.689496][ T197] ? do_vma_munmap (mm/mmap.c:1895)
> [ 36.690125][ T197] ? __mutex_lock (arch/x86/include/asm/preempt.h:103 kernel/locking/mutex.c:618 kernel/locking/mutex.c:752)
> [ 36.690779][ T197] ? __mutex_unlock_slowpath (arch/x86/include/asm/atomic64_64.h:101 include/linux/atomic/atomic-arch-fallback.h:4329 include/linux/atomic/atomic-long.h:1506 include/linux/atomic/atomic-instrumented.h:4481 kernel/locking/mutex.c:929)
> [ 36.691585][ T197] __mmput (kernel/fork.c:1346)
> [ 36.692143][ T197] exit_mm (kernel/exit.c:572)
> [ 36.692699][ T197] do_exit (arch/x86/include/asm/jump_label.h:27 include/linux/jump_label.h:207 include/trace/events/sched.h:333 kernel/exit.c:930)
> [ 36.693256][ T197] ? do_raw_spin_lock (arch/x86/include/asm/atomic.h:107 include/linux/atomic/atomic-arch-fallback.h:2170 include/linux/atomic/atomic-instrumented.h:1302 include/asm-generic/qspinlock.h:111 kernel/locking/spinlock_debug.c:116)
> [ 36.693947][ T197] ? stack_not_used (kernel/exit.c:878)
> [ 36.694605][ T197] ? _raw_spin_unlock_irq (arch/x86/include/asm/irqflags.h:42 arch/x86/include/asm/irqflags.h:97 include/linux/spinlock_api_smp.h:159 kernel/locking/spinlock.c:202)
> [ 36.695304][ T197] do_group_exit (kernel/exit.c:1069)
> [ 36.695908][ T197] __ia32_sys_exit_group (kernel/exit.c:1097)
> [ 36.696561][ T197] ia32_sys_call (??:?)
> [ 36.697142][ T197] do_int80_emulation (arch/x86/entry/common.c:165 arch/x86/entry/common.c:253)
> [ 36.697852][ T197] asm_int80_emulation (arch/x86/include/asm/idtentry.h:626)
> [   36.698504][  T197] RIP: 0023:0xf7f03092
> [ 36.699039][ T197] Code: Unable to access opcode bytes at 0xf7f03068.
>
> Code starting with the faulting instruction
> ===========================================
> [   36.699967][  T197] RSP: 002b:00000000ffcfddd8 EFLAGS: 00000296 ORIG_RAX: 00000000000000fc
> [   36.701055][  T197] RAX: ffffffffffffffda RBX: 0000000000000000 RCX: 0000000003323d2f
> [   36.702120][  T197] RDX: 00000000ffcfde00 RSI: 0000000056633734 RDI: 00000000f7ef8000
> [   36.703147][  T197] RBP: 00000000ffcfdef8 R08: 0000000000000000 R09: 0000000000000000
> [   36.704165][  T197] R10: 0000000000000000 R11: 0000000000000000 R12: 0000000000000000
> [   36.705185][  T197] R13: 0000000000000000 R14: 0000000000000000 R15: 0000000000000000
> [   36.706281][  T197]  </TASK>
> [   36.706698][  T197] irq event stamp: 10051
> [ 36.707257][ T197] hardirqs last enabled at (10059): console_unlock (arch/x86/include/asm/irqflags.h:26 arch/x86/include/asm/irqflags.h:87 arch/x86/include/asm/irqflags.h:147 kernel/printk/printk.c:341 kernel/printk/printk.c:2801 kernel/printk/printk.c:3120)
> [ 36.708455][ T197] hardirqs last disabled at (10066): console_unlock (kernel/printk/printk.c:339 kernel/printk/printk.c:2801 kernel/printk/printk.c:3120)
> [ 36.709660][ T197] softirqs last enabled at (10006): handle_softirqs (arch/x86/include/asm/preempt.h:26 kernel/softirq.c:401 kernel/softirq.c:582)
> [ 36.710805][ T197] softirqs last disabled at (9997): irq_exit_rcu (kernel/softirq.c:589 kernel/softirq.c:428 kernel/softirq.c:637 kernel/softirq.c:649)
> [   36.711941][  T197] ---[ end trace 0000000000000000 ]---
>
>
> The kernel config and materials to reproduce are available at:
> https://download.01.org/0day-ci/archive/20240823/202408230938.43f55b4-lkp@intel.com
>
>
>
> --
> 0-DAY CI Kernel Test Service
> https://github.com/intel/lkp-tests/wiki
>
zhiguojiang Aug. 23, 2024, 3:04 p.m. UTC | #3
在 2024/8/23 22:04, zhiguojiang 写道:
>
>
> 在 2024/8/23 10:33, kernel test robot 写道:
>> [Some people who received this message don't often get email from 
>> oliver.sang@intel.com. Learn why this is important at 
>> https://aka.ms/LearnAboutSenderIdentification ]
>>
>> Hello,
>>
>> kernel test robot noticed "WARNING:at_mm/rmap.c:#unlink_anon_vmas" on:
>>
>> commit: ae307233d6efc18c3d6015b127b099450ca8588e ("[PATCH] mm: vma 
>> remove the redundant avc binded with old folio")
>> url: 
>> https://github.com/intel-lab-lkp/linux/commits/Zhiguo-Jiang/mm-vma-remove-the-redundant-avc-binded-with-old-folio/20240820-223531
>> base: https://git.kernel.org/cgit/linux/kernel/git/akpm/mm.git 
>> mm-everything
>> patch link: 
>> https://lore.kernel.org/all/20240820143359.199-1-justinjiang@vivo.com/
>> patch subject: [PATCH] mm: vma remove the redundant avc binded with 
>> old folio
>>
>> in testcase: boot
>>
>> compiler: gcc-12
>> test machine: qemu-system-x86_64 -enable-kvm -cpu SandyBridge -smp 2 
>> -m 16G
>>
>> (please refer to attached dmesg/kmsg for entire log/backtrace)
>>
>>
>> +----------------------------------------+------------+------------+
>> |                                        | 75bee94793 | ae307233d6 |
>> +----------------------------------------+------------+------------+
>> | WARNING:at_mm/rmap.c:#unlink_anon_vmas | 0          | 6          |
>> | RIP:unlink_anon_vmas                   | 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/202408230938.43f55b4-lkp@intel.com
> Fix the issue, please help to review again.
> https://lore.kernel.org/linux-mm/20240823140139.263-1-justinjiang@vivo.com/T/#u 
>
Sorry, please help to review this patch.
https://lore.kernel.org/linux-mm/20240823150206.565-1-justinjiang@vivo.com/T/#u

Thanks
Zhiguo
>
> Thanks
> Zhiguo
>>
>>
>> [   36.655884][  T197] ------------[ cut here ]------------
>> [ 36.656843][ T197] WARNING: CPU: 1 PID: 197 at mm/rmap.c:443 
>> unlink_anon_vmas (mm/rmap.c:443 (discriminator 1))
>> [   36.658183][  T197] Modules linked in: sg ata_piix libata 
>> crc32_pclmul crc32c_intel scsi_mod polyval_clmulni polyval_generic 
>> ghash_clmulni_intel sha512_ssse3 aesni_intel scsi_common cmdlinepart
>> [   36.660508][  T197] CPU: 1 UID: 0 PID: 197 Comm: lkp-bootstrap 
>> Tainted: G                T 6.11.0-rc3-00378-gae307233d6ef #1 
>> 5ff8330b382acbcd2719e520175822ac6c64d0eb
>> [   36.662685][  T197] Tainted: [T]=RANDSTRUCT
>> [ 36.663288][ T197] RIP: 0010:unlink_anon_vmas (mm/rmap.c:443 
>> (discriminator 1))
>> [ 36.668434][ T197] Code: 7f fe ff ff 48 83 c4 28 5b 5d 41 5c 41 5d 
>> 41 5e 41 5f 31 c0 31 d2 31 c9 31 f6 31 ff 45 31 c0 45 31 c9 c3 90 0f 
>> 0b 90 eb ad 90 <0f> 0b 90 eb 82 90 0f 0b 90 48 8d 7e 08 e8 2d a2 bf 
>> ff e9 ca fc ff
>> All code
>> ========
>>     0:   7f fe                   jg     0x0
>>     2:   ff                      (bad)
>>     3:   ff 48 83                decl   -0x7d(%rax)
>>     6:   c4                      (bad)
>>     7:   28 5b 5d                sub    %bl,0x5d(%rbx)
>>     a:   41 5c                   pop    %r12
>>     c:   41 5d                   pop    %r13
>>     e:   41 5e                   pop    %r14
>>    10:   41 5f                   pop    %r15
>>    12:   31 c0                   xor    %eax,%eax
>>    14:   31 d2                   xor    %edx,%edx
>>    16:   31 c9                   xor    %ecx,%ecx
>>    18:   31 f6                   xor    %esi,%esi
>>    1a:   31 ff                   xor    %edi,%edi
>>    1c:   45 31 c0                xor    %r8d,%r8d
>>    1f:   45 31 c9                xor    %r9d,%r9d
>>    22:   c3                      ret
>>    23:   90                      nop
>>    24:   0f 0b                   ud2
>>    26:   90                      nop
>>    27:   eb ad                   jmp    0xffffffffffffffd6
>>    29:   90                      nop
>>    2a:*  0f 0b                   ud2             <-- trapping 
>> instruction
>>    2c:   90                      nop
>>    2d:   eb 82                   jmp    0xffffffffffffffb1
>>    2f:   90                      nop
>>    30:   0f 0b                   ud2
>>    32:   90                      nop
>>    33:   48 8d 7e 08             lea    0x8(%rsi),%rdi
>>    37:   e8 2d a2 bf ff          call   0xffffffffffbfa269
>>    3c:   e9                      .byte 0xe9
>>    3d:   ca fc ff                lret   $0xfffc
>>
>> Code starting with the faulting instruction
>> ===========================================
>>     0:   0f 0b                   ud2
>>     2:   90                      nop
>>     3:   eb 82                   jmp    0xffffffffffffff87
>>     5:   90                      nop
>>     6:   0f 0b                   ud2
>>     8:   90                      nop
>>     9:   48 8d 7e 08             lea    0x8(%rsi),%rdi
>>     d:   e8 2d a2 bf ff          call   0xffffffffffbfa23f
>>    12:   e9                      .byte 0xe9
>>    13:   ca fc ff                lret   $0xfffc
>> [   36.671148][  T197] RSP: 0000:ffffc900019ffad8 EFLAGS: 00010202
>> [   36.671931][  T197] RAX: 1ffff1102e73f0bf RBX: ffff888173c55ab0 
>> RCX: 0000000000000000
>> [   36.672880][  T197] RDX: 1ffff110241d68e2 RSI: 0000000000000000 
>> RDI: ffff8881739f85f8
>> [   36.673933][  T197] RBP: ffff888120eb4700 R08: 0000000000000000 
>> R09: 0000000000000000
>> [   36.675002][  T197] R10: 0000000000000000 R11: 0000000000000000 
>> R12: ffff8881739f8550
>> [   36.676082][  T197] R13: ffff888173c55aa0 R14: dffffc0000000000 
>> R15: ffff888120eb4710
>> [   36.677134][  T197] FS:  0000000000000000(0000) 
>> GS:ffff8883af300000(0000) knlGS:0000000000000000
>> [   36.678328][  T197] CS:  0010 DS: 002b ES: 002b CR0: 0000000080050033
>> [   36.679207][  T197] CR2: 000000005663e33c CR3: 000000012021c000 
>> CR4: 00000000000406b0
>> [   36.680251][  T197] Call Trace:
>> [   36.680681][  T197]  <TASK>
>> [ 36.681079][ T197] ? __warn (kernel/panic.c:735)
>> [ 36.681682][ T197] ? unlink_anon_vmas (mm/rmap.c:443 (discriminator 1))
>> [ 36.682312][ T197] ? report_bug (lib/bug.c:180 lib/bug.c:219)
>> [ 36.682920][ T197] ? handle_bug (arch/x86/kernel/traps.c:239)
>> [ 36.683494][ T197] ? exc_invalid_op (arch/x86/kernel/traps.c:260 
>> (discriminator 1))
>> [ 36.684125][ T197] ? asm_exc_invalid_op 
>> (arch/x86/include/asm/idtentry.h:621)
>> [ 36.684804][ T197] ? unlink_anon_vmas (mm/rmap.c:443 (discriminator 1))
>> [ 36.685501][ T197] ? unlink_anon_vmas (mm/rmap.c:400)
>> [ 36.686185][ T197] free_pgtables (mm/memory.c:410)
>> [ 36.686819][ T197] ? free_pgd_range (mm/memory.c:367)
>> [ 36.687466][ T197] ? preempt_count_add (include/linux/ftrace.h:976 
>> kernel/sched/core.c:5634 kernel/sched/core.c:5659)
>> [ 36.688179][ T197] exit_mmap (mm/mmap.c:1934)
>> [ 36.688758][ T197] ? trace_contention_end 
>> (include/trace/events/lock.h:122 (discriminator 52))
>> [ 36.689496][ T197] ? do_vma_munmap (mm/mmap.c:1895)
>> [ 36.690125][ T197] ? __mutex_lock 
>> (arch/x86/include/asm/preempt.h:103 kernel/locking/mutex.c:618 
>> kernel/locking/mutex.c:752)
>> [ 36.690779][ T197] ? __mutex_unlock_slowpath 
>> (arch/x86/include/asm/atomic64_64.h:101 
>> include/linux/atomic/atomic-arch-fallback.h:4329 
>> include/linux/atomic/atomic-long.h:1506 
>> include/linux/atomic/atomic-instrumented.h:4481 
>> kernel/locking/mutex.c:929)
>> [ 36.691585][ T197] __mmput (kernel/fork.c:1346)
>> [ 36.692143][ T197] exit_mm (kernel/exit.c:572)
>> [ 36.692699][ T197] do_exit (arch/x86/include/asm/jump_label.h:27 
>> include/linux/jump_label.h:207 include/trace/events/sched.h:333 
>> kernel/exit.c:930)
>> [ 36.693256][ T197] ? do_raw_spin_lock 
>> (arch/x86/include/asm/atomic.h:107 
>> include/linux/atomic/atomic-arch-fallback.h:2170 
>> include/linux/atomic/atomic-instrumented.h:1302 
>> include/asm-generic/qspinlock.h:111 kernel/locking/spinlock_debug.c:116)
>> [ 36.693947][ T197] ? stack_not_used (kernel/exit.c:878)
>> [ 36.694605][ T197] ? _raw_spin_unlock_irq 
>> (arch/x86/include/asm/irqflags.h:42 
>> arch/x86/include/asm/irqflags.h:97 
>> include/linux/spinlock_api_smp.h:159 kernel/locking/spinlock.c:202)
>> [ 36.695304][ T197] do_group_exit (kernel/exit.c:1069)
>> [ 36.695908][ T197] __ia32_sys_exit_group (kernel/exit.c:1097)
>> [ 36.696561][ T197] ia32_sys_call (??:?)
>> [ 36.697142][ T197] do_int80_emulation (arch/x86/entry/common.c:165 
>> arch/x86/entry/common.c:253)
>> [ 36.697852][ T197] asm_int80_emulation 
>> (arch/x86/include/asm/idtentry.h:626)
>> [   36.698504][  T197] RIP: 0023:0xf7f03092
>> [ 36.699039][ T197] Code: Unable to access opcode bytes at 0xf7f03068.
>>
>> Code starting with the faulting instruction
>> ===========================================
>> [   36.699967][  T197] RSP: 002b:00000000ffcfddd8 EFLAGS: 00000296 
>> ORIG_RAX: 00000000000000fc
>> [   36.701055][  T197] RAX: ffffffffffffffda RBX: 0000000000000000 
>> RCX: 0000000003323d2f
>> [   36.702120][  T197] RDX: 00000000ffcfde00 RSI: 0000000056633734 
>> RDI: 00000000f7ef8000
>> [   36.703147][  T197] RBP: 00000000ffcfdef8 R08: 0000000000000000 
>> R09: 0000000000000000
>> [   36.704165][  T197] R10: 0000000000000000 R11: 0000000000000000 
>> R12: 0000000000000000
>> [   36.705185][  T197] R13: 0000000000000000 R14: 0000000000000000 
>> R15: 0000000000000000
>> [   36.706281][  T197]  </TASK>
>> [   36.706698][  T197] irq event stamp: 10051
>> [ 36.707257][ T197] hardirqs last enabled at (10059): console_unlock 
>> (arch/x86/include/asm/irqflags.h:26 
>> arch/x86/include/asm/irqflags.h:87 
>> arch/x86/include/asm/irqflags.h:147 kernel/printk/printk.c:341 
>> kernel/printk/printk.c:2801 kernel/printk/printk.c:3120)
>> [ 36.708455][ T197] hardirqs last disabled at (10066): console_unlock 
>> (kernel/printk/printk.c:339 kernel/printk/printk.c:2801 
>> kernel/printk/printk.c:3120)
>> [ 36.709660][ T197] softirqs last enabled at (10006): handle_softirqs 
>> (arch/x86/include/asm/preempt.h:26 kernel/softirq.c:401 
>> kernel/softirq.c:582)
>> [ 36.710805][ T197] softirqs last disabled at (9997): irq_exit_rcu 
>> (kernel/softirq.c:589 kernel/softirq.c:428 kernel/softirq.c:637 
>> kernel/softirq.c:649)
>> [   36.711941][  T197] ---[ end trace 0000000000000000 ]---
>>
>>
>> The kernel config and materials to reproduce are available at:
>> https://download.01.org/0day-ci/archive/20240823/202408230938.43f55b4-lkp@intel.com 
>>
>>
>>
>>
>> -- 
>> 0-DAY CI Kernel Test Service
>> https://github.com/intel/lkp-tests/wiki
>>
>
diff mbox series

Patch

diff --git a/include/linux/rmap.h b/include/linux/rmap.h
index 91b5935e8485..8607d28a3146
--- a/include/linux/rmap.h
+++ b/include/linux/rmap.h
@@ -257,6 +257,7 @@  void folio_remove_rmap_ptes(struct folio *, struct page *, int nr_pages,
 	folio_remove_rmap_ptes(folio, page, 1, vma)
 void folio_remove_rmap_pmd(struct folio *, struct page *,
 		struct vm_area_struct *);
+void folio_remove_anon_avc(struct folio *, struct vm_area_struct *);
 
 void hugetlb_add_anon_rmap(struct folio *, struct vm_area_struct *,
 		unsigned long address, rmap_t flags);
diff --git a/mm/memory.c b/mm/memory.c
index 93c0c25433d0..4c89cb1cb73e
--- a/mm/memory.c
+++ b/mm/memory.c
@@ -3428,6 +3428,14 @@  static vm_fault_t wp_page_copy(struct vm_fault *vmf)
 			 * old page will be flushed before it can be reused.
 			 */
 			folio_remove_rmap_pte(old_folio, vmf->page, vma);
+
+			/*
+			 * If the new_folio's anon_vma is different from the
+			 * old_folio's anon_vma, the avc binding relationship
+			 * between vma and the old_folio's anon_vma is removed,
+			 * avoiding rmap redundant overhead.
+			 */
+			folio_remove_anon_avc(old_folio, vma);
 		}
 
 		/* Free the old page.. */
diff --git a/mm/rmap.c b/mm/rmap.c
index 1103a536e474..0b9111c59dc2
--- a/mm/rmap.c
+++ b/mm/rmap.c
@@ -1522,6 +1522,46 @@  void folio_add_file_rmap_pmd(struct folio *folio, struct page *page,
 #endif
 }
 
+void folio_remove_anon_avc(struct folio *folio,
+		struct vm_area_struct *vma)
+{
+	struct anon_vma *anon_vma = folio_anon_vma(folio);
+	pgoff_t pgoff_start, pgoff_end;
+	struct anon_vma_chain *avc;
+
+	/*
+	 * Ensure that the vma's anon_vma and the folio's
+	 * anon_vma exist and are not the same.
+	 */
+	if (!folio_test_anon(folio) || unlikely(!anon_vma) ||
+	    anon_vma == vma->anon_vma)
+		return;
+
+	pgoff_start = folio_pgoff(folio);
+	pgoff_end = pgoff_start + folio_nr_pages(folio) - 1;
+
+	if (!anon_vma_trylock_write(anon_vma))
+		return;
+
+	anon_vma_interval_tree_foreach(avc, &anon_vma->rb_root,
+			pgoff_start, pgoff_end) {
+		/*
+		 * Find the avc associated with vma from the folio's
+		 * anon_vma and remove it.
+		 */
+		if (avc->vma == vma) {
+			list_del(&avc->same_vma);
+			anon_vma_interval_tree_remove(avc, &anon_vma->rb_root);
+
+			if (RB_EMPTY_ROOT(&anon_vma->rb_root.rb_root))
+				anon_vma->parent->num_children--;
+			anon_vma_chain_free(avc);
+			break;
+		}
+	}
+	anon_vma_unlock_write(anon_vma);
+}
+
 static __always_inline void __folio_remove_rmap(struct folio *folio,
 		struct page *page, int nr_pages, struct vm_area_struct *vma,
 		enum rmap_level level)