From: Roman Gushchin <roman.gushchin@linux.dev>
To: Mateusz Guzik <mjguzik@gmail.com>
Cc: Andrew Morton <akpm@linux-foundation.org>,
linux-mm@kvack.org, linux-kernel@vger.kernel.org,
"Matthew Wilcox (Oracle)" <willy@infradead.org>,
Jan Kara <jack@suse.cz>
Subject: Re: [PATCH] mm: readahead: improve mmap_miss heuristic for concurrent faults
Date: Mon, 25 Aug 2025 09:54:29 -0700 [thread overview]
Message-ID: <87plcjxry2.fsf@linux.dev> (raw)
In-Reply-To: <ynl23xmeglxarrkrmh4r3sj3idvqbofwatrnhgx6tsl4zfrsxp@juc5kmjelwjn> (Mateusz Guzik's message of "Mon, 25 Aug 2025 14:27:58 +0200")
Mateusz Guzik <mjguzik@gmail.com> writes:
> On Fri, Aug 15, 2025 at 11:32:24AM -0700, Roman Gushchin wrote:
>> If two or more threads of an application faulting on the same folio,
>> the mmap_miss counter can be decreased multiple times. It breaks the
>> mmap_miss heuristic and keeps the readahead enabled even under extreme
>> levels of memory pressure.
>>
>> It happens often if file folios backing a multi-threaded application
>> are getting evicted and re-faulted.
>>
>> Fix it by skipping decreasing mmap_miss if the folio is locked.
>>
>> This change was evaluated on several hundred thousands hosts in Google's
>> production over a couple of weeks. The number of containers being
>> stuck in a vicious reclaim cycle for a long time was reduced several
>> fold (~10-20x), as well as the overall fleet-wide cpu time spent in
>> direct memory reclaim was meaningfully reduced. No regressions were
>> observed.
>>
>> Signed-off-by: Roman Gushchin <roman.gushchin@linux.dev>
>> Cc: Matthew Wilcox (Oracle) <willy@infradead.org>
>> Cc: Jan Kara <jack@suse.cz>
>> Cc: linux-mm@kvack.org
>> ---
>> mm/filemap.c | 14 +++++++++++---
>> 1 file changed, 11 insertions(+), 3 deletions(-)
>>
>> diff --git a/mm/filemap.c b/mm/filemap.c
>> index c21e98657e0b..983ba1019674 100644
>> --- a/mm/filemap.c
>> +++ b/mm/filemap.c
>> @@ -3324,9 +3324,17 @@ static struct file *do_async_mmap_readahead(struct vm_fault *vmf,
>> if (vmf->vma->vm_flags & VM_RAND_READ || !ra->ra_pages)
>> return fpin;
>>
>> - mmap_miss = READ_ONCE(ra->mmap_miss);
>> - if (mmap_miss)
>> - WRITE_ONCE(ra->mmap_miss, --mmap_miss);
>> + /*
>> + * If the folio is locked, we're likely racing against another fault.
>> + * Don't touch the mmap_miss counter to avoid decreasing it multiple
>> + * times for a single folio and break the balance with mmap_miss
>> + * increase in do_sync_mmap_readahead().
>> + */
>> + if (likely(!folio_test_locked(folio))) {
>> + mmap_miss = READ_ONCE(ra->mmap_miss);
>> + if (mmap_miss)
>> + WRITE_ONCE(ra->mmap_miss, --mmap_miss);
>> + }
>
> I'm not an mm person.
>
> The comment implies the change fixes the race, but it is not at all
> clear to me how.
>
> Does it merely make it significantly less likely?
It's not fixing any race, it's fixing the imbalance in the upward and
downward pressure on the mmap_miss variable. This improves the readahead
behavior under very special circumstances: a multi-threaded application
under very heavy memory pressure. There should be no visible difference
in behavior in other cases.
Thanks!
prev parent reply other threads:[~2025-08-25 16:54 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-08-15 18:32 [PATCH] mm: readahead: improve mmap_miss heuristic for concurrent faults Roman Gushchin
2025-08-19 7:33 ` David Hildenbrand
2025-08-25 8:16 ` Jan Kara
2025-08-25 16:50 ` Roman Gushchin
2025-08-25 12:27 ` Mateusz Guzik
2025-08-25 16:54 ` Roman Gushchin [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87plcjxry2.fsf@linux.dev \
--to=roman.gushchin@linux.dev \
--cc=akpm@linux-foundation.org \
--cc=jack@suse.cz \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=mjguzik@gmail.com \
--cc=willy@infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.