On 09/04, Frederic Weisbecker wrote: > > So what happens if, say: > > > CPU 1 CPU 2 > -------------------------------------------------------------- > rcu_read_lock() > p = rcu_dereference(rq->task) > if (refcount_inc_not_zero(p->rcu_users)) { > ..... > release_task() { > put_task_struct_rcu_user() { > call_rcu() { > queue rcu_head
in this particular case call_rcu() won't be called, so > } > } > } > put_task_struct_rcu_user(); //here rcu_users has been overwritten rcu_users won't be overwritten. But nobody should try to increment ->rcu_users, rcu_read_lock(); p = rcu_dereference(rq->task); refcount_inc_not_zero(p->rcu_users); is already wrong because both release_task/last-schedule can happen in between, before refcount_inc_not_zero(). Oleg.