[lttng-dev] [RFC PATCH urcu] Implement rcu_barrier()

Mathieu Desnoyers mathieu.desnoyers at efficios.com
Wed Jun 5 09:32:10 EDT 2013


* Paul E. McKenney (paulmck at linux.vnet.ibm.com) wrote:
> On Fri, May 31, 2013 at 11:35:17AM -0400, Mathieu Desnoyers wrote:
[...]
> > +
> > +	if (work_count != count)
> > +		uatomic_sub(&completion.barrier_count, count - work_count);
> 
> If we have a subset, we could do the rcu_barrier() one piece at a time.
> Another approach would be to pre-allocate the call_rcu_completion_work
> structure within the call_rcu_data structure.  I strongly recommend the
> latter -- though this will of course result in serializing concurrent
> rcu_barrier() invocations.

The issue I see with these approaches is that they require holding the
call_rcu_mutex while waiting for completion. If a call_rcu thread ever
needs to take the call_rcu_mutex (possibly caused by use of call_rcu in
a call_rcu handler), this call_rcu thread could deadlock against the
barrier.

Doing rcu_barrier() piecewise requires holding the call_rcu_mutex
against traversal of call_rcu_data_list, and preallocation of
call_rcu_completion_work within call_rcu_data requires the
call_rcu_mutex to protect against call_rcu_data teardown.

By the way, we already have, in call_rcu_data_init():

        crdp = malloc(sizeof(*crdp));
        if (crdp == NULL)
                urcu_die(errno);

So one possibility would be to make rcu_barrier() kill the process if
out of memory (although I'd hate to have to do this).

Any suggestions ?

Thanks,

Mathieu

-- 
Mathieu Desnoyers
EfficiOS Inc.
http://www.efficios.com



More information about the lttng-dev mailing list