----- On Jul 11, 2018, at 11:17 AM, Peter Zijlstra peterz@infradead.org wrote:
On Wed, Jul 11, 2018 at 09:06:49AM -0400, Steven Rostedt wrote:
On Wed, 11 Jul 2018 14:56:47 +0200 Peter Zijlstra peterz@infradead.org wrote:
On Thu, Jun 28, 2018 at 11:21:46AM -0700, Joel Fernandes wrote:
static inline void tracepoint_synchronize_unregister(void) {
- synchronize_srcu(&tracepoint_srcu); synchronize_sched();
}
Given you below do call_rcu_sched() and then call_srcu(), isn't the above the wrong way around?
Good catch!
release_probes() call_rcu_sched() ---> rcu_free_old_probes() queued
tracepoint_synchronize_unregister() synchronize_srcu(&tracepoint_srcu); < finishes right away > synchronize_sched() --> rcu_free_old_probes() --> srcu_free_old_probes() queued Here tracepoint_synchronize_unregister() returned before the srcu portion ran.
I just read the comment that goes with that function; the order doesn't matter. All we want to ensure is that the unregistration is visible to either sched or srcu tracepoint users.
Exactly, the order does not matter here.
Thanks,
Mathieu