On 16.12.2016 18:20, Peter Zijlstra wrote:
On Fri, Dec 16, 2016 at 03:19:43PM +0100, Nicolai Hähnle wrote:
@@ -716,7 +775,20 @@ __mutex_lock_common(struct mutex *lock, long state, 
unsigned int subclass,
                spin_unlock_mutex(&lock->wait_lock, flags);
                schedule_preempt_disabled();

-               if (!first && __mutex_waiter_is_first(lock, &waiter)) {
+               if (use_ww_ctx && ww_ctx) {
+                       /*
+                        * Always re-check whether we're in first position. We
+                        * don't want to spin if another task with a lower
+                        * stamp has taken our position.
+                        *
+                        * We also may have to set the handoff flag again, if
+                        * our position at the head was temporarily taken away.
+                        */
+                       first = __mutex_waiter_is_first(lock, &waiter);
+
+                       if (first)
+                               __mutex_set_flag(lock, MUTEX_FLAG_HANDOFF);
+               } else if (!first && __mutex_waiter_is_first(lock, &waiter)) {
                        first = true;
                        __mutex_set_flag(lock, MUTEX_FLAG_HANDOFF);
                }

So the point is that !ww_ctx entries are 'skipped' during the insertion
and therefore, if one becomes first, it must stay first?

Yes. Actually, it should be possible to replace all the cases of use_ww_ctx
|| first with ww_ctx. Similarly, all cases of use_ww_ctx && ww_ctx could be
replaced by just ww_ctx.


I'm not seeing how "use_ww_ctx || first" -> "ww_ctx" works.

My bad, missing the '|| first'.


And while
"use_ww_ctx && ww_ctx" -> "ww_ctx" is correct, it didn't work right on
some older GCCs, they choked on value propagation for ww_ctx and kept
emitting code even if we passed in NULL. Hence use_ww_ctx.

Okay, I'll stick with use_ww_ctx. Thanks for the explanation.

Nicolai


Arnd is now looking to raise the minimum supported GCC version, so maybe
we should look at that again if he gets anywhere.

Reply via email to