From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753552AbbJFRgz (ORCPT ); Tue, 6 Oct 2015 13:36:55 -0400 Received: from e34.co.us.ibm.com ([32.97.110.152]:52680 "EHLO e34.co.us.ibm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753503AbbJFRgw (ORCPT ); Tue, 6 Oct 2015 13:36:52 -0400 X-IBM-Helo: d03dlp01.boulder.ibm.com X-IBM-MailFrom: paulmck@linux.vnet.ibm.com X-IBM-RcptTo: linux-kernel@vger.kernel.org Date: Tue, 6 Oct 2015 10:36:46 -0700 From: "Paul E. McKenney" To: Josh Triplett Cc: linux-kernel@vger.kernel.org, mingo@kernel.org, jiangshanlai@gmail.com, dipankar@in.ibm.com, akpm@linux-foundation.org, mathieu.desnoyers@efficios.com, tglx@linutronix.de, peterz@infradead.org, rostedt@goodmis.org, dhowells@redhat.com, edumazet@google.com, dvhart@linux.intel.com, fweisbec@gmail.com, oleg@redhat.com, bobby.prani@gmail.com Subject: Re: [PATCH tip/core/rcu 07/13] rcu: Move preemption disabling out of __srcu_read_lock() Message-ID: <20151006173646.GJ3910@linux.vnet.ibm.com> Reply-To: paulmck@linux.vnet.ibm.com References: <20151006161305.GA9799@linux.vnet.ibm.com> <1444148028-11551-1-git-send-email-paulmck@linux.vnet.ibm.com> <1444148028-11551-7-git-send-email-paulmck@linux.vnet.ibm.com> <20151006171839.GD9600@cloud> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20151006171839.GD9600@cloud> User-Agent: Mutt/1.5.21 (2010-09-15) X-TM-AS-MML: disable X-Content-Scanned: Fidelis XPS MAILER x-cbid: 15100617-0017-0000-0000-00000E6AFD03 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, Oct 06, 2015 at 10:18:39AM -0700, Josh Triplett wrote: > On Tue, Oct 06, 2015 at 09:13:42AM -0700, Paul E. McKenney wrote: > > Currently, __srcu_read_lock() cannot be invoked from restricted > > environments because it contains calls to preempt_disable() and > > preempt_enable(), both of which can invoke lockdep, which is a bad > > idea in some restricted execution modes. This commit therefore moves > > the preempt_disable() and preempt_enable() from __srcu_read_lock() > > to srcu_read_lock(). It also inserts the preempt_disable() and > > preempt_enable() around the call to __srcu_read_lock() in do_exit(). > > What restricted environments do you intend to invoke > __srcu_read_lock from? > > This change seems fine, but I don't see any change in this patch series > that needs this, hence my curiosity. Someone asked me for it, and now I cannot find it. :-( Something to the effect of when running unmapped during exception entry or something like that. I guess one way to find out would be to remove the commit and see who complained, but on the other hand, it arguably makes more sense to have only the bare mechanism is __srcu_read_lock() and put the environmental protection into srcu_read_lock(). Thanx, Paul > > Signed-off-by: Paul E. McKenney > > --- > > include/linux/srcu.h | 5 ++++- > > kernel/exit.c | 2 ++ > > kernel/rcu/srcu.c | 2 -- > > 3 files changed, 6 insertions(+), 3 deletions(-) > > > > diff --git a/include/linux/srcu.h b/include/linux/srcu.h > > index bdeb4567b71e..f5f80c5643ac 100644 > > --- a/include/linux/srcu.h > > +++ b/include/linux/srcu.h > > @@ -215,8 +215,11 @@ static inline int srcu_read_lock_held(struct srcu_struct *sp) > > */ > > static inline int srcu_read_lock(struct srcu_struct *sp) __acquires(sp) > > { > > - int retval = __srcu_read_lock(sp); > > + int retval; > > > > + preempt_disable(); > > + retval = __srcu_read_lock(sp); > > + preempt_enable(); > > rcu_lock_acquire(&(sp)->dep_map); > > return retval; > > } > > diff --git a/kernel/exit.c b/kernel/exit.c > > index ea95ee1b5ef7..0e93b63bbc59 100644 > > --- a/kernel/exit.c > > +++ b/kernel/exit.c > > @@ -761,7 +761,9 @@ void do_exit(long code) > > */ > > flush_ptrace_hw_breakpoint(tsk); > > > > + TASKS_RCU(preempt_disable()); > > TASKS_RCU(tasks_rcu_i = __srcu_read_lock(&tasks_rcu_exit_srcu)); > > + TASKS_RCU(preempt_enable()); > > exit_notify(tsk, group_dead); > > proc_exit_connector(tsk); > > #ifdef CONFIG_NUMA > > diff --git a/kernel/rcu/srcu.c b/kernel/rcu/srcu.c > > index 9e6122540d28..a63a1ea5a41b 100644 > > --- a/kernel/rcu/srcu.c > > +++ b/kernel/rcu/srcu.c > > @@ -298,11 +298,9 @@ int __srcu_read_lock(struct srcu_struct *sp) > > int idx; > > > > idx = READ_ONCE(sp->completed) & 0x1; > > - preempt_disable(); > > __this_cpu_inc(sp->per_cpu_ref->c[idx]); > > smp_mb(); /* B */ /* Avoid leaking the critical section. */ > > __this_cpu_inc(sp->per_cpu_ref->seq[idx]); > > - preempt_enable(); > > return idx; > > } > > EXPORT_SYMBOL_GPL(__srcu_read_lock); > > -- > > 2.5.2 > > >