lkml.org 
[lkml]   [2021]   [Aug]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[patch V3 42/64] locking/ww_mutex: Abstract waiter iteration
    From: Peter Zijlstra <peterz@infradead.org>

    Split out the waiter iteration functions so they can be substituted for a
    rtmutex based ww_mutex later.

    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    ---
    kernel/locking/ww_mutex.h | 57 ++++++++++++++++++++++++++++++++++++++++++----
    1 file changed, 53 insertions(+), 4 deletions(-)
    ---
    --- a/kernel/locking/ww_mutex.h
    +++ b/kernel/locking/ww_mutex.h
    @@ -1,5 +1,49 @@
    /* SPDX-License-Identifier: GPL-2.0-only */

    +static inline struct mutex_waiter *
    +__ww_waiter_first(struct mutex *lock)
    +{
    + struct mutex_waiter *w;
    +
    + w = list_first_entry(&lock->wait_list, struct mutex_waiter, list);
    + if (list_entry_is_head(w, &lock->wait_list, list))
    + return NULL;
    +
    + return w;
    +}
    +
    +static inline struct mutex_waiter *
    +__ww_waiter_next(struct mutex *lock, struct mutex_waiter *w)
    +{
    + w = list_next_entry(w, list);
    + if (list_entry_is_head(w, &lock->wait_list, list))
    + return NULL;
    +
    + return w;
    +}
    +
    +static inline struct mutex_waiter *
    +__ww_waiter_prev(struct mutex *lock, struct mutex_waiter *w)
    +{
    + w = list_prev_entry(w, list);
    + if (list_entry_is_head(w, &lock->wait_list, list))
    + return NULL;
    +
    + return w;
    +}
    +
    +static inline struct mutex_waiter *
    +__ww_waiter_last(struct mutex *lock)
    +{
    + struct mutex_waiter *w;
    +
    + w = list_last_entry(&lock->wait_list, struct mutex_waiter, list);
    + if (list_entry_is_head(w, &lock->wait_list, list))
    + return NULL;
    +
    + return w;
    +}
    +
    /*
    * Wait-Die:
    * The newer transactions are killed when:
    @@ -161,7 +205,9 @@ static void

    lockdep_assert_held(&lock->wait_lock);

    - list_for_each_entry(cur, &lock->wait_list, list) {
    + for (cur = __ww_waiter_first(lock); cur;
    + cur = __ww_waiter_next(lock, cur)) {
    +
    if (!cur->ww_ctx)
    continue;

    @@ -263,8 +309,9 @@ static inline int
    * If there is a waiter in front of us that has a context, then its
    * stamp is earlier than ours and we must kill ourself.
    */
    - cur = waiter;
    - list_for_each_entry_continue_reverse(cur, &lock->wait_list, list) {
    + for (cur = __ww_waiter_prev(lock, waiter); cur;
    + cur = __ww_waiter_prev(lock, cur)) {
    +
    if (!cur->ww_ctx)
    continue;

    @@ -309,7 +356,9 @@ static inline int
    * may wound the lock holder.
    */
    pos = &lock->wait_list;
    - list_for_each_entry_reverse(cur, &lock->wait_list, list) {
    + for (cur = __ww_waiter_last(lock); cur;
    + cur = __ww_waiter_prev(lock, cur)) {
    +
    if (!cur->ww_ctx)
    continue;

    \
     
     \ /
      Last update: 2021-08-05 17:46    [W:4.106 / U:0.000 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site