return w;
}
+static inline void
+__ww_waiter_add(struct mutex *lock, struct mutex_waiter *waiter, struct mutex_waiter *pos)
+{
+ struct list_head *p = &lock->wait_list;
+ if (pos)
+ p = &pos->list;
+ __mutex_add_waiter(lock, waiter, p);
+}
+
/*
* Wait-Die:
* The newer transactions are killed when:
struct mutex *lock,
struct ww_acquire_ctx *ww_ctx)
{
- struct mutex_waiter *cur;
- struct list_head *pos;
+ struct mutex_waiter *cur, *pos = NULL;
bool is_wait_die;
if (!ww_ctx) {
- __mutex_add_waiter(lock, waiter, &lock->wait_list);
+ __ww_waiter_add(lock, waiter, NULL);
return 0;
}
* never die here, but they are sorted in stamp order and
* may wound the lock holder.
*/
- pos = &lock->wait_list;
for (cur = __ww_waiter_last(lock); cur;
cur = __ww_waiter_prev(lock, cur)) {
break;
}
- pos = &cur->list;
+ pos = cur;
/* Wait-Die: ensure younger waiters die. */
__ww_mutex_die(lock, cur, ww_ctx);
}
- __mutex_add_waiter(lock, waiter, pos);
+ __ww_waiter_add(lock, waiter, pos);
/*
* Wound-Wait: if we're blocking on a mutex owned by a younger context,