]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
mm/ksm: remove page_mapcount() usage in stable_tree_search()
authorDavid Hildenbrand <david@redhat.com>
Tue, 16 Apr 2024 17:25:33 +0000 (19:25 +0200)
committerAndrew Morton <akpm@linux-foundation.org>
Mon, 6 May 2024 00:53:38 +0000 (17:53 -0700)
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>
mm/ksm.c

index 486c9974f8e203fca10078442b9f86429c9c4cc3..159604ad47799caabe4fd78c13d9eb4be8cfcda3 100644 (file)
--- a/mm/ksm.c
+++ b/mm/ksm.c
@@ -1909,12 +1909,15 @@ again:
                        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;
                        }