* Paolo Bonzini ([email protected]) wrote: > On 06/06/2011 07:46 PM, Mathieu Desnoyers wrote: >> +static void call_rcu_wait(struct call_rcu_data *crdp) >> +{ >> + /* Read call_rcu list before read futex */ >> + cmm_smp_mb(); >> + if (uatomic_read(&crdp->futex) == -1) >> + futex_async(&crdp->futex, FUTEX_WAIT, -1, >> + NULL, NULL, 0); >> +} >> + >> +static void call_rcu_wake_up(struct call_rcu_data *crdp) >> +{ >> + /* Write to call_rcu list before reading/writing futex */ >> + cmm_smp_mb(); >> + if (unlikely(uatomic_read(&crdp->futex) == -1)) { >> + uatomic_set(&crdp->futex, 0); >> + futex_async(&crdp->futex, FUTEX_WAKE, 1, >> + NULL, NULL, 0); >> + } >> +} > > I don't see crdp->futex ever set to -1, am I missing something obvious?
Good catch! I missed those parts from the urcu.c wait/wakeup scheme (decrement initially, and also set to 0 explicitely when breaking the loop without waiting). I just added them with commit c768e45ed336970a42e58e679804f0f455422cd8 Thanks! Mathieu > > Paolo > > > _______________________________________________ > ltt-dev mailing list > [email protected] > http://lists.casi.polymtl.ca/cgi-bin/mailman/listinfo/ltt-dev > -- Mathieu Desnoyers Operating System Efficiency R&D Consultant EfficiOS Inc. http://www.efficios.com _______________________________________________ ltt-dev mailing list [email protected] http://lists.casi.polymtl.ca/cgi-bin/mailman/listinfo/ltt-dev
