mirror-linux/tools/testing/selftests/mm
Alistair Popple be3f38d05c mm/memory: fix spurious warning when unmapping device-private/exclusive pages
Device private and exclusive entries are only supported for anonymous
folios.  This condition is tested in __migrate_device_pages() and
make_device_exclusive() using folio_test_anon().  However the unmap path
tests this assumption using vma_is_anonymous().

This is wrong because whilst anonymous VMAs can only contain folios where
folio_test_anon() is true the opposite relation does not hold.  A folio
for which folio_test_anon() is true does not imply vma_is_anonymous() is
true.  Such a condition can occur if for example a folio is part of a
private filebacked mapping.

In this case vma_is_anonymous() is false as the mapping is filebacked, but
folio_test_anon() may be true, thus permitting devices to migrate the
folio to device private memory.  This can lead to the following spurious
warnings during process teardown:

[  772.737706] ------------[ cut here ]------------
[  772.739201] WARNING: mm/memory.c:1754 at unmap_page_range.cold+0x26/0x18a, CPU#17: hmm-tests/2041
[  772.742050] Modules linked in: test_hmm nvidia_uvm(O) nvidia(O)
[  772.743959] CPU: 17 UID: 0 PID: 2041 Comm: hmm-tests Tainted: G        W  O        7.0.0+ #387 PREEMPT(full)
[  772.747104] Tainted: [W]=WARN, [O]=OOT_MODULE
[  772.748509] Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS rel-1.17.0-0-gb52ca86e094d-prebuilt.qemu.org 04/01/2014
[  772.752117] RIP: 0010:unmap_page_range.cold+0x26/0x18a
[  772.753780] Code: 7e fe ff ff 48 89 4c 24 78 4c 89 44 24 38 e8 f2 ff b1 00 48 8b 4c 24 78 4c 8b 44 24 38 48 8b 44 24 18 48 83 78 48 00 74 04 90 <0f> 0b 90 48 89 ca b8 ff ff 37 00 48 c1 ea 03 48 c1 e0 2a 80 3c 02
[  772.759602] RSP: 0018:ffff888112607550 EFLAGS: 00010286
[  772.761310] RAX: ffff88811bbf4dc0 RBX: dffffc0000000000 RCX: ffffea03e9bfffd8
[  772.763583] RDX: 1ffff1102377e9c1 RSI: 0000000000000008 RDI: ffff88811bbf4e08
[  772.765914] RBP: 0000000000000006 R08: ffff8881059f7448 R09: ffffed10224c0e68
[  772.768184] R10: ffff888112607347 R11: 0000000000000001 R12: 0000000000000001
[  772.770461] R13: ffffea03e9bfffc0 R14: ffff888112607908 R15: ffffea03e9bfffc0
[  772.772782] FS:  00007f327caa2780(0000) GS:ffff888427b7d000(0000) knlGS:0000000000000000
[  772.775328] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[  772.777187] CR2: 00007f327ca89000 CR3: 00000001994d5000 CR4: 00000000000006f0
[  772.779135] Call Trace:
[  772.779792]  <TASK>
[  772.780317]  ? dmirror_interval_invalidate+0x1a3/0x290 [test_hmm]
[  772.781873]  ? vm_normal_page_pud+0x2b0/0x2b0
[  772.782992]  ? __rwlock_init+0x150/0x150
[  772.784006]  ? lock_release+0x216/0x2b0
[  772.785008]  ? __mmu_notifier_invalidate_range_start+0x505/0x6e0
[  772.786522]  ? lock_release+0x216/0x2b0
[  772.787498]  ? unmap_single_vma+0xb6/0x210
[  772.788573]  unmap_vmas+0x27d/0x520
[  772.789506]  ? unmap_single_vma+0x210/0x210
[  772.790607]  ? mas_update_gap.part.0+0x620/0x620
[  772.791834]  unmap_region+0x19e/0x350
[  772.792769]  ? remove_vma+0x130/0x130
[  772.793684]  ? mas_alloc_nodes+0x1f2/0x300
[  772.794730]  vms_complete_munmap_vmas+0x8c1/0xe20
[  772.795926]  ? unmap_region+0x350/0x350
[  772.796917]  do_vmi_align_munmap+0x36a/0x4e0
[  772.798018]  ? lock_release+0x216/0x2b0
[  772.799024]  ? vma_shrink+0x620/0x620
[  772.799983]  do_vmi_munmap+0x150/0x2c0
[  772.800939]  __vm_munmap+0x161/0x2c0
[  772.801872]  ? expand_downwards+0xd60/0xd60
[  772.802948]  ? clockevents_program_event+0x1ef/0x540
[  772.804217]  ? lock_release+0x216/0x2b0
[  772.805158]  __x64_sys_munmap+0x59/0x80
[  772.805776]  do_syscall_64+0xfc/0x670
[  772.806336]  ? irqentry_exit+0xda/0x580
[  772.806976]  entry_SYSCALL_64_after_hwframe+0x4b/0x53
[  772.807772] RIP: 0033:0x7f327cbb2717
[  772.808323] Code: 73 01 c3 48 8b 0d f9 76 0d 00 f7 d8 64 89 01 48 83 c8 ff c3 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 b8 0b 00 00 00 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 8b 0d c9 76 0d 00 f7 d8 64 89 01 48
[  772.811337] RSP: 002b:00007ffde7f57d38 EFLAGS: 00000202 ORIG_RAX: 000000000000000b
[  772.812564] RAX: ffffffffffffffda RBX: 00007f327cc9c000 RCX: 00007f327cbb2717
[  772.813733] RDX: 0000000000000000 RSI: 0000000000400000 RDI: 00007f327c289000
[  772.814867] RBP: 0000000000421360 R08: 000000000000001a R09: 0000000000000000
[  772.815991] R10: 0000000000000003 R11: 0000000000000202 R12: 00007ffde7f57d74
[  772.817121] R13: 00007f327c689010 R14: 0000000000100000 R15: 00007f327c289000
[  772.818272]  </TASK>
[  772.818614] irq event stamp: 0
[  772.819159] hardirqs last  enabled at (0): [<0000000000000000>] 0x0
[  772.820174] hardirqs last disabled at (0): [<ffffffff82a57ab3>] copy_process+0x19f3/0x6440
[  772.821511] softirqs last  enabled at (0): [<ffffffff82a57b00>] copy_process+0x1a40/0x6440
[  772.822869] softirqs last disabled at (0): [<0000000000000000>] 0x0
[  772.823871] ---[ end trace 0000000000000000 ]---

Fix this by using the same check for folio_test_anon() in
zap_nonpresent_ptes(). Also add a hmm-test case for this.

Link: https://lore.kernel.org/20260501065116.2057242-1-apopple@nvidia.com
Fixes: 999dad824c ("mm/shmem: persist uffd-wp bit across zapping for file-backed")
Signed-off-by: Alistair Popple <apopple@nvidia.com>
Reported-by: Arsen Arsenović <aarsenovic@baylibre.com>
Reviewed-by: Balbir Singh <balbirs@nvidia.com>
Cc: David Hildenbrand <david@kernel.org>
Cc: Jason Gunthorpe <jgg@ziepe.ca>
Cc: John Hubbard <jhubbard@nvidia.com>
Cc: Leon Romanovsky <leon@kernel.org>
Cc: Liam R. Howlett <liam@infradead.org>
Cc: Lorenzo Stoakes <ljs@kernel.org>
Cc: Peter Xu <peterx@redhat.com>
Cc: Matthew Brost <matthew.brost@intel.com>
Cc: Michal Hocko <mhocko@suse.com>
Cc: Mike Rapoport <rppt@kernel.org>
Cc: Shuah Khan <shuah@kernel.org>
Cc: Suren Baghdasaryan <surenb@google.com>
Cc: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Cc: Vlastimil Babka <vbabka@kernel.org>
Cc: <stable@vger.kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
2026-05-13 17:40:03 -07:00
..
page_frag selftests/mm: default KDIR to build directory 2026-01-31 14:22:40 -08:00
.gitignore selftests/mm: add folio_split() and filemap_get_entry() race test 2026-04-05 13:53:36 -07:00
Makefile selftests/mm: add folio_split() and filemap_get_entry() race test 2026-04-05 13:53:36 -07:00
charge_reserved_hugetlb.sh selftests: mm: skip charge_reserved_hugetlb without killall 2026-04-18 00:10:56 -07:00
check_config.sh selftests/mm: pass down full CC and CFLAGS to check_config.sh 2026-01-31 14:22:40 -08:00
compaction_test.c selftests: complete kselftest include centralization 2025-11-27 14:24:31 -08:00
config selftests/mm: specify requirement for PROC_MEM_ALWAYS_FORCE=y 2026-04-27 05:54:26 -07:00
cow.c selftests/mm: check that FORCE_READ() succeeded 2026-01-31 14:22:41 -08:00
droppable.c selftests: complete kselftest include centralization 2025-11-27 14:24:31 -08:00
folio_split_race_test.c selftests/mm: add folio_split() and filemap_get_entry() race test 2026-04-05 13:53:36 -07:00
guard-regions.c selftests/mm/guard-regions: skip collapse test when thp not enabled 2026-04-18 00:10:54 -07:00
gup_longterm.c tools/testing/selftests: fix gup_longterm for unknown fs 2026-01-14 22:16:26 -08:00
gup_test.c Significant patch series in this pull request: 2025-12-06 14:01:20 -08:00
hmm-tests.c mm/memory: fix spurious warning when unmapping device-private/exclusive pages 2026-05-13 17:40:03 -07:00
hugepage-mmap.c selftests: complete kselftest include centralization 2025-11-27 14:24:31 -08:00
hugepage-mremap.c selftests: complete kselftest include centralization 2025-11-27 14:24:31 -08:00
hugepage-shm.c selftests/mm: remove unnecessary ia64 code and comment 2024-09-03 21:15:38 -07:00
hugepage-vmemmap.c selftests/mm: remove unnecessary ia64 code and comment 2024-09-03 21:15:38 -07:00
hugetlb-madvise.c selftests/mm: introduce helper to read every page 2026-01-31 14:22:41 -08:00
hugetlb-read-hwpoison.c selftests: complete kselftest include centralization 2025-11-27 14:24:31 -08:00
hugetlb-soft-offline.c selftests: complete kselftest include centralization 2025-11-27 14:24:31 -08:00
hugetlb_dio.c selftests/mm: skip hugetlb_dio tests when DIO alignment is incompatible 2026-04-18 00:10:52 -07:00
hugetlb_fault_after_madv.c selftests: complete kselftest include centralization 2025-11-27 14:24:31 -08:00
hugetlb_madv_vs_map.c selftests: complete kselftest include centralization 2025-11-27 14:24:31 -08:00
hugetlb_reparenting_test.sh selftests/mm: restore default nr_hugepages value during cleanup in hugetlb_reparenting_test.sh 2025-05-11 17:48:29 -07:00
khugepaged.c selftests/mm: remove PROT_EXEC req from file-collapse tests 2025-09-21 14:22:31 -07:00
ksft_compaction.sh selftests/mm: have the harness run each test category separately 2026-01-31 14:22:53 -08:00
ksft_cow.sh selftests/mm: have the harness run each test category separately 2026-01-31 14:22:53 -08:00
ksft_gup_test.sh selftests/mm: have the harness run each test category separately 2026-01-31 14:22:53 -08:00
ksft_hmm.sh selftests/mm: have the harness run each test category separately 2026-01-31 14:22:53 -08:00
ksft_hugetlb.sh selftests/mm: have the harness run each test category separately 2026-01-31 14:22:53 -08:00
ksft_hugevm.sh selftests/mm: have the harness run each test category separately 2026-01-31 14:22:53 -08:00
ksft_ksm.sh selftests/mm: have the harness run each test category separately 2026-01-31 14:22:53 -08:00
ksft_ksm_numa.sh selftests/mm: have the harness run each test category separately 2026-01-31 14:22:53 -08:00
ksft_madv_guard.sh selftests/mm: have the harness run each test category separately 2026-01-31 14:22:53 -08:00
ksft_madv_populate.sh selftests/mm: have the harness run each test category separately 2026-01-31 14:22:53 -08:00
ksft_mdwe.sh selftests/mm: have the harness run each test category separately 2026-01-31 14:22:53 -08:00
ksft_memfd_secret.sh selftests/mm: have the harness run each test category separately 2026-01-31 14:22:53 -08:00
ksft_memory_failure.sh selftests/mm: add memory failure anonymous page test 2026-02-12 15:43:01 -08:00
ksft_migration.sh selftests/mm: have the harness run each test category separately 2026-01-31 14:22:53 -08:00
ksft_mkdirty.sh selftests/mm: have the harness run each test category separately 2026-01-31 14:22:53 -08:00
ksft_mlock.sh selftests/mm: have the harness run each test category separately 2026-01-31 14:22:53 -08:00
ksft_mmap.sh selftests/mm: have the harness run each test category separately 2026-01-31 14:22:53 -08:00
ksft_mremap.sh selftests/mm: have the harness run each test category separately 2026-01-31 14:22:53 -08:00
ksft_page_frag.sh selftests/mm: have the harness run each test category separately 2026-01-31 14:22:53 -08:00
ksft_pagemap.sh selftests/mm: have the harness run each test category separately 2026-01-31 14:22:53 -08:00
ksft_pfnmap.sh selftests/mm: have the harness run each test category separately 2026-01-31 14:22:53 -08:00
ksft_pkey.sh selftests/mm: have the harness run each test category separately 2026-01-31 14:22:53 -08:00
ksft_process_madv.sh selftests/mm: have the harness run each test category separately 2026-01-31 14:22:53 -08:00
ksft_process_mrelease.sh selftests/mm: have the harness run each test category separately 2026-01-31 14:22:53 -08:00
ksft_rmap.sh selftests/mm: have the harness run each test category separately 2026-01-31 14:22:53 -08:00
ksft_soft_dirty.sh selftests/mm: have the harness run each test category separately 2026-01-31 14:22:53 -08:00
ksft_thp.sh selftests/mm: have the harness run each test category separately 2026-01-31 14:22:53 -08:00
ksft_userfaultfd.sh selftests/mm: have the harness run each test category separately 2026-01-31 14:22:53 -08:00
ksft_vma_merge.sh selftests/mm: have the harness run each test category separately 2026-01-31 14:22:53 -08:00
ksft_vmalloc.sh selftests/mm: have the harness run each test category separately 2026-01-31 14:22:53 -08:00
ksm_functional_tests.c Significant patch series in this pull request: 2025-12-06 14:01:20 -08:00
ksm_tests.c selftests: complete kselftest include centralization 2025-11-27 14:24:31 -08:00
madv_populate.c selftests: complete kselftest include centralization 2025-11-27 14:24:31 -08:00
map_fixed_noreplace.c selftests: complete kselftest include centralization 2025-11-27 14:24:31 -08:00
map_hugetlb.c selftests: complete kselftest include centralization 2025-11-27 14:24:31 -08:00
map_populate.c selftests: complete kselftest include centralization 2025-11-27 14:24:31 -08:00
mdwe_test.c selftests: complete kselftest include centralization 2025-11-27 14:24:31 -08:00
memfd_secret.c selftests: complete kselftest include centralization 2025-11-27 14:24:31 -08:00
memory-failure.c selftests/mm: remove duplicate include of unistd.h 2026-04-05 13:53:01 -07:00
merge.c tools/testing/selftests: add merge test for partial msealed range 2026-04-18 00:10:52 -07:00
migration.c selftests/mm: skip migration tests if NUMA is unavailable 2026-04-05 13:52:57 -07:00
mkdirty.c selftests: complete kselftest include centralization 2025-11-27 14:24:31 -08:00
mlock-random-test.c selftests: complete kselftest include centralization 2025-11-27 14:24:31 -08:00
mlock2-tests.c selftests: complete kselftest include centralization 2025-11-27 14:24:31 -08:00
mlock2.h selftests/mm/mlock: print error on failure 2025-03-16 22:06:40 -07:00
mrelease_test.c selftests: complete kselftest include centralization 2025-11-27 14:24:31 -08:00
mremap_dontunmap.c selftests: complete kselftest include centralization 2025-11-27 14:24:31 -08:00
mremap_test.c Significant patch series in this pull request: 2025-12-06 14:01:20 -08:00
mseal_helpers.h selftests/mm: mseal, self_elf: rename TEST_END_CHECK to REPORT_TEST_PASS 2024-07-03 19:30:07 -07:00
mseal_test.c selftests: complete kselftest include centralization 2025-11-27 14:24:31 -08:00
on-fault-limit.c selftests: complete kselftest include centralization 2025-11-27 14:24:31 -08:00
pagemap_ioctl.c selftests/mm: pagemap_ioctl: remove hungarian notation 2026-04-05 13:53:27 -07:00
pfnmap.c selftests/mm: report SKIP in pfnmap if a check fails 2026-01-31 14:22:42 -08:00
pkey-arm64.h selftests/mm: rename pkey register macro 2025-01-13 22:40:56 -08:00
pkey-helpers.h selftests: complete kselftest include centralization 2025-11-27 14:24:31 -08:00
pkey-powerpc.h selftests/mm: fix a build failure on powerpc 2025-05-07 23:39:41 -07:00
pkey-x86.h selftests/mm: ensure pkey-*.h define inline functions only 2025-01-13 22:40:55 -08:00
pkey_sighandler_tests.c selftests/mm: add -Wunreachable-code and fix warnings 2025-09-21 14:22:34 -07:00
pkey_util.c selftests/mm: fix build break when compiling pkey_util.c 2025-05-07 23:39:41 -07:00
prctl_thp_disable.c selftests: complete kselftest include centralization 2025-11-27 14:24:31 -08:00
process_madv.c selftests: complete kselftest include centralization 2025-11-27 14:24:31 -08:00
protection_keys.c selftests/mm: protection_keys: fix dead code 2025-09-21 14:22:34 -07:00
rmap.c selftests: complete kselftest include centralization 2025-11-27 14:24:31 -08:00
run_vmtests.sh selftests/mm: run_vmtests.sh: fix destructive tests invocation 2026-05-13 17:40:01 -07:00
settings selftests/mm: increase timeout from 180 to 900 seconds 2025-06-19 20:48:01 -07:00
soft-dirty.c selftests/mm: soft-dirty: skip two tests when thp is not available 2026-04-18 00:10:54 -07:00
split_huge_page_test.c selftests/mm: split_huge_page_test: skip the test when thp is not available 2026-04-18 00:10:54 -07:00
test_hmm.sh selftests/mm: give scripts execute permission 2023-07-14 09:24:31 -07:00
test_page_frag.sh mm: page_frag: add a test module for page_frag 2024-11-11 10:56:26 -08:00
test_vmalloc.sh lib/test_vmalloc.c: minor fixes to test_vmalloc.c 2026-01-20 19:24:47 -08:00
thp_settings.c selftests/mm: move write_file helper to vm_util 2026-04-18 00:10:54 -07:00
thp_settings.h selftests/mm: move write_file helper to vm_util 2026-04-18 00:10:54 -07:00
thuge-gen.c selftests: complete kselftest include centralization 2025-11-27 14:24:31 -08:00
transhuge-stress.c selftests/mm: transhuge_stress: skip the test when thp not available 2026-04-18 00:10:54 -07:00
uffd-common.c selftests/mm/uffd: remove static address usage in shmem_allocate_area() 2025-11-20 13:44:00 -08:00
uffd-common.h selftests: complete kselftest include centralization 2025-11-27 14:24:31 -08:00
uffd-stress.c selftests/mm/uffd: initialize char variable to Null 2025-11-29 10:41:09 -08:00
uffd-unit-tests.c selftests/mm: fix thread state check in uffd-unit-tests 2025-12-23 11:23:14 -08:00
uffd-wp-mremap.c selftests: complete kselftest include centralization 2025-11-27 14:24:31 -08:00
va_high_addr_switch.c selftests/mm: va_high_addr_switch return fail when either test failed 2026-01-20 19:24:52 -08:00
va_high_addr_switch.sh selftests/mm: fix comment for check_test_requirements 2026-01-20 19:24:52 -08:00
vm_util.c selftests/mm/vm_util: robust write_file() 2026-04-18 00:10:54 -07:00
vm_util.h selftests/mm: move write_file helper to vm_util 2026-04-18 00:10:54 -07:00
write_hugetlb_memory.sh selftests/mm: switch to bash from sh 2024-01-25 23:52:20 -08:00
write_to_hugetlbfs.c selftests/mm/write_to_hugetlbfs: parse -s as size_t 2026-01-20 19:24:50 -08:00