Re: [PATCH 2/4] mm: bypass mmap_miss heuristic for VM_EXEC readahead
From: "David Hildenbrand (Arm)" <david@kernel.org>
Date: 2026-03-19 07:37:19
Also in:
linux-fsdevel, linux-mm, lkml
On 3/18/26 17:43, Jan Kara wrote:
On Tue 10-03-26 07:51:15, Usama Arif wrote:quoted
The mmap_miss counter in do_sync_mmap_readahead() tracks whether readahead is useful for mmap'd file access. It is incremented by 1 on every page cache miss in do_sync_mmap_readahead(), and decremented in two places: - filemap_map_pages(): decremented by N for each of N pages successfully mapped via fault-around (pages found already in cache, evidence readahead was useful). Only pages not in the workingset count as hits. - do_async_mmap_readahead(): decremented by 1 when a page with PG_readahead is found in cache. When the counter exceeds MMAP_LOTSAMISS (100), all readahead is disabled, including the targeted VM_EXEC readahead [1] that requests arch-preferred folio orders for contpte mapping. On arm64 with 64K base pages, both decrement paths are inactive: 1. filemap_map_pages() is never called because fault_around_pages (65536 >> PAGE_SHIFT = 1) disables should_fault_around(), which requires fault_around_pages > 1. With only 1 page in the fault-around window, there is nothing "around" to map. 2. do_async_mmap_readahead() never fires for exec mappings because exec readahead sets async_size = 0, so no PG_readahead markers are placed. With no decrements, mmap_miss monotonically increases past MMAP_LOTSAMISS after 100 page faults, disabling all subsequent exec readahead. Fix this by moving the VM_EXEC readahead block above the mmap_miss check. The exec readahead path is targeted. It reads a single folio at the fault location with async_size=0, not speculative prefetch, so the mmap_miss heuristic designed to throttle wasteful speculative readahead should not gate it. The page would need to be faulted in regardless, the only question is at what order. [1] https://lore.kernel.org/all/20250430145920.3748738-6-ryan.roberts@arm.com/ (local) Signed-off-by: Usama Arif <redacted>I can see the problem but I'm not sure what you propose is the right fix. If you move the VM_EXEC logic earlier, you'll effectively disable VM_HUGEPAGE handling for VM_EXEC vmas which I don't think we want. So shouldn't we rather disable mmap_miss logic for VM_EXEC vmas like: if (!(vm_flags & (VM_SEQ_READ | VM_EXEC))) { ... }
That sounds reasonable to me. -- Cheers, David