From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1759123AbYEEOsS (ORCPT ); Mon, 5 May 2008 10:48:18 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1756223AbYEEOsH (ORCPT ); Mon, 5 May 2008 10:48:07 -0400 Received: from e31.co.us.ibm.com ([32.97.110.149]:40506 "EHLO e31.co.us.ibm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755700AbYEEOsE (ORCPT ); Mon, 5 May 2008 10:48:04 -0400 Date: Mon, 5 May 2008 07:47:51 -0700 From: "Paul E. McKenney" To: Gautham R Shenoy Cc: linux-kernel@vger.kernel.org, mathieu.desnoyers@polymtl.ca, mingo@elte.hu, akpm@linux-foundation.org, hch@infradead.org, mmlnx@us.ibm.com, dipankar@in.ibm.com, dsmith@redhat.com, rostedt@goodmis.org, adrian.bunk@movial.fi, a.p.zijlstra@chello.nl, niv@us.ibm.com, dvhltc@us.ibm.com, rusty@au1.ibm.com, jkenisto@linux.vnet.ibm.com, oleg@tv-sign.ru, jamesclhuang@yahoo.com Subject: Re: [PATCH 3/5] Add rcu_barrier_sched() and rcu_barrier_bh() Message-ID: <20080505144751.GF14809@linux.vnet.ibm.com> Reply-To: paulmck@linux.vnet.ibm.com References: <20080422004454.GA3517@linux.vnet.ibm.com> <20080422004743.GC3693@linux.vnet.ibm.com> <20080505092240.GB8371@in.ibm.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20080505092240.GB8371@in.ibm.com> User-Agent: Mutt/1.5.13 (2006-08-11) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, May 05, 2008 at 02:52:40PM +0530, Gautham R Shenoy wrote: > On Mon, Apr 21, 2008 at 05:47:43PM -0700, Paul E. McKenney wrote: > > Add rcu_barrier_sched() and rcu_barrier_bh(). With these in place, > > rcutorture no longer gives the occasional oops when repeatedly starting > > and stopping torturing rcu_bh. Also adds the API needed to flush out > > pre-existing call_rcu_sched() callbacks. Thank you again for looking it over! > > Signed-off-by: Paul E. McKenney > > Signed-off-by: Mathieu Desnoyers > > --- > > > > include/linux/rcupdate.h | 2 + > > kernel/rcupdate.c | 55 +++++++++++++++++++++++++++++++++++++++++------ > > 2 files changed, 51 insertions(+), 6 deletions(-) > > > > diff -urpNa -X dontdiff linux-2.6.25-C2-rcuclassic-fixes/include/linux/rcupdate.h linux-2.6.25-C3-rcu_barrier_sched/include/linux/rcupdate.h > > --- linux-2.6.25-C2-rcuclassic-fixes/include/linux/rcupdate.h 2008-04-17 08:10:33.000000000 -0700 > > +++ linux-2.6.25-C3-rcu_barrier_sched/include/linux/rcupdate.h 2008-04-21 11:33:07.000000000 -0700 > > @@ -260,6 +260,8 @@ extern void call_rcu_bh(struct rcu_head > > /* Exported common interfaces */ > > extern void synchronize_rcu(void); > > extern void rcu_barrier(void); > > +extern void rcu_barrier_bh(void); > > +extern void rcu_barrier_sched(void); > > extern long rcu_batches_completed(void); > > extern long rcu_batches_completed_bh(void); > > > > diff -urpNa -X dontdiff linux-2.6.25-C2-rcuclassic-fixes/kernel/rcupdate.c linux-2.6.25-C3-rcu_barrier_sched/kernel/rcupdate.c > > --- linux-2.6.25-C2-rcuclassic-fixes/kernel/rcupdate.c 2008-04-17 08:10:33.000000000 -0700 > > +++ linux-2.6.25-C3-rcu_barrier_sched/kernel/rcupdate.c 2008-04-21 11:33:08.000000000 -0700 > > @@ -45,6 +45,12 @@ > > #include > > #include > > > > +enum rcu_barrier { > > + RCU_BARRIER_STD, > STD: Standard, I take it ? Yep. Could say just "RCU_BARRIER", or perhaps "RCU_BARRIER_CLASSIC". Or comment each with the primitive they go with, perhaps better. > > + RCU_BARRIER_BH, > > + RCU_BARRIER_SCHED, > > +}; > > + > > static DEFINE_PER_CPU(struct rcu_head, rcu_barrier_head) = {NULL}; > > static atomic_t rcu_barrier_cpu_count; > > static DEFINE_MUTEX(rcu_barrier_mutex); > > @@ -83,19 +89,30 @@ static void rcu_barrier_callback(struct > > /* > > * Called with preemption disabled, and from cross-cpu IRQ context. > > */ > > -static void rcu_barrier_func(void *notused) > > +static void rcu_barrier_func(void *type) > > { > > int cpu = smp_processor_id(); > > struct rcu_head *head = &per_cpu(rcu_barrier_head, cpu); > > > > atomic_inc(&rcu_barrier_cpu_count); > > - call_rcu(head, rcu_barrier_callback); > > + switch ((enum rcu_barrier)type) { > > + case RCU_BARRIER_STD: > > + call_rcu(head, rcu_barrier_callback); > > + break; > > + case RCU_BARRIER_BH: > > + call_rcu_bh(head, rcu_barrier_callback); > > + break; > > + case RCU_BARRIER_SCHED: > > + call_rcu_sched(head, rcu_barrier_callback); > > + break; > > + } > > } > > > > -/** > > - * rcu_barrier - Wait until all the in-flight RCUs are complete. > > +/* > > + * Orchestrate the specified type of RCU barrier, waiting for all > > + * RCU callbacks of the specified type to complete. > > */ > > -void rcu_barrier(void) > > +static void _rcu_barrier(enum rcu_barrier type) > > { > > BUG_ON(in_interrupt()); > > /* Take cpucontrol mutex to protect against CPU hotplug */ > > @@ -111,13 +128,39 @@ void rcu_barrier(void) > > * until all the callbacks are queued. > > */ > > rcu_read_lock(); > > - on_each_cpu(rcu_barrier_func, NULL, 0, 1); > > + on_each_cpu(rcu_barrier_func, (void *)type, 0, 1); > > rcu_read_unlock(); > > wait_for_completion(&rcu_barrier_completion); > > mutex_unlock(&rcu_barrier_mutex); > > } > > + > > +/** > > + * rcu_barrier - Wait until all in-flight call_rcu() callbacks complete. > > + */ > > +void rcu_barrier(void) > > +{ > > + _rcu_barrier(RCU_BARRIER_STD); > > +} > > EXPORT_SYMBOL_GPL(rcu_barrier); > > > > +/** > > + * rcu_barrier_bh - Wait until all in-flight call_rcu_bh() callbacks complete. > > + */ > > +void rcu_barrier_bh(void) > > +{ > > + _rcu_barrier(RCU_BARRIER_BH); > > +} > > +EXPORT_SYMBOL_GPL(rcu_barrier_bh); > > + > > +/** > > + * rcu_barrier_sched - Wait for in-flight call_rcu_sched() callbacks. > > + */ > > +void rcu_barrier_sched(void) > > +{ > > + _rcu_barrier(RCU_BARRIER_SCHED); > > +} > > +EXPORT_SYMBOL_GPL(rcu_barrier_sched); > > + > > void __init rcu_init(void) > > { > > __rcu_init(); > > -- > Thanks and Regards > gautham