mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-24 12:44:11 +08:00
kernel/futex: Kill rt_mutex_next_owner()
Update wake_futex_pi() and kill the call altogether. This is possible because: (i) The case of fixup_owner() in which the pi_mutex was stolen from the signaled enqueued top-waiter which fails to trylock and doesn't see a current owner of the rtmutex but needs to acknowledge an non-enqueued higher priority waiter, which is the other alternative. This used to be handled by rt_mutex_next_owner(), which guaranteed fixup_pi_state_owner('newowner') never to be nil. Nowadays the logic is handled by an EAGAIN loop, without the need of rt_mutex_next_owner(). Specifically:c1e2f0eaf0
(futex: Avoid violating the 10th rule of futex)9f5d1c336a
(futex: Handle transient "ownerless" rtmutex state correctly) (ii) rt_mutex_next_owner() and rt_mutex_top_waiter() are semantically equivalent, as of:c28d62cf52
(locking/rtmutex: Handle non enqueued waiters gracefully in remove_waiter()) So instead of keeping the call around, just use the good ole rt_mutex_top_waiter(). No change in semantics. Signed-off-by: Davidlohr Bueso <dbueso@suse.de> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org> Link: https://lore.kernel.org/r/20210226175029.50335-1-dave@stgolabs.net
This commit is contained in:
parent
bdb1050ee1
commit
9a4b99fce6
@ -1494,13 +1494,14 @@ static void mark_wake_futex(struct wake_q_head *wake_q, struct futex_q *q)
|
||||
static int wake_futex_pi(u32 __user *uaddr, u32 uval, struct futex_pi_state *pi_state)
|
||||
{
|
||||
u32 curval, newval;
|
||||
struct rt_mutex_waiter *top_waiter;
|
||||
struct task_struct *new_owner;
|
||||
bool postunlock = false;
|
||||
DEFINE_WAKE_Q(wake_q);
|
||||
int ret = 0;
|
||||
|
||||
new_owner = rt_mutex_next_owner(&pi_state->pi_mutex);
|
||||
if (WARN_ON_ONCE(!new_owner)) {
|
||||
top_waiter = rt_mutex_top_waiter(&pi_state->pi_mutex);
|
||||
if (WARN_ON_ONCE(!top_waiter)) {
|
||||
/*
|
||||
* As per the comment in futex_unlock_pi() this should not happen.
|
||||
*
|
||||
@ -1513,6 +1514,8 @@ static int wake_futex_pi(u32 __user *uaddr, u32 uval, struct futex_pi_state *pi_
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
new_owner = top_waiter->task;
|
||||
|
||||
/*
|
||||
* We pass it to the next owner. The WAITERS bit is always kept
|
||||
* enabled while there is PI state around. We cleanup the owner
|
||||
|
@ -1792,26 +1792,6 @@ int rt_mutex_start_proxy_lock(struct rt_mutex *lock,
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* rt_mutex_next_owner - return the next owner of the lock
|
||||
*
|
||||
* @lock: the rt lock query
|
||||
*
|
||||
* Returns the next owner of the lock or NULL
|
||||
*
|
||||
* Caller has to serialize against other accessors to the lock
|
||||
* itself.
|
||||
*
|
||||
* Special API call for PI-futex support
|
||||
*/
|
||||
struct task_struct *rt_mutex_next_owner(struct rt_mutex *lock)
|
||||
{
|
||||
if (!rt_mutex_has_waiters(lock))
|
||||
return NULL;
|
||||
|
||||
return rt_mutex_top_waiter(lock)->task;
|
||||
}
|
||||
|
||||
/**
|
||||
* rt_mutex_wait_proxy_lock() - Wait for lock acquisition
|
||||
* @lock: the rt_mutex we were woken on
|
||||
|
@ -130,7 +130,6 @@ enum rtmutex_chainwalk {
|
||||
/*
|
||||
* PI-futex support (proxy locking functions, etc.):
|
||||
*/
|
||||
extern struct task_struct *rt_mutex_next_owner(struct rt_mutex *lock);
|
||||
extern void rt_mutex_init_proxy_locked(struct rt_mutex *lock,
|
||||
struct task_struct *proxy_owner);
|
||||
extern void rt_mutex_proxy_unlock(struct rt_mutex *lock);
|
||||
|
Loading…
Reference in New Issue
Block a user