]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
mm: swap: use swap_entries_free() drop last ref count in swap_entries_put_nr()
authorKemeng Shi <shikemeng@huaweicloud.com>
Tue, 25 Mar 2025 16:25:24 +0000 (00:25 +0800)
committerAndrew Morton <akpm@linux-foundation.org>
Mon, 12 May 2025 00:48:13 +0000 (17:48 -0700)
Use swap_entries_free() to directly free swap entries when the swap
entries are not cached and referenced, without needing to set swap entries
to set intermediate SWAP_HAS_CACHE state.

Link: https://lkml.kernel.org/r/20250325162528.68385-5-shikemeng@huaweicloud.com
Signed-off-by: Kemeng Shi <shikemeng@huaweicloud.com>
Reviewed-by: Tim Chen <tim.c.chen@linux.intel.com>
Reviewed-by: Baoquan He <bhe@redhat.com>
Cc: Kairui Song <kasong@tencent.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
mm/swapfile.c

index f0ba27db9b3edbf844ce87d3c6a52dc4ef55ef30..f8fe507be4f3525277e79890354ee3af02ff5ec2 100644 (file)
@@ -1498,10 +1498,11 @@ static bool swap_entries_put_nr(struct swap_info_struct *si,
                unlock_cluster(ci);
                goto fallback;
        }
-       for (i = 0; i < nr; i++)
-               WRITE_ONCE(si->swap_map[offset + i], SWAP_HAS_CACHE);
        if (!has_cache)
                swap_entries_free(si, ci, entry, nr);
+       else
+               for (i = 0; i < nr; i++)
+                       WRITE_ONCE(si->swap_map[offset + i], SWAP_HAS_CACHE);
        unlock_cluster(ci);
 
        return has_cache;