Received: by 2002:a25:6193:0:0:0:0:0 with SMTP id v141csp31957ybb; Fri, 27 Mar 2020 15:26:55 -0700 (PDT) X-Google-Smtp-Source: ADFU+vtIp5BXTnYf+SG26314wE8Kvvce2lTUDvgUbC9mhnF8+gAkun20ZpaPvMx3jA6TV3PXXlMc X-Received: by 2002:aca:f582:: with SMTP id t124mr852993oih.17.1585348014875; Fri, 27 Mar 2020 15:26:54 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1585348014; cv=none; d=google.com; s=arc-20160816; b=EdFaGIUZ3hK3RU86E9XiExiL5qVEXTp7RE1rix3HrTNWX+AXtjNg861lXy/fYdeUgs 5wm+lLiilitefthm80UrUA4E1RsM2nQ2gRsw/y40tEhsYHMbzXL8axG6mf2z6JDpzinD SYdSpx45Jcukgy2CoOzZSnIdFuKKrg/Lrcuzk5aUfTEAcaiz4YofbyQ5LjUjUffFYj3m WbNymS9qxlsGRAXTeOZH1U9YXJKtBHP7kk1n0h6dsj59ybCuECSFy7RFqtAVusUxDu1c ypM5ERo0xBEUTl/FZDo3IjU3nO4vDdogZBkenQ+gE9OvXuX4FjFGEWyHEMWtVDKm16yZ xOJg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature; bh=JdUSVjlvZNe5ofG7PkcCL/pj0OI7kio2t6tdetS3Gy0=; b=bc3ShK6Z9tkOAeD63qwvLa2kx182+dGAspOMzYOwBi8hGnd+ECvOgaNZkOim/gIqFF gkExs8h5ooF9l070dlO5w1HP0q6+/LJmfyux25lP1tkn9BQ8FM0leZ8GO4eEFiqB8Ivh +9DvjBz6QnsRG7xZJNU8A23tCnz1HVUS71H82lSWpKXnDKTvDgo1dHn4ikOAVm4vyMdF Sz+6uO9xJUnqK35dND71vqhl4AQaIk3kSNrLnUlsQzIpojvsMkou64OXB4QPGLirR05u cFhcuxDgx2lwIY/ihK/SpO5fXWaRjQo2MDQapQ2prJ0mPTyc7idBaN3/HBKycRMr7xER FXpw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=1s6LEN+O; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id v81si2894719oia.114.2020.03.27.15.26.42; Fri, 27 Mar 2020 15:26:54 -0700 (PDT) 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; dkim=pass header.i=@kernel.org header.s=default header.b=1s6LEN+O; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728117AbgC0WZ7 (ORCPT + 99 others); Fri, 27 Mar 2020 18:25:59 -0400 Received: from mail.kernel.org ([198.145.29.99]:43370 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727866AbgC0WZI (ORCPT ); Fri, 27 Mar 2020 18:25:08 -0400 Received: from paulmck-ThinkPad-P72.home (50-39-105-78.bvtn.or.frontiernet.net [50.39.105.78]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 57C33217D8; Fri, 27 Mar 2020 22:25:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1585347907; bh=nTy6FurwjMOt+wtEU20iWyrcDsMmmfs5wl7gzXUqPPE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=1s6LEN+O1BnIE0kUU7dLVNoXAMENP8KdBVM8jQKLfSk3LkgQz3HPIiSqh+nhUQoJN Q1Bt0xG/OQsnfZSddbP6OjYySTXkS8D/KSDjXg7jeUix2sMAtutMXIJXDIB/bAVX7F YXRaNbg+hj1cp8V8FYaHfQxHOHRAUq2FOp1l58ok= From: paulmck@kernel.org To: rcu@vger.kernel.org Cc: linux-kernel@vger.kernel.org, kernel-team@fb.com, mingo@kernel.org, jiangshanlai@gmail.com, dipankar@in.ibm.com, akpm@linux-foundation.org, mathieu.desnoyers@efficios.com, josh@joshtriplett.org, tglx@linutronix.de, peterz@infradead.org, rostedt@goodmis.org, dhowells@redhat.com, edumazet@google.com, fweisbec@gmail.com, oleg@redhat.com, joel@joelfernandes.org, "Paul E. McKenney" Subject: [PATCH v3 tip/core/rcu 27/34] rcu-tasks: Allow rcu_read_unlock_trace() under scheduler locks Date: Fri, 27 Mar 2020 15:24:49 -0700 Message-Id: <20200327222456.12470-27-paulmck@kernel.org> X-Mailer: git-send-email 2.9.5 In-Reply-To: <20200327222346.GA12082@paulmck-ThinkPad-P72> References: <20200327222346.GA12082@paulmck-ThinkPad-P72> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: "Paul E. McKenney" The rcu_read_unlock_trace() can invoke rcu_read_unlock_trace_special(), which in turn can call wake_up(). Therefore, if any scheduler lock is held across a call to rcu_read_unlock_trace(), self-deadlock can occur. This commit therefore uses the irq_work facility to defer the wake_up() to a clean environment where no scheduler locks will be held. Reported-by: Steven Rostedt [ paulmck: Update #includes for m68k per kbuild test robot. ] Signed-off-by: Paul E. McKenney --- kernel/rcu/tasks.h | 12 +++++++++++- kernel/rcu/update.c | 1 + 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/kernel/rcu/tasks.h b/kernel/rcu/tasks.h index a7ecde9..2663167e 100644 --- a/kernel/rcu/tasks.h +++ b/kernel/rcu/tasks.h @@ -729,6 +729,16 @@ void call_rcu_tasks_trace(struct rcu_head *rhp, rcu_callback_t func); DEFINE_RCU_TASKS(rcu_tasks_trace, rcu_tasks_wait_gp, call_rcu_tasks_trace, "RCU Tasks Trace"); +/* + * This irq_work handler allows rcu_read_unlock_trace() to be invoked + * while the scheduler locks are held. + */ +static void rcu_read_unlock_iw(struct irq_work *iwp) +{ + wake_up(&trc_wait); +} +static DEFINE_IRQ_WORK(rcu_tasks_trace_iw, rcu_read_unlock_iw); + /* If we are the last reader, wake up the grace-period kthread. */ void rcu_read_unlock_trace_special(struct task_struct *t, int nesting) { @@ -742,7 +752,7 @@ void rcu_read_unlock_trace_special(struct task_struct *t, int nesting) WRITE_ONCE(t->trc_reader_special.b.need_qs, false); WRITE_ONCE(t->trc_reader_nesting, nesting); if (nq && atomic_dec_and_test(&trc_n_readers_need_end)) - wake_up(&trc_wait); + irq_work_queue(&rcu_tasks_trace_iw); } EXPORT_SYMBOL_GPL(rcu_read_unlock_trace_special); diff --git a/kernel/rcu/update.c b/kernel/rcu/update.c index 0fb2a9e..40e3512 100644 --- a/kernel/rcu/update.c +++ b/kernel/rcu/update.c @@ -41,6 +41,7 @@ #include #include #include +#include #define CREATE_TRACE_POINTS -- 2.9.5