Hello, On Thu, 2 May 2013, Peter Zijlstra wrote: > On Wed, May 01, 2013 at 09:22:08PM +0300, Julian Anastasov wrote: > > > +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. > > > #ifdef CONFIG_PREEMPT_RCU > #define PREEMPT_RCU_OFFSET 0 > #else > #define PREEMPT_RCU_OFFSET 1 > #endif > > #define cond_resched_rcu() ({ \ > __might_sleep(__FILE__, __LINE__, PREEMPT_RCU_OFFSET); \ > __cond_resched_rcu(); \ > }) > > Should work I think.. Looks like CONFIG_DEBUG_ATOMIC_SLEEP selects CONFIG_PREEMPT_COUNT, so PREEMPT_RCU_OFFSET should be 1 in all cases because preempt_disable() adds 1, while for CONFIG_PREEMPT_RCU case rcu_preempt_depth() should return 1: #ifdef CONFIG_PREEMPT_RCU #define PREEMPT_RCU_OFFSET 1 #else #define PREEMPT_RCU_OFFSET PREEMPT_CHECK_OFFSET #endif Now the remaining part is to fix rcu_sleep_check() for the non-preempt case. As there are no nesting depths in this case, I don't see a solution so far. We can provide some argument to rcu_preempt_sleep_check to compare depth with preempt_count() but currently I don't know how to differentiate cond_resched_lock() from cond_resched_rcu() when calling __might_sleep, in both cases we provide PREEMPT_OFFSET. May be some trick is needed here without adding new arg to __might_sleep, so that we can properly check for rcu_lock_map. Regards -- Julian Anastasov <ja@xxxxxx> -- To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html