|
@@ -51,6 +51,34 @@
|
|
|
|
|
|
#include "rcu.h"
|
|
#include "rcu.h"
|
|
|
|
|
|
|
|
+#ifdef CONFIG_PREEMPT_RCU
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * Check for a task exiting while in a preemptible-RCU read-side
|
|
|
|
+ * critical section, clean up if so. No need to issue warnings,
|
|
|
|
+ * as debug_check_no_locks_held() already does this if lockdep
|
|
|
|
+ * is enabled.
|
|
|
|
+ */
|
|
|
|
+void exit_rcu(void)
|
|
|
|
+{
|
|
|
|
+ struct task_struct *t = current;
|
|
|
|
+
|
|
|
|
+ if (likely(list_empty(¤t->rcu_node_entry)))
|
|
|
|
+ return;
|
|
|
|
+ t->rcu_read_lock_nesting = 1;
|
|
|
|
+ barrier();
|
|
|
|
+ t->rcu_read_unlock_special = RCU_READ_UNLOCK_BLOCKED;
|
|
|
|
+ __rcu_read_unlock();
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+#else /* #ifdef CONFIG_PREEMPT_RCU */
|
|
|
|
+
|
|
|
|
+void exit_rcu(void)
|
|
|
|
+{
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+#endif /* #else #ifdef CONFIG_PREEMPT_RCU */
|
|
|
|
+
|
|
#ifdef CONFIG_DEBUG_LOCK_ALLOC
|
|
#ifdef CONFIG_DEBUG_LOCK_ALLOC
|
|
static struct lock_class_key rcu_lock_key;
|
|
static struct lock_class_key rcu_lock_key;
|
|
struct lockdep_map rcu_lock_map =
|
|
struct lockdep_map rcu_lock_map =
|