Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp1528605ybl; Sat, 25 Jan 2020 02:46:12 -0800 (PST) X-Google-Smtp-Source: APXvYqw5bmysjbEdeiDTqlcYtWnwcfcWmAqKbXNXijYePqvip0tXIT0MiM7PEGC7QVXHKZIhfhqk X-Received: by 2002:a9d:5c10:: with SMTP id o16mr6191771otk.286.1579949172549; Sat, 25 Jan 2020 02:46:12 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1579949172; cv=none; d=google.com; s=arc-20160816; b=Z3ulUdCcRRkPD3NcY/5syohlHmbO9ovtf/QHqNrBPXOzNRqfpi3bgySjkyegCqmWsH XD3iG80rmlJJf5hkj7Q9wRibYjaea52+sCeyTWtuRwTRKDUz/l4KezLCJPyWjdn12Ces ioEYGuvQZSVoTjige1i6COOWKGY0aao86yWVwvVlIZdqMHbgZ9qjkES8S0rUcEVEwRGl raY3SXQ/YIdk9lyCUna12bc/VI+86wwIkjIpvq4CsRHjaMysgFSjJKLWUOqiMV0ClE/7 eDVc9cvrz3xVaS2eReZG0xxA5gCeYScvj046b9m8d8HYZAOAQoV+JYBbM6e/By6auwQg 2AMA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding :robot-unsubscribe:robot-id:message-id:mime-version:references :in-reply-to:cc:subject:to:reply-to:from:date; bh=RXhoJuDN+vxV5foXNcxef15ySqR0WEFoXi3dYxKkCD4=; b=t33d2wt/mKyORdyFKkcDlFzx8w6AxoghcyUeV4XJGuJK1MnLFYOlASn8PU2a6vV5oK N3WSB1OqiOtZPqt2qS0vC065NOUY0TAz6ws0uj3OVzETuobcuUXfSQ/ygMyGHeUOKn6H oU9HDD4IW4bzXTyBOayQvoOErwWxvsW0Rr8RCxZ1xUwAMaNiGufuyvtx2Mfi9Vm2y67I B8ZghTTEpEPSmFgCi36qj+QguC5fEuarw5oO3Le7aKcFcbSsOZuyiPw6od05Dx9WnyKE 5YBSOhlTD/1WakiAH6d8D0kA2SbJsxD47Y2ETjwajcuQorZlTjle6+YOXlwt8pEh8zmz xZbA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 25si1055986oiz.230.2020.01.25.02.46.01; Sat, 25 Jan 2020 02:46:12 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730142AbgAYKnu (ORCPT + 99 others); Sat, 25 Jan 2020 05:43:50 -0500 Received: from Galois.linutronix.de ([193.142.43.55]:44397 "EHLO Galois.linutronix.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729882AbgAYKn2 (ORCPT ); Sat, 25 Jan 2020 05:43:28 -0500 Received: from [5.158.153.53] (helo=tip-bot2.lab.linutronix.de) by Galois.linutronix.de with esmtpsa (TLS1.2:DHE_RSA_AES_256_CBC_SHA256:256) (Exim 4.80) (envelope-from ) id 1ivIuS-0000IJ-G9; Sat, 25 Jan 2020 11:43:24 +0100 Received: from [127.0.1.1] (localhost [IPv6:::1]) by tip-bot2.lab.linutronix.de (Postfix) with ESMTP id 5B9A51C1A96; Sat, 25 Jan 2020 11:42:59 +0100 (CET) Date: Sat, 25 Jan 2020 10:42:59 -0000 From: "tip-bot2 for Paul E. McKenney" Reply-to: linux-kernel@vger.kernel.org To: linux-tip-commits@vger.kernel.org Subject: [tip: core/rcu] rcu: Use *_ONCE() to protect lockless ->expmask accesses Cc: syzbot+134336b86f728d6e55a0@syzkaller.appspotmail.com, "Paul E. McKenney" , Marco Elver , x86 , LKML In-Reply-To: References: MIME-Version: 1.0 Message-ID: <157994897918.396.6800818639959231688.tip-bot2@tip-bot2> X-Mailer: tip-git-log-daemon Robot-ID: Robot-Unsubscribe: Contact to get blacklisted from these emails Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Linutronix-Spam-Score: -1.0 X-Linutronix-Spam-Level: - X-Linutronix-Spam-Status: No , -1.0 points, 5.0 required, ALL_TRUSTED=-1,SHORTCIRCUIT=-0.0001 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The following commit has been merged into the core/rcu branch of tip: Commit-ID: 15c7c972cd26d89a26788e609c53b5a465324a6c Gitweb: https://git.kernel.org/tip/15c7c972cd26d89a26788e609c53b5a465324a6c Author: Paul E. McKenney AuthorDate: Mon, 07 Oct 2019 18:53:18 -07:00 Committer: Paul E. McKenney CommitterDate: Mon, 09 Dec 2019 12:24:56 -08:00 rcu: Use *_ONCE() to protect lockless ->expmask accesses The rcu_node structure's ->expmask field is accessed locklessly when starting a new expedited grace period and when reporting an expedited RCU CPU stall warning. This commit therefore handles the former by taking a snapshot of ->expmask while the lock is held and the latter by applying READ_ONCE() to lockless reads and WRITE_ONCE() to the corresponding updates. Link: https://lore.kernel.org/lkml/CANpmjNNmSOagbTpffHr4=Yedckx9Rm2NuGqC9UqE+AOz5f1-ZQ@mail.gmail.com Reported-by: syzbot+134336b86f728d6e55a0@syzkaller.appspotmail.com Signed-off-by: Paul E. McKenney Acked-by: Marco Elver --- kernel/rcu/tree_exp.h | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/kernel/rcu/tree_exp.h b/kernel/rcu/tree_exp.h index d632cd0..69c5aa6 100644 --- a/kernel/rcu/tree_exp.h +++ b/kernel/rcu/tree_exp.h @@ -134,7 +134,7 @@ static void __maybe_unused sync_exp_reset_tree(void) rcu_for_each_node_breadth_first(rnp) { raw_spin_lock_irqsave_rcu_node(rnp, flags); WARN_ON_ONCE(rnp->expmask); - rnp->expmask = rnp->expmaskinit; + WRITE_ONCE(rnp->expmask, rnp->expmaskinit); raw_spin_unlock_irqrestore_rcu_node(rnp, flags); } } @@ -211,7 +211,7 @@ static void __rcu_report_exp_rnp(struct rcu_node *rnp, rnp = rnp->parent; raw_spin_lock_rcu_node(rnp); /* irqs already disabled */ WARN_ON_ONCE(!(rnp->expmask & mask)); - rnp->expmask &= ~mask; + WRITE_ONCE(rnp->expmask, rnp->expmask & ~mask); } } @@ -241,7 +241,7 @@ static void rcu_report_exp_cpu_mult(struct rcu_node *rnp, raw_spin_unlock_irqrestore_rcu_node(rnp, flags); return; } - rnp->expmask &= ~mask; + WRITE_ONCE(rnp->expmask, rnp->expmask & ~mask); __rcu_report_exp_rnp(rnp, wake, flags); /* Releases rnp->lock. */ } @@ -372,12 +372,10 @@ static void sync_rcu_exp_select_node_cpus(struct work_struct *wp) raw_spin_unlock_irqrestore_rcu_node(rnp, flags); /* IPI the remaining CPUs for expedited quiescent state. */ - for_each_leaf_node_cpu_mask(rnp, cpu, rnp->expmask) { + for_each_leaf_node_cpu_mask(rnp, cpu, mask_ofl_ipi) { unsigned long mask = leaf_node_cpu_bit(rnp, cpu); struct rcu_data *rdp = per_cpu_ptr(&rcu_data, cpu); - if (!(mask_ofl_ipi & mask)) - continue; retry_ipi: if (rcu_dynticks_in_eqs_since(rdp, rdp->exp_dynticks_snap)) { mask_ofl_test |= mask; @@ -491,7 +489,7 @@ static void synchronize_sched_expedited_wait(void) struct rcu_data *rdp; mask = leaf_node_cpu_bit(rnp, cpu); - if (!(rnp->expmask & mask)) + if (!(READ_ONCE(rnp->expmask) & mask)) continue; ndetected++; rdp = per_cpu_ptr(&rcu_data, cpu); @@ -503,7 +501,8 @@ static void synchronize_sched_expedited_wait(void) } pr_cont(" } %lu jiffies s: %lu root: %#lx/%c\n", jiffies - jiffies_start, rcu_state.expedited_sequence, - rnp_root->expmask, ".T"[!!rnp_root->exp_tasks]); + READ_ONCE(rnp_root->expmask), + ".T"[!!rnp_root->exp_tasks]); if (ndetected) { pr_err("blocking rcu_node structures:"); rcu_for_each_node_breadth_first(rnp) { @@ -513,7 +512,7 @@ static void synchronize_sched_expedited_wait(void) continue; pr_cont(" l=%u:%d-%d:%#lx/%c", rnp->level, rnp->grplo, rnp->grphi, - rnp->expmask, + READ_ONCE(rnp->expmask), ".T"[!!rnp->exp_tasks]); } pr_cont("\n"); @@ -521,7 +520,7 @@ static void synchronize_sched_expedited_wait(void) rcu_for_each_leaf_node(rnp) { for_each_leaf_node_possible_cpu(rnp, cpu) { mask = leaf_node_cpu_bit(rnp, cpu); - if (!(rnp->expmask & mask)) + if (!(READ_ONCE(rnp->expmask) & mask)) continue; dump_cpu_task(cpu); }