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 kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 263B2C4332F for ; Wed, 12 Jan 2022 15:55:31 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 91BD86B0182; Wed, 12 Jan 2022 10:55:30 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 8CB5E6B0183; Wed, 12 Jan 2022 10:55:30 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 745086B0184; Wed, 12 Jan 2022 10:55:30 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0086.hostedemail.com [216.40.44.86]) by kanga.kvack.org (Postfix) with ESMTP id 4DCE96B0182 for ; Wed, 12 Jan 2022 10:55:30 -0500 (EST) Received: from smtpin12.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay05.hostedemail.com (Postfix) with ESMTP id D86BA181C49A9 for ; Wed, 12 Jan 2022 15:55:29 +0000 (UTC) X-FDA: 79022084778.12.59799A0 Received: from mail.efficios.com (mail.efficios.com [167.114.26.124]) by imf06.hostedemail.com (Postfix) with ESMTP id 82ADA180009 for ; Wed, 12 Jan 2022 15:55:29 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by mail.efficios.com (Postfix) with ESMTP id 01C41257049; Wed, 12 Jan 2022 10:55:29 -0500 (EST) Received: from mail.efficios.com ([127.0.0.1]) by localhost (mail03.efficios.com [127.0.0.1]) (amavisd-new, port 10032) with ESMTP id BVcWybWL_bi8; Wed, 12 Jan 2022 10:55:28 -0500 (EST) Received: from localhost (localhost [127.0.0.1]) by mail.efficios.com (Postfix) with ESMTP id 4B5C62570B5; Wed, 12 Jan 2022 10:55:28 -0500 (EST) DKIM-Filter: OpenDKIM Filter v2.10.3 mail.efficios.com 4B5C62570B5 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=efficios.com; s=default; t=1642002928; bh=WFg5ps5+rGOiI1+k4Cq+mZNosF8jK0dTFL16UiYOiWk=; h=Date:From:To:Message-ID:MIME-Version; b=fmRLPHsVP/QF5FyyRjb2aBgZuSDQh7OaywhK7SeTfXHM4R2c19a5Yd61AYO85Pv5N 72Jl861vvviNpzzrH1teXh7ZV1hXhmWlPmx938QqBVrIuURXXo8D78khStnLZyqt3K PfXilDWWZVR4cGk9B7ZUk8s86d/KUu6pE17gCc9oW9tZpGbfFjIICX8yRNSLdsdhZa hn71Kptp5MKiIU6V4W0zyNArzfOhBW5bD70gKFZsF8VS9Vr5HcNePk9K8+vH9nIAkO lHpg7/ZX0btiLZ8txh46oTODECM7vgd90p0Bsw/cGdGXl6AbndEMb+RZZFry/bhEsK oZlAVl4GdSJOQ== X-Virus-Scanned: amavisd-new at efficios.com Received: from mail.efficios.com ([127.0.0.1]) by localhost (mail03.efficios.com [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id 4i-74l2K70Sf; Wed, 12 Jan 2022 10:55:28 -0500 (EST) Received: from mail03.efficios.com (mail03.efficios.com [167.114.26.124]) by mail.efficios.com (Postfix) with ESMTP id 3A1862572A3; Wed, 12 Jan 2022 10:55:28 -0500 (EST) Date: Wed, 12 Jan 2022 10:55:28 -0500 (EST) From: Mathieu Desnoyers To: Andy Lutomirski Cc: Andrew Morton , linux-mm , Nicholas Piggin , Anton Blanchard , Benjamin Herrenschmidt , Paul Mackerras , Randy Dunlap , linux-arch , x86 , riel , Dave Hansen , Peter Zijlstra , Nadav Amit Message-ID: <1966376798.24734.1642002928208.JavaMail.zimbra@efficios.com> In-Reply-To: References: Subject: Re: [PATCH 05/23] membarrier, kthread: Use _ONCE accessors for task->mm MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Originating-IP: [167.114.26.124] X-Mailer: Zimbra 8.8.15_GA_4180 (ZimbraWebClient - FF96 (Linux)/8.8.15_GA_4177) Thread-Topic: membarrier, kthread: Use _ONCE accessors for task->mm Thread-Index: A55GnHlC9HXtFr5lfVTpW5K+tsFQNQ== X-Stat-Signature: wwbqi68go9bikg1ojtcpkubzejwz37oz Authentication-Results: imf06.hostedemail.com; dkim=pass header.d=efficios.com header.s=default header.b=fmRLPHsV; dmarc=pass (policy=none) header.from=efficios.com; spf=pass (imf06.hostedemail.com: domain of compudj@efficios.com designates 167.114.26.124 as permitted sender) smtp.mailfrom=compudj@efficios.com X-Rspamd-Server: rspam09 X-Rspamd-Queue-Id: 82ADA180009 X-HE-Tag: 1642002929-333245 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 Jan 8, 2022, at 11:43 AM, Andy Lutomirski luto@kernel.org wrote: > membarrier reads cpu_rq(remote cpu)->curr->mm without locking. Use > READ_ONCE() and WRITE_ONCE() to remove the data races. > Acked-by: Mathieu Desnoyers > Cc: Mathieu Desnoyers > Cc: Nicholas Piggin > Cc: Peter Zijlstra > Acked-by: Nicholas Piggin > Signed-off-by: Andy Lutomirski > --- > fs/exec.c | 2 +- > kernel/exit.c | 2 +- > kernel/kthread.c | 4 ++-- > kernel/sched/membarrier.c | 7 ++++--- > 4 files changed, 8 insertions(+), 7 deletions(-) > > diff --git a/fs/exec.c b/fs/exec.c > index 3abbd0294e73..38b05e01c5bd 100644 > --- a/fs/exec.c > +++ b/fs/exec.c > @@ -1006,7 +1006,7 @@ static int exec_mmap(struct mm_struct *mm) > local_irq_disable(); > active_mm = tsk->active_mm; > tsk->active_mm = mm; > - tsk->mm = mm; > + WRITE_ONCE(tsk->mm, mm); /* membarrier reads this without locks */ > /* > * This prevents preemption while active_mm is being loaded and > * it and mm are being updated, which could cause problems for > diff --git a/kernel/exit.c b/kernel/exit.c > index 91a43e57a32e..70f2cbc42015 100644 > --- a/kernel/exit.c > +++ b/kernel/exit.c > @@ -491,7 +491,7 @@ static void exit_mm(void) > */ > smp_mb__after_spinlock(); > local_irq_disable(); > - current->mm = NULL; > + WRITE_ONCE(current->mm, NULL); > membarrier_update_current_mm(NULL); > enter_lazy_tlb(mm, current); > local_irq_enable(); > diff --git a/kernel/kthread.c b/kernel/kthread.c > index 396ae78a1a34..3b18329f885c 100644 > --- a/kernel/kthread.c > +++ b/kernel/kthread.c > @@ -1358,7 +1358,7 @@ void kthread_use_mm(struct mm_struct *mm) > mmgrab(mm); > tsk->active_mm = mm; > } > - tsk->mm = mm; > + WRITE_ONCE(tsk->mm, mm); /* membarrier reads this without locks */ > membarrier_update_current_mm(mm); > switch_mm_irqs_off(active_mm, mm, tsk); > membarrier_finish_switch_mm(mm); > @@ -1399,7 +1399,7 @@ void kthread_unuse_mm(struct mm_struct *mm) > smp_mb__after_spinlock(); > sync_mm_rss(mm); > local_irq_disable(); > - tsk->mm = NULL; > + WRITE_ONCE(tsk->mm, NULL); /* membarrier reads this without locks */ > membarrier_update_current_mm(NULL); > /* active_mm is still 'mm' */ > enter_lazy_tlb(mm, tsk); > diff --git a/kernel/sched/membarrier.c b/kernel/sched/membarrier.c > index 30e964b9689d..327830f89c37 100644 > --- a/kernel/sched/membarrier.c > +++ b/kernel/sched/membarrier.c > @@ -411,7 +411,7 @@ static int membarrier_private_expedited(int flags, int > cpu_id) > goto out; > rcu_read_lock(); > p = rcu_dereference(cpu_rq(cpu_id)->curr); > - if (!p || p->mm != mm) { > + if (!p || READ_ONCE(p->mm) != mm) { > rcu_read_unlock(); > goto out; > } > @@ -424,7 +424,7 @@ static int membarrier_private_expedited(int flags, int > cpu_id) > struct task_struct *p; > > p = rcu_dereference(cpu_rq(cpu)->curr); > - if (p && p->mm == mm) > + if (p && READ_ONCE(p->mm) == mm) > __cpumask_set_cpu(cpu, tmpmask); > } > rcu_read_unlock(); > @@ -522,7 +522,8 @@ static int sync_runqueues_membarrier_state(struct mm_struct > *mm) > struct task_struct *p; > > p = rcu_dereference(rq->curr); > - if (p && p->mm == mm) > + /* exec and kthread_use_mm() write ->mm without locks */ > + if (p && READ_ONCE(p->mm) == mm) > __cpumask_set_cpu(cpu, tmpmask); > } > rcu_read_unlock(); > -- > 2.33.1 -- Mathieu Desnoyers EfficiOS Inc. http://www.efficios.com