]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
Merge remote-tracking branch 'rcu/rcu/next'
authorStephen Rothwell <sfr@canb.auug.org.au>
Tue, 20 Sep 2011 04:51:45 +0000 (14:51 +1000)
committerStephen Rothwell <sfr@canb.auug.org.au>
Tue, 20 Sep 2011 04:51:45 +0000 (14:51 +1000)
12 files changed:
1  2 
arch/powerpc/platforms/pseries/lpar.c
include/linux/rcupdate.h
include/linux/sched.h
init/Kconfig
kernel/lockdep.c
kernel/pid.c
kernel/rcupdate.c
kernel/rcutorture.c
kernel/rcutree_trace.c
kernel/rtmutex.c
kernel/sched.c
kernel/time/tick-sched.c

Simple merge
index 8f4f881a0ad8153dd82150745aee03881448a3b0,9d40e425d46c8206019d57566bcb49c7b2406d97..ea9bc708ccef2a6e5448c52cb372a56f4f7160f2
@@@ -238,8 -313,18 +313,18 @@@ extern int rcu_read_lock_bh_held(void)
   *
   * Check debug_lockdep_rcu_enabled() to prevent false positives during boot
   * and while lockdep is disabled.
+  *
+  * Note that if the CPU is in an extended quiescent state, for example,
+  * if the CPU is in dyntick-idle mode, then rcu_read_lock_held() returns
+  * false even if the CPU did an rcu_read_lock().  The reason for this is
+  * that RCU ignores CPUs that are in extended quiescent states, so such
+  * a CPU is effectively never in an RCU read-side critical section
+  * regardless of what RCU primitives it invokes.  This state of affairs
+  * is required -- RCU would otherwise need to periodically wake up
+  * dyntick-idle CPUs, which would defeat the whole purpose of dyntick-idle
+  * mode.
   */
 -#ifdef CONFIG_PREEMPT
 +#ifdef CONFIG_PREEMPT_COUNT
  static inline int rcu_read_lock_sched_held(void)
  {
        int lockdep_opinion = 0;
Simple merge
diff --cc init/Kconfig
Simple merge
Simple merge
diff --cc kernel/pid.c
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
diff --cc kernel/sched.c
index 5895135f0f6fa0dc2559ca8a6075598615f35d2f,313c0f63e29a9b36b47b11e7f284f8482fd3580f..941360f57b1bd25f865a8c993891d110d0f02da3
@@@ -8374,8 -8185,10 +8364,9 @@@ static inline int preempt_count_equals(
  
  void __might_sleep(const char *file, int line, int preempt_offset)
  {
 -#ifdef in_atomic
        static unsigned long prev_jiffy;        /* ratelimiting */
  
+       rcu_sleep_check(); /* WARN_ON_ONCE() by default, no rate limit reqd. */
        if ((preempt_count_equals(preempt_offset) && !irqs_disabled()) ||
            system_state != SYSTEM_RUNNING || oops_in_progress)
                return;
Simple merge