From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752538AbdIVP2X (ORCPT ); Fri, 22 Sep 2017 11:28:23 -0400 Received: from Galois.linutronix.de ([146.0.238.70]:39766 "EHLO Galois.linutronix.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752168AbdIVP2W (ORCPT ); Fri, 22 Sep 2017 11:28:22 -0400 From: Sebastian Andrzej Siewior To: "Paul E. McKenney" Cc: Josh Triplett , Steven Rostedt , Mathieu Desnoyers , Lai Jiangshan , linux-kernel@vger.kernel.org, Sebastian Andrzej Siewior Subject: [PATCH 2/3] srcu: queue work without holding the lock Date: Fri, 22 Sep 2017 17:28:05 +0200 Message-Id: <20170922152806.22860-2-bigeasy@linutronix.de> X-Mailer: git-send-email 2.14.1 In-Reply-To: <20170922152806.22860-1-bigeasy@linutronix.de> References: <20170922152806.22860-1-bigeasy@linutronix.de> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On RT we can't invoke queue_delayed_work() within an atomic section (which is provided by raw_spin_lock_irqsave()). srcu_reschedule() invokes queue_delayed_work() outside of the raw_spin_lock_irq_rcu_node() section so this should be fine here, too. If the remaining callers of call_srcu() aren't atomic (spin_lock_irqsave() is fine) then this should work on RT, too. Signed-off-by: Sebastian Andrzej Siewior --- kernel/rcu/srcutree.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/kernel/rcu/srcutree.c b/kernel/rcu/srcutree.c index d190af0e56f8..3ee4ef40f23e 100644 --- a/kernel/rcu/srcutree.c +++ b/kernel/rcu/srcutree.c @@ -648,12 +648,17 @@ static void srcu_funnel_gp_start(struct srcu_struct *= sp, struct srcu_data *sdp, /* If grace period not already done and none in progress, start it. */ if (!rcu_seq_done(&sp->srcu_gp_seq, s) && rcu_seq_state(sp->srcu_gp_seq) =3D=3D SRCU_STATE_IDLE) { + unsigned long delay; + WARN_ON_ONCE(ULONG_CMP_GE(sp->srcu_gp_seq, sp->srcu_gp_seq_needed)); srcu_gp_start(sp); + delay =3D srcu_get_delay(sp); + raw_spin_unlock_irqrestore_rcu_node(sp, flags); + queue_delayed_work(system_power_efficient_wq, &sp->work, - srcu_get_delay(sp)); - } - raw_spin_unlock_irqrestore_rcu_node(sp, flags); + delay); + } else + raw_spin_unlock_irqrestore_rcu_node(sp, flags); } =20 /* --=20 2.14.1