mm-swapfile-fix-possible-data-races-of-inuse_pages-v3
authorMiaohe Lin <linmiaohe@huawei.com>
Sat, 25 Jun 2022 09:33:45 +0000 (17:33 +0800)
committerLiam R. Howlett <Liam.Howlett@oracle.com>
Wed, 20 Jul 2022 00:15:05 +0000 (20:15 -0400)
use WRITE_ONCE to pair with READ_ONCE

Link: https://lkml.kernel.org/r/20220625093346.48894-2-linmiaohe@huawei.com
Signed-off-by: Miaohe Lin <linmiaohe@huawei.com>
Reviewed-by: David Hildenbrand <david@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
mm/swapfile.c

index 91e38174fd623c8ea97cfeef328b0c2a9a9721ee..b5555b680fcdc32aa15bb3d2fd0f482086b3b159 100644 (file)
@@ -695,7 +695,7 @@ static void swap_range_alloc(struct swap_info_struct *si, unsigned long offset,
                si->lowest_bit += nr_entries;
        if (end == si->highest_bit)
                WRITE_ONCE(si->highest_bit, si->highest_bit - nr_entries);
-       si->inuse_pages += nr_entries;
+       WRITE_ONCE(si->inuse_pages, si->inuse_pages + nr_entries);
        if (si->inuse_pages == si->pages) {
                si->lowest_bit = si->max;
                si->highest_bit = 0;
@@ -732,7 +732,7 @@ static void swap_range_free(struct swap_info_struct *si, unsigned long offset,
                        add_to_avail_list(si);
        }
        atomic_long_add(nr_entries, &nr_swap_pages);
-       si->inuse_pages -= nr_entries;
+       WRITE_ONCE(si->inuse_pages, si->inuse_pages - nr_entries);
        if (si->flags & SWP_BLKDEV)
                swap_slot_free_notify =
                        si->bdev->bd_disk->fops->swap_slot_free_notify;