do_sched_setscheduler: don't take tasklist_lock
PATCH 1/1 do_sched_setscheduler: don't take tasklist_lock
We don't need to take tasklist_lock or disable irqs for find_task_by_pid() + get_task_struct(). Use RCU locks instead.
Signed-off-by Oleg Nesterov <[email protected]>
kernel/sched.c renamed from kernel/sched.c~1_dss +7 -6
@@ -4156,14 +4156,15 @@ do_sched_setscheduler(pid_t pid, int polreturn -EINVAL ;if (copy_from_user (&lparam, param,sizeof (struct sched_param )))return -EFAULT ; -read_lock_irq (&tasklist_lock); + +rcu_read_lock (); p =find_process_by_pid (pid); -if (!p) { -read_unlock_irq (&tasklist_lock); +if (p) +get_task_struct (p); +rcu_read_unlock (); +if (!p)return -ESRCH ; - } -get_task_struct (p); -read_unlock_irq (&tasklist_lock); + retval =sched_setscheduler (p, policy, &lparam);put_task_struct (p);
Quoted 4 lines · Oleg Nesterov
We don't need to take
tasklist_lockor disable irqs forfind_task_by_pid()+get_task_struct(). Use RCU locks instead.
On the other hand, I think sched_setscheduler() does need tasklist_lock!
It is unsafe do dereference ->signal unless tasklist_lock or ->siglock is held (or p == current). Yes, we pin the task structure, but this can't prevent from release_task()->__exit_signal() which sets ->signal = NULL.
So, I think this patch
[PATCH] Drop tasklist lock in do_sched_setscheduler commit e74c69f46d93d29eea0ad8647863d1c6488f0f55
is not correct.
Am I missed something?
Oleg.