|
@@ -74,6 +74,8 @@ void wakeme_after_rcu(struct rcu_head *head)
|
|
|
complete(&rcu->completion);
|
|
|
}
|
|
|
|
|
|
+#ifdef CONFIG_TREE_PREEMPT_RCU
|
|
|
+
|
|
|
/**
|
|
|
* synchronize_rcu - wait until a grace period has elapsed.
|
|
|
*
|
|
@@ -87,7 +89,7 @@ void synchronize_rcu(void)
|
|
|
{
|
|
|
struct rcu_synchronize rcu;
|
|
|
|
|
|
- if (rcu_blocking_is_gp())
|
|
|
+ if (!rcu_scheduler_active)
|
|
|
return;
|
|
|
|
|
|
init_completion(&rcu.completion);
|
|
@@ -98,6 +100,46 @@ void synchronize_rcu(void)
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(synchronize_rcu);
|
|
|
|
|
|
+#endif /* #ifdef CONFIG_TREE_PREEMPT_RCU */
|
|
|
+
|
|
|
+/**
|
|
|
+ * synchronize_sched - wait until an rcu-sched grace period has elapsed.
|
|
|
+ *
|
|
|
+ * Control will return to the caller some time after a full rcu-sched
|
|
|
+ * grace period has elapsed, in other words after all currently executing
|
|
|
+ * rcu-sched read-side critical sections have completed. These read-side
|
|
|
+ * critical sections are delimited by rcu_read_lock_sched() and
|
|
|
+ * rcu_read_unlock_sched(), and may be nested. Note that preempt_disable(),
|
|
|
+ * local_irq_disable(), and so on may be used in place of
|
|
|
+ * rcu_read_lock_sched().
|
|
|
+ *
|
|
|
+ * This means that all preempt_disable code sequences, including NMI and
|
|
|
+ * hardware-interrupt handlers, in progress on entry will have completed
|
|
|
+ * before this primitive returns. However, this does not guarantee that
|
|
|
+ * softirq handlers will have completed, since in some kernels, these
|
|
|
+ * handlers can run in process context, and can block.
|
|
|
+ *
|
|
|
+ * This primitive provides the guarantees made by the (now removed)
|
|
|
+ * synchronize_kernel() API. In contrast, synchronize_rcu() only
|
|
|
+ * guarantees that rcu_read_lock() sections will have completed.
|
|
|
+ * In "classic RCU", these two guarantees happen to be one and
|
|
|
+ * the same, but can differ in realtime RCU implementations.
|
|
|
+ */
|
|
|
+void synchronize_sched(void)
|
|
|
+{
|
|
|
+ struct rcu_synchronize rcu;
|
|
|
+
|
|
|
+ if (rcu_blocking_is_gp())
|
|
|
+ return;
|
|
|
+
|
|
|
+ init_completion(&rcu.completion);
|
|
|
+ /* Will wake me after RCU finished. */
|
|
|
+ call_rcu_sched(&rcu.head, wakeme_after_rcu);
|
|
|
+ /* Wait for it. */
|
|
|
+ wait_for_completion(&rcu.completion);
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(synchronize_sched);
|
|
|
+
|
|
|
/**
|
|
|
* synchronize_rcu_bh - wait until an rcu_bh grace period has elapsed.
|
|
|
*
|