Re: [PATCH 2/4] mm: bypass mmap_miss heuristic for VM_EXEC readahead

From: David Hildenbrand (Arm)

Date: Thu Mar 19 2026 - 03:39:00 EST


On 3/18/26 17:43, Jan Kara wrote:
> On Tue 10-03-26 07:51:15, Usama Arif wrote:
>> 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@xxxxxxx/
>>
>> Signed-off-by: Usama Arif <usama.arif@xxxxxxxxx>
>
> 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