From: "David Hildenbrand (Red Hat)" <david@kernel.org>
To: Zi Yan <ziy@nvidia.com>
Cc: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>,
Andrew Morton <akpm@linux-foundation.org>,
Baolin Wang <baolin.wang@linux.alibaba.com>,
"Liam R. Howlett" <Liam.Howlett@oracle.com>,
Nico Pache <npache@redhat.com>,
Ryan Roberts <ryan.roberts@arm.com>, Dev Jain <dev.jain@arm.com>,
Barry Song <baohua@kernel.org>, Lance Yang <lance.yang@linux.dev>,
Miaohe Lin <linmiaohe@huawei.com>,
Naoya Horiguchi <nao.horiguchi@gmail.com>,
Wei Yang <richard.weiyang@gmail.com>,
Balbir Singh <balbirs@nvidia.com>,
linux-mm@kvack.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v2 2/4] mm/huge_memory: replace can_split_folio() with direct refcount calculation
Date: Tue, 25 Nov 2025 09:52:22 +0100 [thread overview]
Message-ID: <2f708eae-7d4b-43b0-83f0-7c2d98b294e6@kernel.org> (raw)
In-Reply-To: <66C159D8-D267-4B3B-9384-1CE94533990E@nvidia.com>
>>
>>>
>>> Like:
>>>
>>> if (folio_test_anon(folio)) {
>>> /* One reference per page from the swapcache. */
>>> ref_count += folio_test_swapcache(folio) << order;
>>> } else {
>>> /* One reference per page from shmem in the swapcache. */
>>> ref_count += folio_test_swapcache(folio) << order;
>>> /* One reference per page from the pagecache. */
>>> ref_count += !!folio->mapping << order;
>>> /* One reference from PG_private. */
>>> ref_count += folio_test_private(folio);
>>> }
>>>
>>> or simplified into
>>>
>>> if (!folio_test_anon(folio)) {
>>> /* One reference per page from the pagecache. */
>>> ref_count += !!folio->mapping << order;
>>> /* One reference from PG_private. */
>>> ref_count += folio_test_private(folio);
>>> }
>>> /* One reference per page from the swapcache (anon or shmem). */
>>> ref_count += folio_test_swapcache(folio) << order;
>>> ?
>>
>> That is incorrect I think due to swapcache being able to give false positives (PG_owner_priv_1).
>
> Got it. So it should be:
>
> if (folio_test_anon(folio)) {
> /* One reference per page from the swapcache. */
> ref_count += folio_test_swapcache(folio) << order;
> } else {
> /* One reference per page from shmem in the swapcache. */
> ref_count += (folio_test_swapbacked (folio) &&
> folio_test_swapcache(folio)) << order;
> /* One reference per page from the pagecache. */
> ref_count += !!folio->mapping << order;
> /* One reference from PG_private. */
> ref_count += folio_test_private(folio);
> }
Interestingly, I think we would then also take proper care of anon folios in the
swapcache that are not anon yet. See __read_swap_cache_async().
I wonder if we can clean that up a bit, to highlight that PG_private etc
do not apply.
if (folio_test_anon(folio)) {
/* One reference per page from the swapcache. */
ref_count += folio_test_swapcache(folio) << order;
} else if (folio_test_swapbacked (folio) && folio_test_swapcache(folio)) {
/* to-be-anon or shmem folio in the swapcache (!folio->mapping) */
ref_count += 1ul << order;
VM_WAN_ON_ONCE(folio->mapping);
} else {
/* One reference per page from the pagecache. */
ref_count += !!folio->mapping << order;
/* One reference from PG_private. */
ref_count += folio_test_private(folio);
}
Or maybe simply:
if (folio_test_swapbacked (folio) && folio_test_swapcache(folio)) {
/*
* (to-be) anon or shmem (!folio->mapping) folio in the swapcache:
* One reference per page from the swapcache.
*/
ref_count += 1 << order;
VM_WAN_ON_ONCE(!folio_test_anon(folio) && folio->mapping);
} else if (!folio_test_anon(folio)) {
/* One reference per page from the pagecache. */
ref_count += !!folio->mapping << order;
/* One reference from PG_private. */
ref_count += folio_test_private(folio);
}
>
> I wonder if we should have folio_test_shmem_in_swapcache() instead.
Interestingly, thinking about it, I think it would also match to-be anon folios
and anon folios.
folio_in_swapcache() maybe ?
>
> BTW, this page flag reuse is really confusing.
Yes ...
> I see PG_checked is
> PG_owner_priv_1 too and __folio_migrate_mapping() uses folio_test_swapcache()
> to decide the number of i_pages entries. Wouldn’t that cause any issue?
Maybe at that point all false positives were ruled out?
It is horrible TBH.
--
Cheers
David
next prev parent reply other threads:[~2025-11-25 8:52 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-11-22 2:55 [PATCH v2 0/4] Improve folio split related functions Zi Yan
2025-11-22 2:55 ` [PATCH v2 1/4] mm/huge_memory: change folio_split_supported() to folio_check_splittable() Zi Yan
2025-11-23 1:50 ` Wei Yang
2025-11-23 18:38 ` Barry Song
2025-11-24 10:33 ` David Hildenbrand (Red Hat)
2025-11-24 16:38 ` Zi Yan
2025-11-25 8:58 ` David Hildenbrand (Red Hat)
2025-11-25 17:44 ` Andrew Morton
2025-11-22 2:55 ` [PATCH v2 2/4] mm/huge_memory: replace can_split_folio() with direct refcount calculation Zi Yan
2025-11-23 1:51 ` Wei Yang
2025-11-24 10:41 ` David Hildenbrand (Red Hat)
2025-11-24 17:05 ` Zi Yan
2025-11-24 19:22 ` David Hildenbrand (Red Hat)
2025-11-24 21:08 ` Zi Yan
2025-11-25 8:52 ` David Hildenbrand (Red Hat) [this message]
2025-11-25 15:55 ` Zi Yan
2025-11-25 9:10 ` Miaohe Lin
2025-11-25 9:34 ` David Hildenbrand (Red Hat)
2025-11-24 22:14 ` Balbir Singh
2025-11-25 8:55 ` David Hildenbrand (Red Hat)
2025-11-25 15:41 ` Zi Yan
2025-11-22 2:55 ` [PATCH v2 3/4] mm/huge_memory: make min_order_for_split() always return an order Zi Yan
2025-11-23 1:53 ` Wei Yang
2025-11-24 10:43 ` David Hildenbrand (Red Hat)
2025-11-24 15:18 ` Lorenzo Stoakes
2025-11-24 17:11 ` Zi Yan
2025-11-22 2:55 ` [PATCH v2 4/4] mm/huge_memory: fix folio split stats counting Zi Yan
2025-11-23 1:56 ` Wei Yang
2025-11-24 10:45 ` David Hildenbrand (Red Hat)
2025-11-24 17:23 ` Zi Yan
2025-11-24 15:21 ` Lorenzo Stoakes
2025-11-24 17:29 ` Zi Yan
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=2f708eae-7d4b-43b0-83f0-7c2d98b294e6@kernel.org \
--to=david@kernel.org \
--cc=Liam.Howlett@oracle.com \
--cc=akpm@linux-foundation.org \
--cc=balbirs@nvidia.com \
--cc=baohua@kernel.org \
--cc=baolin.wang@linux.alibaba.com \
--cc=dev.jain@arm.com \
--cc=lance.yang@linux.dev \
--cc=linmiaohe@huawei.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=lorenzo.stoakes@oracle.com \
--cc=nao.horiguchi@gmail.com \
--cc=npache@redhat.com \
--cc=richard.weiyang@gmail.com \
--cc=ryan.roberts@arm.com \
--cc=ziy@nvidia.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.