|
@@ -286,19 +286,26 @@ void synchronize_srcu(struct srcu_struct *sp)
|
|
EXPORT_SYMBOL_GPL(synchronize_srcu);
|
|
EXPORT_SYMBOL_GPL(synchronize_srcu);
|
|
|
|
|
|
/**
|
|
/**
|
|
- * synchronize_srcu_expedited - like synchronize_srcu, but less patient
|
|
|
|
|
|
+ * synchronize_srcu_expedited - Brute-force SRCU grace period
|
|
* @sp: srcu_struct with which to synchronize.
|
|
* @sp: srcu_struct with which to synchronize.
|
|
*
|
|
*
|
|
- * Flip the completed counter, and wait for the old count to drain to zero.
|
|
|
|
- * As with classic RCU, the updater must use some separate means of
|
|
|
|
- * synchronizing concurrent updates. Can block; must be called from
|
|
|
|
- * process context.
|
|
|
|
|
|
+ * Wait for an SRCU grace period to elapse, but use a "big hammer"
|
|
|
|
+ * approach to force the grace period to end quickly. This consumes
|
|
|
|
+ * significant time on all CPUs and is unfriendly to real-time workloads,
|
|
|
|
+ * so is thus not recommended for any sort of common-case code. In fact,
|
|
|
|
+ * if you are using synchronize_srcu_expedited() in a loop, please
|
|
|
|
+ * restructure your code to batch your updates, and then use a single
|
|
|
|
+ * synchronize_srcu() instead.
|
|
*
|
|
*
|
|
- * Note that it is illegal to call synchronize_srcu_expedited()
|
|
|
|
- * from the corresponding SRCU read-side critical section; doing so
|
|
|
|
- * will result in deadlock. However, it is perfectly legal to call
|
|
|
|
- * synchronize_srcu_expedited() on one srcu_struct from some other
|
|
|
|
- * srcu_struct's read-side critical section.
|
|
|
|
|
|
+ * Note that it is illegal to call this function while holding any lock
|
|
|
|
+ * that is acquired by a CPU-hotplug notifier. And yes, it is also illegal
|
|
|
|
+ * to call this function from a CPU-hotplug notifier. Failing to observe
|
|
|
|
+ * these restriction will result in deadlock. It is also illegal to call
|
|
|
|
+ * synchronize_srcu_expedited() from the corresponding SRCU read-side
|
|
|
|
+ * critical section; doing so will result in deadlock. However, it is
|
|
|
|
+ * perfectly legal to call synchronize_srcu_expedited() on one srcu_struct
|
|
|
|
+ * from some other srcu_struct's read-side critical section, as long as
|
|
|
|
+ * the resulting graph of srcu_structs is acyclic.
|
|
*/
|
|
*/
|
|
void synchronize_srcu_expedited(struct srcu_struct *sp)
|
|
void synchronize_srcu_expedited(struct srcu_struct *sp)
|
|
{
|
|
{
|