All of lore.kernel.org
 help / color / mirror / Atom feed
From: "David Hildenbrand (Arm)" <david@kernel.org>
To: Barry Song <baohua@kernel.org>
Cc: Kairui Song <ryncsn@gmail.com>,
	akpm@linux-foundation.org, linux-mm@kvack.org,
	baoquan.he@linux.dev, chrisl@kernel.org, jp.kobryn@linux.dev,
	kasong@tencent.com, liam@infradead.org,
	linux-kernel@vger.kernel.org, ljs@kernel.org, mhocko@suse.com,
	nphamcs@gmail.com, rppt@kernel.org, shakeel.butt@linux.dev,
	shikemeng@huaweicloud.com, surenb@google.com,
	usama.arif@linux.dev, vbabka@kernel.org, youngjun.park@lge.com
Subject: Re: [PATCH v2 4/4] mm: try to free swapcache for non-LRU folios
Date: Wed, 1 Jul 2026 10:18:19 +0200	[thread overview]
Message-ID: <430e75bc-3993-40da-9996-71583e44c2d5@kernel.org> (raw)
In-Reply-To: <CAGsJ_4w8zK=xvWhRpyPiPS6JskmVnEH8E9fdQOYmk_PHb1bZtw@mail.gmail.com>

On 7/1/26 00:36, Barry Song wrote:
> On Tue, Jun 30, 2026 at 1:48 PM David Hildenbrand (Arm)
> <david@kernel.org> wrote:
> [...]
>>
>> -       if (vmf->flags & FAULT_FLAG_WRITE) {
>> +       if ((vmf->flags & FAULT_FLAG_WRITE) && !pte_write(pte)) {
>>                 ret |= do_wp_page(vmf);
>>                 if (ret & VM_FAULT_ERROR)
>>                         ret &= VM_FAULT_ERROR;
>>
> 
> Thanks! I'm working on a v3, but one thing still seems a bit odd to me.
> 
> In patch 1, we're removing the local LRU drain from
> do_wp_page(). But in patch 4, do_swap_page() calls
> do_wp_page() for folios without the "exclusive" hint,
> since folios with the hint have already been reused in
> do_swap_page().
> 
> This can happen when we allocate a new folio whose swap
> entry lacks the exclusive flag, even though the folio is
> still reusable. For example, in the scenario I mentioned
> in patch 1, the swap count is effectively 1, but there is
> no exclusive flag:
> 
> #include <sys/mman.h>
> 
> int main(int argc, char *argv[])
> {
>     int i;
>     #define SIZE 30*1024*1024
>     while(1) {
>         volatile int *p = mmap(0, SIZE, PROT_READ | PROT_WRITE,
>              MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
>         volatile int q;
> 
>         for (int i = 0; i < SIZE/sizeof(int); i++)
>               p[i] =  i;
>         madvise((void *)p, SIZE, MADV_PAGEOUT);
>         if (!fork())
>              _exit(0);
>         for (int i = 0; i < SIZE/sizeof(int); i++)
>               q = p[i];
>         for (int i = 0; i < SIZE/sizeof(int); i++)
>               p[i] =  i;
>         munmap(p, SIZE);
>     }
>     return 0;
> }
> 
> The newly allocated folio will likely still be sitting in this
> CPU's local LRU cache. If we drop the drain in patch 1, it seems
> there is little point in calling do_wp_page() from
> do_swap_page(), since we won't be able to reuse the folio while
> it remains in the local LRU cache.

Well, we call do_wp_page() here to avoid another page fault where we would end
up in do_wp_page() and actually break COW.

> 
> So I'm wondering whether we should keep the drain in
> patch 1 by checking for a refcount of 3, or instead do
> something like the following in patch 4:
> 
> 
>         if ((vmf->flags & FAULT_FLAG_WRITE) && !pte_write(pte)) {
>                  lru_add_drain();
>                  ret |= do_wp_page(vmf);
>                  if (ret & VM_FAULT_ERROR)
>                          ret &= VM_FAULT_ERROR;
>        }
> 
> Otherwise, the combination of patches 1 and 4 seems somewhat
> inconsistent. It feels like a strange mix of sweet, spicy,
> hot, and cold—kind of contradictory :-)

Yes, this needs a proper thought.

What you describe is relevant for

e.g.,

swapout
fork -> exclusive bit cleared
child exit -> parent is single user
swapin -> added to swapcache and LRU cache


This is not very odd, so we should keep that working (I think I have
micro-benchmarks for that).

-- 
Cheers,

David


  reply	other threads:[~2026-07-01  8:18 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-06-23 23:16 [PATCH v2 0/4] mm: drop redundant lru_add_drain in anon folio reuse paths Barry Song (Xiaomi)
2026-06-23 23:16 ` [PATCH v2 1/4] mm: avoid unnecessary lru drain for wp_can_reuse_anon_folio() Barry Song (Xiaomi)
2026-06-24 10:14   ` Kairui Song
2026-06-24 15:02   ` David Hildenbrand (Arm)
2026-06-24 21:04     ` Barry Song
2026-06-26 16:25       ` David Hildenbrand (Arm)
2026-06-27  2:44         ` Shakeel Butt
2026-06-27  7:20           ` Barry Song
2026-06-29  7:52             ` David Hildenbrand (Arm)
2026-06-29 23:16               ` Barry Song
2026-06-30  5:38                 ` David Hildenbrand (Arm)
2026-06-23 23:16 ` [PATCH v2 2/4] mm: drop stale folio_ref_count()==1 check in do_swap_page reuse logic Barry Song (Xiaomi)
2026-06-24 15:07   ` David Hildenbrand (Arm)
2026-06-24 21:29     ` Barry Song
2026-06-23 23:16 ` [PATCH v2 3/4] mm: entirely remove lru_add_drain in do_swap_page Barry Song (Xiaomi)
2026-06-24 10:16   ` Kairui Song
2026-06-24 15:10   ` David Hildenbrand (Arm)
2026-06-23 23:16 ` [PATCH v2 4/4] mm: try to free swapcache for non-LRU folios Barry Song (Xiaomi)
2026-06-24 15:20   ` David Hildenbrand (Arm)
2026-06-24 21:14     ` Barry Song
2026-06-25 14:40       ` Kairui Song
2026-06-26 16:35         ` David Hildenbrand (Arm)
2026-06-29 23:59           ` Barry Song
2026-06-30  5:48             ` David Hildenbrand (Arm)
2026-06-30 22:36               ` Barry Song
2026-07-01  8:18                 ` David Hildenbrand (Arm) [this message]
2026-07-01  9:50                   ` Barry Song
2026-07-01 20:09                     ` David Hildenbrand (Arm)

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=430e75bc-3993-40da-9996-71583e44c2d5@kernel.org \
    --to=david@kernel.org \
    --cc=akpm@linux-foundation.org \
    --cc=baohua@kernel.org \
    --cc=baoquan.he@linux.dev \
    --cc=chrisl@kernel.org \
    --cc=jp.kobryn@linux.dev \
    --cc=kasong@tencent.com \
    --cc=liam@infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=ljs@kernel.org \
    --cc=mhocko@suse.com \
    --cc=nphamcs@gmail.com \
    --cc=rppt@kernel.org \
    --cc=ryncsn@gmail.com \
    --cc=shakeel.butt@linux.dev \
    --cc=shikemeng@huaweicloud.com \
    --cc=surenb@google.com \
    --cc=usama.arif@linux.dev \
    --cc=vbabka@kernel.org \
    --cc=youngjun.park@lge.com \
    /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.