From: Matthew Wilcox <willy@infradead.org>
To: Jinjiang Tu <tujinjiang@huawei.com>
Cc: fengwei.yin@intel.com, akpm@linux-foundation.org,
david@redhat.com, linux-mm@kvack.org, wangkefeng.wang@huawei.com
Subject: Re: [PATCH] filemap: optimize order0 folio in filemap_map_pages
Date: Thu, 21 Aug 2025 13:45:45 +0100 [thread overview]
Message-ID: <aKcU-fzxeW3xT5Wv@casper.infradead.org> (raw)
In-Reply-To: <98f0333d-1ae6-4a5b-b5cd-c8abddbfae5e@huawei.com>
On Thu, Aug 21, 2025 at 09:22:48AM +0800, Jinjiang Tu wrote:
> 在 2025/8/20 20:42, Matthew Wilcox 写道:
> > On Wed, Aug 20, 2025 at 09:10:56AM +0800, Jinjiang Tu wrote:
> > > We should call folio_unlock() before folio_put(). In filemap_map_order0_folio(),
> > > if we doesn't set folio into pte, we should unlock and put folio.
> > I agree that folio_unlock() needs to be called before folio_put().
> > What I don't understand is why we need to delay folio_unlock() until
> > right before folio_put(). Can't we leave folio_unlock() where it
> > currently is and only move the folio_put()?
>
> In filemap_map_order0_folio(), assuming the page is hwpoisoned, we skip set_pte_range(),
> the folio should be unlocked and put. If we only move folio_put() to filemap_map_order0_folio(),
> the folio is unlocked when filemap_map_pages() doesn't hold any folio refcount.
Oh, I see. I misread your patch; sorry about that.
However, it is still safe to move only the folio_put() and not move
the folio_unlock()! It's a little subtle, so I'll explain.
We must not free a locked folio. The page allocator has checks for this
and will complain (assuming appropriate debug options are enabled). So
this sequence:
folio_put(folio);
folio_unlock(folio);
is _generally_ unsafe because the folio_put() might be the last put of
the refcount which will cause the folio to be freed. However, if we know
that the folio has a refcount > 1, it's safe because the folio_put()
won't free the folio. We do know that the folio has a refcount >1
because it's in the page cache, which keeps a refcount on the folio.
Since we have it locked, we know that truncation will wait for the unlock
to happen, and truncation will be the last one to put the refcount.
next prev parent reply other threads:[~2025-08-21 12:45 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-08-19 14:06 Jinjiang Tu
2025-08-19 15:52 ` Matthew Wilcox
2025-08-20 1:10 ` Jinjiang Tu
2025-08-20 12:42 ` Matthew Wilcox
2025-08-21 1:22 ` Jinjiang Tu
2025-08-21 12:45 ` Matthew Wilcox [this message]
2025-08-21 12:57 ` David Hildenbrand
2025-08-21 13:20 ` Matthew Wilcox
2025-08-21 13:35 ` David Hildenbrand
2025-09-02 14:04 ` Kefeng Wang
2025-09-03 4:50 ` Matthew Wilcox
2025-09-03 6:22 ` Kefeng Wang
2025-08-22 2:01 ` Jinjiang Tu
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=aKcU-fzxeW3xT5Wv@casper.infradead.org \
--to=willy@infradead.org \
--cc=akpm@linux-foundation.org \
--cc=david@redhat.com \
--cc=fengwei.yin@intel.com \
--cc=linux-mm@kvack.org \
--cc=tujinjiang@huawei.com \
--cc=wangkefeng.wang@huawei.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