lkml.org 
[lkml]   [2021]   [Sep]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.14 001/334] locking/mutex: Fix HANDOFF condition
    Date
    From: Peter Zijlstra <peterz@infradead.org>

    [ Upstream commit 048661a1f963e9517630f080687d48af79ed784c ]

    Yanfei reported that setting HANDOFF should not depend on recomputing
    @first, only on @first state. Which would then give:

    if (ww_ctx || !first)
    first = __mutex_waiter_is_first(lock, &waiter);
    if (first)
    __mutex_set_flag(lock, MUTEX_FLAG_HANDOFF);

    But because 'ww_ctx || !first' is basically 'always' and the test for
    first is relatively cheap, omit that first branch entirely.

    Reported-by: Yanfei Xu <yanfei.xu@windriver.com>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Reviewed-by: Waiman Long <longman@redhat.com>
    Reviewed-by: Yanfei Xu <yanfei.xu@windriver.com>
    Link: https://lore.kernel.org/r/20210630154114.896786297@infradead.org
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    kernel/locking/mutex.c | 15 +++++----------
    1 file changed, 5 insertions(+), 10 deletions(-)

    diff --git a/kernel/locking/mutex.c b/kernel/locking/mutex.c
    index d2df5e68b503..fb30e1436dfb 100644
    --- a/kernel/locking/mutex.c
    +++ b/kernel/locking/mutex.c
    @@ -928,7 +928,6 @@ __mutex_lock_common(struct mutex *lock, unsigned int state, unsigned int subclas
    struct ww_acquire_ctx *ww_ctx, const bool use_ww_ctx)
    {
    struct mutex_waiter waiter;
    - bool first = false;
    struct ww_mutex *ww;
    int ret;

    @@ -1007,6 +1006,8 @@ __mutex_lock_common(struct mutex *lock, unsigned int state, unsigned int subclas

    set_current_state(state);
    for (;;) {
    + bool first;
    +
    /*
    * Once we hold wait_lock, we're serialized against
    * mutex_unlock() handing the lock off to us, do a trylock
    @@ -1035,15 +1036,9 @@ __mutex_lock_common(struct mutex *lock, unsigned int state, unsigned int subclas
    spin_unlock(&lock->wait_lock);
    schedule_preempt_disabled();

    - /*
    - * ww_mutex needs to always recheck its position since its waiter
    - * list is not FIFO ordered.
    - */
    - if (ww_ctx || !first) {
    - first = __mutex_waiter_is_first(lock, &waiter);
    - if (first)
    - __mutex_set_flag(lock, MUTEX_FLAG_HANDOFF);
    - }
    + first = __mutex_waiter_is_first(lock, &waiter);
    + if (first)
    + __mutex_set_flag(lock, MUTEX_FLAG_HANDOFF);

    set_current_state(state);
    /*
    --
    2.30.2


    \
     
     \ /
      Last update: 2021-09-13 16:21    [W:4.078 / U:0.020 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site