Merge remote-tracking branch 'sm8250/lineage-20' into HEAD

* sm8250/lineage-20:
  BACKPORT: locking/rtmutex: Skip remove_waiter() when waiter is not enqueued
  BACKPORT: rtmutex: Use waiter::task instead of current in remove_waiter()
  tcp: fix an incorrect __user annotation on tcp_use_userconfig_sysctl_handler
  tcp: fix an incorrect __user annotation on tcp_proc_delayed_ack_control

Change-Id: Ic92b58344a6f9c42bd28322256bc13298c6f256d
This commit is contained in:
Nolen Johnson
2026-08-10 19:39:23 -04:00
3 changed files with 15 additions and 9 deletions

View File

@ -360,10 +360,10 @@ ssize_t tcp_splice_read(struct socket *sk, loff_t *ppos,
/* sysctl master controller */
extern int tcp_use_userconfig_sysctl_handler(struct ctl_table *table,
int write, void __user *buffer, size_t *length,
int write, void *buffer, size_t *length,
loff_t *ppos);
extern int tcp_proc_delayed_ack_control(struct ctl_table *table, int write,
void __user *buffer, size_t *length,
void *buffer, size_t *length,
loff_t *ppos);
static inline void tcp_dec_quickack_mode(struct sock *sk)

View File

@ -1062,20 +1062,26 @@ static void mark_wakeup_next_waiter(struct wake_q_head *wake_q,
*
* Must be called with lock->wait_lock held and interrupts disabled. I must
* have just failed to try_to_take_rt_mutex().
*
* When invoked from rt_mutex_start_proxy_lock() waiter::task != current !
*/
static void remove_waiter(struct rt_mutex *lock,
struct rt_mutex_waiter *waiter)
{
bool is_top_waiter = (waiter == rt_mutex_top_waiter(lock));
struct task_struct *owner = rt_mutex_owner(lock);
struct task_struct *waiter_task = waiter->task;
struct rt_mutex *next_lock;
lockdep_assert_held(&lock->wait_lock);
raw_spin_lock(&current->pi_lock);
if (!waiter_task) /* never enqueued */
return;
raw_spin_lock(&waiter_task->pi_lock);
rt_mutex_dequeue(lock, waiter);
current->pi_blocked_on = NULL;
raw_spin_unlock(&current->pi_lock);
waiter_task->pi_blocked_on = NULL;
raw_spin_unlock(&waiter_task->pi_lock);
/*
* Only update priority if the waiter was the highest priority
@ -1111,7 +1117,7 @@ static void remove_waiter(struct rt_mutex *lock,
raw_spin_unlock_irq(&lock->wait_lock);
rt_mutex_adjust_prio_chain(owner, RT_MUTEX_MIN_CHAINWALK, lock,
next_lock, NULL, current);
next_lock, NULL, waiter_task);
raw_spin_lock_irq(&lock->wait_lock);
}
@ -1801,7 +1807,7 @@ int rt_mutex_start_proxy_lock(struct rt_mutex *lock,
raw_spin_lock_irq(&lock->wait_lock);
ret = __rt_mutex_start_proxy_lock(lock, waiter, task);
if (unlikely(ret))
if (unlikely(ret < 0))
remove_waiter(lock, waiter);
raw_spin_unlock_irq(&lock->wait_lock);

View File

@ -46,7 +46,7 @@ static void set_tcp_default(void)
/*sysctl handler for tcp_ack realted master control */
int tcp_proc_delayed_ack_control(struct ctl_table *table, int write,
void __user *buffer, size_t *length,
void *buffer, size_t *length,
loff_t *ppos)
{
int ret = proc_dointvec_minmax(table, write, buffer, length, ppos);
@ -60,7 +60,7 @@ int tcp_proc_delayed_ack_control(struct ctl_table *table, int write,
/*sysctl handler for tcp_ack realted master control */
int tcp_use_userconfig_sysctl_handler(struct ctl_table *table, int write,
void __user *buffer, size_t *length,
void *buffer, size_t *length,
loff_t *ppos)
{
int ret = proc_dointvec_minmax(table, write, buffer, length, ppos);