[ltt-dev] [PATCH] urcu-qsbr: avoid useless futex wakeups and burning CPU for long grace periods

Paolo Bonzini pbonzini at redhat.com
Mon Aug 15 04:41:25 EDT 2011

>>> @@ -136,7 +137,11 @@ extern int32_t gp_futex;
>>> */
>>> static inline void wake_up_gp(void)
>>> {
>>> - if (unlikely(uatomic_read(&gp_futex) == -1)) {
>>> + if (unlikely(_CMM_LOAD_SHARED(rcu_reader.waiting))) {
>>> + _CMM_STORE_SHARED(rcu_reader.waiting, 0);
>> Commenting this memory barrier would be helpful too.
> Ok.

I tried updating the formal model, but I had to basically rewrite it to 
model the futex primitives and the list move algorithm used by urcu.  I 
basically model a parity-flipping RCU and run the waker and waiter 
infinitely, asserting that progress states (parity flips) are reached 
infinite times.

My ProMeLa-fu is just a few hours old, so a careful review is 
appreciated.  However, the model seems to be okay: it passes, and more 
importantly it fails if I modify it to trigger known problems (missing 
write barriers especially).

The attached patches do the following:

1) rewrite the futex.spin model to match your proposed, simpler change;

2) add the optimization to tell waker threads whether they are still 
being waited on;

3) change the futex_progress_late_dec model to trigger a different 
failure, namely the missing memory barrier in the first version I sent 
of the patch.

Please let me know what you think about them.



-------------- next part --------------
A non-text attachment was scrubbed...
Name: futex-model.patch
Type: text/x-patch
Size: 8326 bytes
Desc: not available
URL: <http://lists.casi.polymtl.ca/pipermail/lttng-dev/attachments/20110815/43c04752/attachment-0003.bin>

More information about the lttng-dev mailing list