hc
2024-11-01 2f529f9b558ca1c1bd74be7437a84e4711743404
kernel/include/linux/rcupdate.h
....@@ -118,6 +118,14 @@
118118 static inline void rcu_nocb_flush_deferred_wakeup(void) { }
119119 #endif /* #else #ifdef CONFIG_RCU_NOCB_CPU */
120120
121
+#ifdef CONFIG_IRQ_PIPELINE
122
+void rcu_oob_prepare_lock(void);
123
+void rcu_oob_finish_lock(void);
124
+#else
125
+#define rcu_oob_prepare_lock() do { } while (0)
126
+#define rcu_oob_finish_lock() do { } while (0)
127
+#endif
128
+
121129 /**
122130 * RCU_NONIDLE - Indicate idle-loop code that needs RCU readers
123131 * @a: Code that RCU needs to pay attention to.
....@@ -290,7 +298,7 @@
290298
291299 static inline int rcu_read_lock_sched_held(void)
292300 {
293
- return !preemptible();
301
+ return !running_inband() || !preemptible();
294302 }
295303
296304 static inline int rcu_read_lock_any_held(void)
....@@ -646,6 +654,7 @@
646654 */
647655 static __always_inline void rcu_read_lock(void)
648656 {
657
+ rcu_oob_prepare_lock();
649658 __rcu_read_lock();
650659 __acquire(RCU);
651660 rcu_lock_acquire(&rcu_lock_map);
....@@ -702,6 +711,7 @@
702711 "rcu_read_unlock() used illegally while idle");
703712 __release(RCU);
704713 __rcu_read_unlock();
714
+ rcu_oob_finish_lock();
705715 rcu_lock_release(&rcu_lock_map); /* Keep acq info for rls diags. */
706716 }
707717
....@@ -755,6 +765,7 @@
755765 static inline void rcu_read_lock_sched(void)
756766 {
757767 preempt_disable();
768
+ rcu_oob_prepare_lock();
758769 __acquire(RCU_SCHED);
759770 rcu_lock_acquire(&rcu_sched_lock_map);
760771 RCU_LOCKDEP_WARN(!rcu_is_watching(),
....@@ -779,6 +790,7 @@
779790 "rcu_read_unlock_sched() used illegally while idle");
780791 rcu_lock_release(&rcu_sched_lock_map);
781792 __release(RCU_SCHED);
793
+ rcu_oob_finish_lock();
782794 preempt_enable();
783795 }
784796