|
@@ -932,6 +932,24 @@ static void __init __rcu_init_preempt(void)
|
|
|
rcu_init_one(&rcu_preempt_state, &rcu_preempt_data);
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * 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_TREE_PREEMPT_RCU */
|
|
|
|
|
|
static struct rcu_state *rcu_state = &rcu_sched_state;
|
|
@@ -1100,6 +1118,14 @@ static void __init __rcu_init_preempt(void)
|
|
|
{
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * Because preemptible RCU does not exist, tasks cannot possibly exit
|
|
|
+ * while in preemptible RCU read-side critical sections.
|
|
|
+ */
|
|
|
+void exit_rcu(void)
|
|
|
+{
|
|
|
+}
|
|
|
+
|
|
|
#endif /* #else #ifdef CONFIG_TREE_PREEMPT_RCU */
|
|
|
|
|
|
#ifdef CONFIG_RCU_BOOST
|