Hello, On Wed, 1 May 2013, Peter Zijlstra wrote: > On Wed, May 01, 2013 at 05:22:05PM +0300, Julian Anastasov wrote: > > > 2. Same without need_resched because cond_resched already > > performs the same checks: > > > > static void inline cond_resched_rcu_lock(void) > > { > > #ifndef CONFIG_PREEMPT_RCU > > rcu_read_unlock(); > > cond_resched(); > > rcu_read_lock(); > > #endif > > } > > Ah so the 'problem' with this last version is that it does an unconditional / > unnessecary rcu_read_unlock(). It is just a barrier() for the non-preempt case. > The below would be in line with all the other cond_resched*() implementations. ... > diff --git a/include/linux/sched.h b/include/linux/sched.h > index 802a751..fd2c77f 100644 > --- a/include/linux/sched.h > +++ b/include/linux/sched.h > @@ -2449,6 +2449,13 @@ extern int __cond_resched_softirq(void); > __cond_resched_softirq(); \ > }) > > +extern int __cond_resched_rcu(void); > + > +#define cond_resched_rcu() ({ \ > + __might_sleep(__FILE__, __LINE__, 0); \ I see your goal. But digging into __might_sleep() I see that rcu_sleep_check() will scream for the non-preempt case because we are under rcu_read_lock. What about such inline version: static void inline cond_resched_rcu(void) { #ifndef CONFIG_PREEMPT_RCU rcu_read_unlock(); __might_sleep(__FILE__, __LINE__, 0); cond_resched(); rcu_read_lock(); #else __might_sleep(__FILE__, __LINE__, 0); rcu_lockdep_assert(rcu_preempt_depth() == 1, "Illegal cond_resched_rcu() context"); #endif } It will restrict to single RCU lock level for all RCU implementations. But we don't have _cond_resched_rcu helper for two reasons: - __might_sleep uses __FILE__, __LINE__ - only cond_resched generates code, so need_resched() is avoided > + __cond_resched_rcu(); \ > +}) > + > /* > * Does a critical section need to be broken due to another > * task waiting?: (technically does not depend on CONFIG_PREEMPT, > diff --git a/kernel/sched/core.c b/kernel/sched/core.c > index 7d7901a..2b3b4e6 100644 > --- a/kernel/sched/core.c > +++ b/kernel/sched/core.c > @@ -4358,6 +4358,20 @@ int __sched __cond_resched_softirq(void) > } > EXPORT_SYMBOL(__cond_resched_softirq); > > +int __sched __cond_resched_rcu(void) > +{ > +#ifndef CONFIG_PREEMPT_RCU > + if (should_resched()) { > + rcu_read_unlock(); > + __cond_resched(); > + rcu_read_lock(); > + return 1; > + } > +#endif > + return 0; > +} > +EXPORT_SYMBOL(__cond_resched_rcu); > + Regards -- Julian Anastasov <ja@xxxxxx> -- To unsubscribe from this list: send the line "unsubscribe lvs-devel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html