From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 44541C433F5 for ; Mon, 25 Oct 2021 07:50:53 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 8D46B60F22 for ; Mon, 25 Oct 2021 07:50:52 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org 8D46B60F22 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=gentwo.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=kvack.org Received: by kanga.kvack.org (Postfix) id 09E376B006C; Mon, 25 Oct 2021 03:50:52 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 04D956B0072; Mon, 25 Oct 2021 03:50:52 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id E7F48940007; Mon, 25 Oct 2021 03:50:51 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0100.hostedemail.com [216.40.44.100]) by kanga.kvack.org (Postfix) with ESMTP id D76C16B006C for ; Mon, 25 Oct 2021 03:50:51 -0400 (EDT) Received: from smtpin07.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay04.hostedemail.com (Postfix) with ESMTP id 85C1D30158 for ; Mon, 25 Oct 2021 07:50:51 +0000 (UTC) X-FDA: 78734188302.07.FE28AA2 Received: from gentwo.de (vmi485042.contaboserver.net [161.97.139.209]) by imf26.hostedemail.com (Postfix) with ESMTP id 8959020019C9 for ; Mon, 25 Oct 2021 07:50:51 +0000 (UTC) Received: by gentwo.de (Postfix, from userid 1001) id 783F5B00267; Mon, 25 Oct 2021 09:50:48 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by gentwo.de (Postfix) with ESMTP id 7443EB00100; Mon, 25 Oct 2021 09:50:48 +0200 (CEST) Date: Mon, 25 Oct 2021 09:50:48 +0200 (CEST) From: Christoph Lameter To: Yuanzheng Song cc: dennis@kernel.org, tj@kernel.org, akpm@linux-foundation.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH -next] mm/percpu: fix data-race with pcpu_nr_empty_pop_pages In-Reply-To: <20211025070015.553813-1-songyuanzheng@huawei.com> Message-ID: References: <20211025070015.553813-1-songyuanzheng@huawei.com> User-Agent: Alpine 2.22 (DEB 394 2020-01-19) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII X-Stat-Signature: tfdtfiygbqzx7bjkusjr7hgftb8ssbk7 X-Rspamd-Server: rspam01 X-Rspamd-Queue-Id: 8959020019C9 Authentication-Results: imf26.hostedemail.com; dkim=none; dmarc=none; spf=pass (imf26.hostedemail.com: domain of cl@gentwo.de designates 161.97.139.209 as permitted sender) smtp.mailfrom=cl@gentwo.de X-HE-Tag: 1635148251-741916 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: On Mon, 25 Oct 2021, Yuanzheng Song wrote: > When reading the pcpu_nr_empty_pop_pages in pcpu_alloc() > and writing the pcpu_nr_empty_pop_pages in > pcpu_update_empty_pages() at the same time, > the data-race occurs. Looks like a use case for the atomic RMV instructions. > To fix this issue, use READ_ONCE() and WRITE_ONCE() to > read and write the pcpu_nr_empty_pop_pages. Never thought that READ_ONCE and WRITE_ONCE can fix races like this. Really? > diff --git a/mm/percpu.c b/mm/percpu.c > index 293009cc03ef..e8ef92e698ab 100644 > --- a/mm/percpu.c > +++ b/mm/percpu.c > @@ -574,7 +574,9 @@ static void pcpu_isolate_chunk(struct pcpu_chunk *chunk) > > if (!chunk->isolated) { > chunk->isolated = true; > - pcpu_nr_empty_pop_pages -= chunk->nr_empty_pop_pages; > + WRITE_ONCE(pcpu_nr_empty_pop_pages, > + READ_ONCE(pcpu_nr_empty_pop_pages) - > + chunk->nr_empty_pop_pages); atomic_sub()? > } > list_move(&chunk->list, &pcpu_chunk_lists[pcpu_to_depopulate_slot]); > } > @@ -585,7 +587,9 @@ static void pcpu_reintegrate_chunk(struct pcpu_chunk *chunk) > > if (chunk->isolated) { > chunk->isolated = false; > - pcpu_nr_empty_pop_pages += chunk->nr_empty_pop_pages; > + WRITE_ONCE(pcpu_nr_empty_pop_pages, > + READ_ONCE(pcpu_nr_empty_pop_pages) + > + chunk->nr_empty_pop_pages); atomic_add()?