mm/swap: skip scanning cluster range if it's empty cluster
authorBaoquan He <bhe@redhat.com>
Wed, 5 Feb 2025 09:27:13 +0000 (17:27 +0800)
committerAndrew Morton <akpm@linux-foundation.org>
Fri, 28 Feb 2025 00:59:48 +0000 (16:59 -0800)
Since ci->lock has been taken when isolating cluster from
si->free_clusters or taking si->percpu_cluster->next[order], it's
unnecessary to scan and check the cluster range availability if i'ts empty
cluster, and this can accelerate the huge page swapping.

Link: https://lkml.kernel.org/r/20250205092721.9395-5-bhe@redhat.com
Signed-off-by: Baoquan He <bhe@redhat.com>
Cc: Chris Li <chrisl@kernel.org>
Cc: Kairui Song <ryncsn@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
mm/swapfile.c

index 3a17e40f4c95957a7d1ac47a95687154d3101e49..0a0c4118759e4c391ddf30991353a6d12dad59be 100644 (file)
@@ -730,6 +730,9 @@ static bool cluster_scan_range(struct swap_info_struct *si,
        unsigned long offset, end = start + nr_pages;
        unsigned char *map = si->swap_map;
 
+       if (cluster_is_empty(ci))
+               return true;
+
        for (offset = start; offset < end; offset++) {
                switch (READ_ONCE(map[offset])) {
                case 0: