Deepanshu Kartikey
dd085fe9a8
mm: thp: deny THP for files on anonymous inodes
file_thp_enabled() incorrectly allows THP for files on anonymous inodes
(e.g. guest_memfd and secretmem). These files are created via
alloc_file_pseudo(), which does not call get_write_access() and leaves
inode->i_writecount at 0. Combined with S_ISREG(inode->i_mode) being
true, they appear as read-only regular files when
CONFIG_READ_ONLY_THP_FOR_FS is enabled, making them eligible for THP
collapse.
Anonymous inodes can never pass the inode_is_open_for_write() check
since their i_writecount is never incremented through the normal VFS
open path. The right thing to do is to exclude them from THP eligibility
altogether, since CONFIG_READ_ONLY_THP_FOR_FS was designed for real
filesystem files (e.g. shared libraries), not for pseudo-filesystem
inodes.
For guest_memfd, this allows khugepaged and MADV_COLLAPSE to create
large folios in the page cache via the collapse path, but the
guest_memfd fault handler does not support large folios. This triggers
WARN_ON_ONCE(folio_test_large(folio)) in kvm_gmem_fault_user_mapping().
For secretmem, collapse_file() tries to copy page contents through the
direct map, but secretmem pages are removed from the direct map. This
can result in a kernel crash:
BUG: unable to handle page fault for address: ffff88810284d000
RIP: 0010:memcpy_orig+0x16/0x130
Call Trace:
collapse_file
hpage_collapse_scan_file
madvise_collapse
Secretmem is not affected by the crash on upstream as the memory failure
recovery handles the failed copy gracefully, but it still triggers
confusing false memory failure reports:
Memory failure: 0x106d96f: recovery action for clean unevictable
LRU page: Recovered
Check IS_ANON_FILE(inode) in file_thp_enabled() to deny THP for all
anonymous inode files.
Link: https://syzkaller.appspot.com/bug?extid=33a04338019ac7e43a44
Link: https://lore.kernel.org/linux-mm/CAEvNRgHegcz3ro35ixkDw39ES8=U6rs6S7iP0gkR9enr7HoGtA@mail.gmail.com
Link: https://lkml.kernel.org/r/20260214001535.435626-1-kartikey406@gmail.com
Fixes: 7fbb5e1882 ("mm: remove VM_EXEC requirement for THP eligibility")
Signed-off-by: Deepanshu Kartikey <Kartikey406@gmail.com>
Reported-by: syzbot+33a04338019ac7e43a44@syzkaller.appspotmail.com
Closes: https://syzkaller.appspot.com/bug?extid=33a04338019ac7e43a44
Tested-by: syzbot+33a04338019ac7e43a44@syzkaller.appspotmail.com
Tested-by: Lance Yang <lance.yang@linux.dev>
Acked-by: David Hildenbrand (Arm) <david@kernel.org>
Reviewed-by: Barry Song <baohua@kernel.org>
Reviewed-by: Ackerley Tng <ackerleytng@google.com>
Tested-by: Ackerley Tng <ackerleytng@google.com>
Reviewed-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
Cc: Baolin Wang <baolin.wang@linux.alibaba.com>
Cc: Dev Jain <dev.jain@arm.com>
Cc: Fangrui Song <i@maskray.me>
Cc: Liam Howlett <liam.howlett@oracle.com>
Cc: Nico Pache <npache@redhat.com>
Cc: Ryan Roberts <ryan.roberts@arm.com>
Cc: Yang Shi <shy828301@gmail.com>
Cc: Zi Yan <ziy@nvidia.com>
Cc: <stable@vger.kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
2026-02-24 11:13:26 -08:00
..
2026-02-22 08:26:33 -08:00
2026-02-21 17:09:51 -08:00
2026-02-24 11:13:25 -08:00
2026-02-21 17:09:51 -08:00
2026-01-31 14:22:40 -08:00
2026-02-21 01:02:28 -08:00
2026-01-31 14:22:36 -08:00
2026-01-21 09:38:16 -08:00
2026-02-21 17:09:51 -08:00
2026-02-21 17:09:51 -08:00
2026-02-06 15:47:15 -08:00
2025-05-22 14:55:36 -07:00
2025-09-28 11:51:29 -07:00
2025-05-12 23:50:38 -07:00
2026-01-26 20:02:27 -08:00
2025-11-20 13:43:57 -08:00
2026-02-21 17:09:51 -08:00
2025-07-01 13:25:36 -06:00
2026-01-26 20:02:26 -08:00
2025-09-28 11:51:31 -07:00
2025-10-29 15:50:42 +01:00
2026-02-12 15:42:59 -08:00
2026-02-06 15:47:16 -08:00
2026-02-06 15:47:16 -08:00
2026-01-20 19:24:49 -08:00
2026-01-31 14:22:38 -08:00
2026-02-21 01:02:28 -08:00
2026-02-24 11:13:26 -08:00
2026-02-21 17:09:51 -08:00
2026-01-31 14:22:43 -08:00
2026-01-26 20:02:28 -08:00
2025-11-20 13:43:57 -08:00
2026-01-20 19:24:50 -08:00
2025-11-20 13:43:57 -08:00
2026-01-26 20:02:20 -08:00
2026-02-21 17:09:51 -08:00
2025-09-21 14:22:21 -07:00
2026-01-19 12:30:00 -08:00
2026-02-18 20:50:32 -08:00
2026-02-12 11:32:37 -08:00
2025-11-29 10:41:09 -08:00
2026-02-21 17:09:51 -08:00
2026-02-16 13:41:38 -08:00
2026-02-21 20:03:00 -08:00
2026-02-21 17:09:51 -08:00
2025-07-09 22:42:22 -07:00
2026-02-21 17:09:51 -08:00
2026-02-12 12:13:01 -08:00
2025-11-16 17:27:58 -08:00
2026-02-14 12:39:34 -08:00
2026-02-21 01:02:28 -08:00
2026-02-12 11:32:37 -08:00
2026-02-21 17:09:51 -08:00
2026-02-21 17:09:51 -08:00
2026-02-12 15:42:58 -08:00
2026-01-31 14:22:36 -08:00
2026-02-21 01:02:28 -08:00
2026-02-21 20:03:00 -08:00
2026-02-21 17:09:51 -08:00
2026-02-21 20:03:00 -08:00
2026-02-21 17:09:51 -08:00
2026-01-26 19:03:48 -08:00
2026-01-09 11:53:51 +02:00
2026-01-20 19:24:48 -08:00
2026-01-31 14:22:36 -08:00
2025-11-24 15:08:52 -08:00
2025-11-20 13:43:58 -08:00
2026-02-14 12:39:34 -08:00
2026-01-31 14:22:51 -08:00
2026-02-12 15:42:58 -08:00
2026-02-06 15:47:16 -08:00
2026-02-21 20:03:00 -08:00
2025-09-13 16:55:07 -07:00
2026-01-20 19:24:33 -08:00
2026-02-12 15:42:58 -08:00
2026-01-20 19:24:48 -08:00
2025-09-13 16:54:46 -07:00
2025-08-20 16:31:23 +03:00
2026-02-21 09:58:22 -08:00
2025-05-12 23:50:38 -07:00
2026-01-31 14:22:37 -08:00
2026-02-18 20:50:32 -08:00
2026-01-21 12:51:48 +01:00
2025-11-24 15:08:48 -08:00
2026-01-20 19:24:48 -08:00
2026-01-31 14:22:42 -08:00
2026-02-21 01:02:28 -08:00
2026-02-21 17:09:51 -08:00
2026-01-26 20:02:35 -08:00
2025-11-24 15:08:52 -08:00
2026-01-20 19:24:47 -08:00
2026-01-31 14:22:52 -08:00
2025-09-21 14:22:04 -07:00
2025-07-13 16:38:23 -07:00
2025-11-16 17:27:54 -08:00
2026-01-31 14:22:52 -08:00
2026-01-05 16:43:33 +01:00
2025-11-16 17:27:52 -08:00
2026-02-12 11:32:37 -08:00
2026-02-12 15:43:01 -08:00
2026-02-12 15:42:58 -08:00
2026-02-21 01:02:28 -08:00
2026-02-21 17:09:51 -08:00
2026-01-31 14:22:38 -08:00
2026-01-26 20:02:25 -08:00
2026-02-21 17:09:51 -08:00
2026-02-10 09:10:00 +01:00
2026-02-10 09:10:00 +01:00
2026-02-21 17:09:51 -08:00
2025-11-16 17:27:56 -08:00
2025-10-14 14:24:53 +02:00
2025-03-17 22:06:58 -07:00
2026-01-31 14:22:57 -08:00
2025-09-21 14:22:25 -07:00
2026-01-20 19:24:48 -08:00
2026-01-31 14:22:57 -08:00
2026-02-21 20:03:00 -08:00
2025-12-01 10:26:38 -08:00
2025-11-13 11:01:08 +01:00
2026-01-31 14:22:57 -08:00
2026-02-12 15:42:59 -08:00
2025-11-24 15:08:54 -08:00
2025-10-02 18:18:33 -07:00
2026-02-12 15:42:53 -08:00
2026-02-12 15:42:59 -08:00
2026-02-12 15:42:59 -08:00
2026-02-21 17:09:51 -08:00
2026-02-21 17:09:51 -08:00
2026-02-21 01:02:28 -08:00
2026-02-12 11:32:37 -08:00
2026-01-26 20:02:23 -08:00
2025-09-21 14:21:59 -07:00
2026-02-21 17:09:51 -08:00
2026-02-21 17:09:51 -08:00