All of lore.kernel.org
 help / color / mirror / Atom feed
From: Baolin Wang <baolin.wang@linux.alibaba.com>
To: David Hildenbrand <david@redhat.com>,
	akpm@linux-foundation.org, hannes@cmpxchg.org
Cc: mhocko@kernel.org, zhengqi.arch@bytedance.com,
	shakeel.butt@linux.dev, lorenzo.stoakes@oracle.com,
	hughd@google.com, willy@infradead.org, linux-mm@kvack.org,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH v2 1/2] mm: vmscan: remove folio_test_private() check in pageout()
Date: Thu, 18 Sep 2025 17:36:17 +0800	[thread overview]
Message-ID: <4e938fa1-c6ea-43fb-abbd-de514842a005@linux.alibaba.com> (raw)
In-Reply-To: <17d1b293-e393-4989-a357-7eea74b3c805@redhat.com>



On 2025/9/18 14:00, David Hildenbrand wrote:
> On 18.09.25 05:46, Baolin Wang wrote:
>> The folio_test_private() check in pageout() was introduced by commit
>> ce91b575332b ("orphaned pagecache memleak fix") in 2005 (checked from
>> a history tree[1]). As the commit message mentioned, it was to address
>> the issue where reiserfs pagecache may be truncated while still pinned.
>> To further explain, the truncation removes the page->mapping, but the
>> page is still listed in the VM queues because it still has buffers.
>>
>> In 2008, commit a2b345642f530 ("Fix dirty page accounting leak with ext3
>> data=journal") seems to be dealing with a similar issue, where the page
>> becomes dirty after truncation, and it provides a very useful call stack:
>> truncate_complete_page()
>>        cancel_dirty_page() // PG_dirty cleared, decr. dirty pages
>>        do_invalidatepage()
>>          ext3_invalidatepage()
>>            journal_invalidatepage()
>>              journal_unmap_buffer()
>>                __dispose_buffer()
>>                  __journal_unfile_buffer()
>>                    __journal_temp_unlink_buffer()
>>                      mark_buffer_dirty(); // PG_dirty set, incr. dirty 
>> pages
>>
>> In this commit a2b345642f530, we forcefully clear the page's dirty flag
>> during truncation (in truncate_complete_page()).
>>
>> Now it seems this was just a peculiar usage specific to reiserfs. Maybe
>> reiserfs had some extra refcount on these pages, which caused them to 
>> pass
>> the is_page_cache_freeable() check. With the fix provided by commit 
>> a2b345642f530
>> and reiserfs being removed in 2024 by commit fb6f20ecb121 ("reiserfs: The
>> last commit"), such a case is unlikely to occur again. So let's remove 
>> the
>> redundant folio_test_private() checks and related buffer_head release 
>> logic,
>> and just leave a warning here to catch such a bug.
>>
>> [1] https://git.kernel.org/pub/scm/linux/kernel/git/tglx/history.git
>> Acked-by: David Hildenbrand <david@redhat.com>
>> Acked-by: Shakeel Butt <shakeel.butt@linux.dev>
>> Signed-off-by: Baolin Wang <baolin.wang@linux.alibaba.com>
>> ---
>>   mm/vmscan.c | 12 +++---------
>>   1 file changed, 3 insertions(+), 9 deletions(-)
>>
>> diff --git a/mm/vmscan.c b/mm/vmscan.c
>> index f1fc36729ddd..930add6d90ab 100644
>> --- a/mm/vmscan.c
>> +++ b/mm/vmscan.c
>> @@ -701,16 +701,10 @@ static pageout_t pageout(struct folio *folio, 
>> struct address_space *mapping,
>>           return PAGE_KEEP;
>>       if (!mapping) {
>>           /*
>> -         * Some data journaling orphaned folios can have
>> -         * folio->mapping == NULL while being dirty with clean buffers.
>> +         * Is it still possible to have a dirty folio with
>> +         * a NULL mapping? I think not.
>>            */
> 
> I would rephrase slightly (removing the "I think not"):
> 
> /*
>   * We should no longer have dirty folios with clean buffers and a NULL
>   * mapping. However, let's be careful for now.
>   */

LGTM.

Andrew, could you help squash these comments into this patch? Thanks.

>> -        if (folio_test_private(folio)) {
>> -            if (try_to_free_buffers(folio)) {
>> -                folio_clear_dirty(folio);
>> -                pr_info("%s: orphaned folio\n", __func__);
>> -                return PAGE_CLEAN;
>> -            }
>> -        }
>> +        VM_WARN_ON_FOLIO(true, folio);
>>           return PAGE_KEEP;
>>       }
> 
> 



  reply	other threads:[~2025-09-18  9:36 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-09-18  3:46 [PATCH v2 0/2] some cleanups for pageout() Baolin Wang
2025-09-18  3:46 ` [PATCH v2 1/2] mm: vmscan: remove folio_test_private() check in pageout() Baolin Wang
2025-09-18  6:00   ` David Hildenbrand
2025-09-18  9:36     ` Baolin Wang [this message]
2025-09-19  1:06       ` Shakeel Butt
2025-09-19  2:12         ` Baolin Wang
2025-09-19  8:00           ` David Hildenbrand
2025-09-22  5:32           ` Hugh Dickins
2025-09-22  6:02             ` Baolin Wang
2025-09-18  3:46 ` [PATCH v2 2/2] mm: vmscan: simplify the folio refcount " Baolin Wang

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=4e938fa1-c6ea-43fb-abbd-de514842a005@linux.alibaba.com \
    --to=baolin.wang@linux.alibaba.com \
    --cc=akpm@linux-foundation.org \
    --cc=david@redhat.com \
    --cc=hannes@cmpxchg.org \
    --cc=hughd@google.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=lorenzo.stoakes@oracle.com \
    --cc=mhocko@kernel.org \
    --cc=shakeel.butt@linux.dev \
    --cc=willy@infradead.org \
    --cc=zhengqi.arch@bytedance.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.