|
@@ -671,6 +671,9 @@ int marker_probe_register(const char *name, const char *format,
|
|
|
entry->rcu_pending = 1;
|
|
|
/* write rcu_pending before calling the RCU callback */
|
|
|
smp_wmb();
|
|
|
+#ifdef CONFIG_PREEMPT_RCU
|
|
|
+ synchronize_sched(); /* Until we have the call_rcu_sched() */
|
|
|
+#endif
|
|
|
call_rcu(&entry->rcu, free_old_closure);
|
|
|
end:
|
|
|
mutex_unlock(&markers_mutex);
|
|
@@ -714,6 +717,9 @@ int marker_probe_unregister(const char *name,
|
|
|
entry->rcu_pending = 1;
|
|
|
/* write rcu_pending before calling the RCU callback */
|
|
|
smp_wmb();
|
|
|
+#ifdef CONFIG_PREEMPT_RCU
|
|
|
+ synchronize_sched(); /* Until we have the call_rcu_sched() */
|
|
|
+#endif
|
|
|
call_rcu(&entry->rcu, free_old_closure);
|
|
|
remove_marker(name); /* Ignore busy error message */
|
|
|
ret = 0;
|
|
@@ -792,6 +798,9 @@ int marker_probe_unregister_private_data(marker_probe_func *probe,
|
|
|
entry->rcu_pending = 1;
|
|
|
/* write rcu_pending before calling the RCU callback */
|
|
|
smp_wmb();
|
|
|
+#ifdef CONFIG_PREEMPT_RCU
|
|
|
+ synchronize_sched(); /* Until we have the call_rcu_sched() */
|
|
|
+#endif
|
|
|
call_rcu(&entry->rcu, free_old_closure);
|
|
|
remove_marker(entry->name); /* Ignore busy error message */
|
|
|
end:
|