mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Barry Song <baohua@kernel.org>
To: "David Hildenbrand (Arm)" <david@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 06:36:24 +0800	[thread overview]
Message-ID: <CAGsJ_4w8zK=xvWhRpyPiPS6JskmVnEH8E9fdQOYmk_PHb1bZtw@mail.gmail.com> (raw)
In-Reply-To: <1e7a712b-33f4-44c2-85ed-6333ddca421c@kernel.org>

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.

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 :-)

Best Regards
Barry

  reply	other threads:[~2026-06-30 22:36 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 [this message]
2026-07-01  8:18                 ` David Hildenbrand (Arm)
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='CAGsJ_4w8zK=xvWhRpyPiPS6JskmVnEH8E9fdQOYmk_PHb1bZtw@mail.gmail.com' \
    --to=baohua@kernel.org \
    --cc=akpm@linux-foundation.org \
    --cc=baoquan.he@linux.dev \
    --cc=chrisl@kernel.org \
    --cc=david@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox