mm/ksm: remove page_mapcount() usage in stable_tree_search()

We want to limit the use of page_mapcount() to the places where it is
absolutely necessary.

If our folio has a stable node, it is a (small) KSM folio -- see
folio_stable_node().  Let's use folio_mapcount() in stable_tree_search()
instead, which results in no functional change.

The mapcount > 1 check is a bit confusing, because that's usually a check
for page sharing.  Looks like the reason is that we are guaranteed to not
exceed ksm_max_page_sharing for the tree KSM folio when merging with that.
Let's update the documentation to make that clearer.

Link: https://lkml.kernel.org/r/20240416172533.663418-1-david@redhat.com
Signed-off-by: David Hildenbrand <david@redhat.com>
Reviewed-by: Alex Shi <alexs@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
David Hildenbrand 2024-04-16 19:25:33 +02:00 committed by Andrew Morton
parent c074e1467f
commit 2aa339120c

View file

@ -1909,12 +1909,15 @@ static struct page *stable_tree_search(struct page *page)
if (page_node) {
VM_BUG_ON(page_node->head != &migrate_nodes);
/*
* Test if the migrated page should be merged
* into a stable node dup. If the mapcount is
* 1 we can migrate it with another KSM page
* without adding it to the chain.
* If the mapcount of our migrated KSM folio is
* at most 1, we can merge it with another
* KSM folio where we know that we have space
* for one more mapping without exceeding the
* ksm_max_page_sharing limit: see
* chain_prune(). This way, we can avoid adding
* this stable node to the chain.
*/
if (page_mapcount(page) > 1)
if (folio_mapcount(folio) > 1)
goto chain_append;
}