Received: by 2002:a6b:fb09:0:0:0:0:0 with SMTP id h9csp1182096iog; Sat, 25 Jun 2022 03:07:08 -0700 (PDT) X-Google-Smtp-Source: AGRyM1sqgpG6rUPHD1ZuKvLyqfbC8tqvT6pniMtvoPubdV0sPkZSgAFsbpclTskHUKxzvGXmjgsy X-Received: by 2002:a05:6a00:2447:b0:520:6b82:6dfd with SMTP id d7-20020a056a00244700b005206b826dfdmr3885842pfj.39.1656151628629; Sat, 25 Jun 2022 03:07:08 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1656151628; cv=none; d=google.com; s=arc-20160816; b=tdqeOCsRRGVi6h3NpOz7qbtj7PMYRyYOG/8NREbw+r5PhlOuTvttfXwL6ih2gU8xLb 6y90TOTHzEk6aAaBCdRktuY9bnFSonQUQm7mB1uBFVXM+j+/btsg9v2rgi4AtB9KgJuA tGxzNYP5IeEsP3C29DqamAXrJ5g624rR0MqCglGjMVevJQ5v1oEiQWxMMVVdXEbgRGUB K2pcD+uj4n19TwubjKdYMr3ZZk//riegkkLC9IDRl/sekntcrXCY2XrDlGIHHpJmrNl1 2DWLnCHkU17HVppB098bIhnJWkhCIqKi8+N8LzwBqVzqR08b8tSNCey5DITc5khHEfmm ODsQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=nGCa1ZyLJ/feN/RjQYHImnPH8HDpUtyYn5x7/JfCBhk=; b=jCav75aVIhPb/6SwpoxFsdk/lNQ5hHVdIdg0hTr22JwgH0B3jkPYUXdZStaLfOxHis 4UVphU+iBD35lbWdlCwq05p7UiMlnBakN0ORxCtuM53DwGOEDx3+9nlsavKCMYhweEsQ mAC6AT3wQl7BbLL5tcjPBNU8hNReN2Qig8pDUuWlku0hzSjD3+4TyS0y96iw/8Bv9wNG 07EjTtolARwBQ+DXqA2KFqw+yU3ikUkbyReDcyL7dBeCjLkIJ4eWJc+nZIw5HzFHWbcm j+OIkaMpwVCQ7zgZzBEVDvBxJHycG6Xw4rwaXHw4RYhI3qooGD1OhOGeSdm4XFAXD7ls MKJQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=huawei.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id i3-20020a6551c3000000b00408923c31b9si6688684pgq.266.2022.06.25.03.06.56; Sat, 25 Jun 2022 03:07:08 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=huawei.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232621AbiFYJdw (ORCPT + 99 others); Sat, 25 Jun 2022 05:33:52 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37082 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232353AbiFYJdt (ORCPT ); Sat, 25 Jun 2022 05:33:49 -0400 Received: from szxga02-in.huawei.com (szxga02-in.huawei.com [45.249.212.188]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6262F3057E for ; Sat, 25 Jun 2022 02:33:49 -0700 (PDT) Received: from canpemm500002.china.huawei.com (unknown [172.30.72.54]) by szxga02-in.huawei.com (SkyGuard) with ESMTP id 4LVTKF74c2zkWNs; Sat, 25 Jun 2022 17:32:01 +0800 (CST) Received: from huawei.com (10.175.124.27) by canpemm500002.china.huawei.com (7.192.104.244) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2375.24; Sat, 25 Jun 2022 17:33:47 +0800 From: Miaohe Lin To: CC: , , , , , , Subject: [PATCH v3 1/2] mm/swapfile: fix possible data races of inuse_pages Date: Sat, 25 Jun 2022 17:33:45 +0800 Message-ID: <20220625093346.48894-2-linmiaohe@huawei.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20220625093346.48894-1-linmiaohe@huawei.com> References: <20220625093346.48894-1-linmiaohe@huawei.com> MIME-Version: 1.0 Content-Transfer-Encoding: 7BIT Content-Type: text/plain; charset=US-ASCII X-Originating-IP: [10.175.124.27] X-ClientProxiedBy: dggems703-chm.china.huawei.com (10.3.19.180) To canpemm500002.china.huawei.com (7.192.104.244) X-CFilter-Loop: Reflected X-Spam-Status: No, score=-4.2 required=5.0 tests=BAYES_00,RCVD_IN_DNSWL_MED, SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org si->inuse_pages could still be accessed concurrently now. The plain reads outside si->lock critical section, i.e. swap_show and si_swapinfo, which results in data races. READ_ONCE and WRITE_ONCE is used to fix such data races. Note these data races should be ok because they're just used for showing swap info. Signed-off-by: Miaohe Lin Reviewed-by: David Hildenbrand --- mm/swapfile.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mm/swapfile.c b/mm/swapfile.c index edc3420d30e7..5c8681a3f1d9 100644 --- a/mm/swapfile.c +++ b/mm/swapfile.c @@ -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; @@ -2641,7 +2641,7 @@ static int swap_show(struct seq_file *swap, void *v) } bytes = si->pages << (PAGE_SHIFT - 10); - inuse = si->inuse_pages << (PAGE_SHIFT - 10); + inuse = READ_ONCE(si->inuse_pages) << (PAGE_SHIFT - 10); file = si->swap_file; len = seq_file_path(swap, file, " \t\n\\"); @@ -3260,7 +3260,7 @@ void si_swapinfo(struct sysinfo *val) struct swap_info_struct *si = swap_info[type]; if ((si->flags & SWP_USED) && !(si->flags & SWP_WRITEOK)) - nr_to_be_unused += si->inuse_pages; + nr_to_be_unused += READ_ONCE(si->inuse_pages); } val->freeswap = atomic_long_read(&nr_swap_pages) + nr_to_be_unused; val->totalswap = total_swap_pages + nr_to_be_unused; -- 2.23.0