Commit 8feebc67 authored by Eric W. Biederman's avatar Eric W. Biederman

posix-cpu-timer: Tidy up group_leader logic in lookup_task

Replace has_group_leader_pid with thread_group_leader.  Years ago Oleg
suggested changing thread_group_leader to has_group_leader_pid to handle
races.  Looking at the code then and now I don't see how it ever helped.
Especially as then the code really did need to be the
thread_group_leader.

Today it doesn't make a difference if thread_group_leader races with
de_thread as the task returned from lookup_task in the non-thread case is
just used to find values in task->signal.

Since the races with de_thread have never been handled revert
has_group_header_pid to thread_group_leader for clarity.

Update the comment in lookup_task to remove implementation details that
are no longer true and to mention task->signal instead of task->sighand,
as the relevant cpu timer details are all in task->signal.

Ref: 55e8c8eb ("posix-cpu-timers: Store a reference to a pid not a task")
Ref: c0deae8c ("posix-cpu-timers: Rcu_read_lock/unlock protect find_task_by_vpid call")
Signed-off-by: default avatar"Eric W. Biederman" <ebiederm@xmission.com>
parent 50712280
...@@ -69,12 +69,8 @@ static struct task_struct *lookup_task(const pid_t pid, bool thread, ...@@ -69,12 +69,8 @@ static struct task_struct *lookup_task(const pid_t pid, bool thread,
if (gettime) { if (gettime) {
/* /*
* For clock_gettime(PROCESS) the task does not need to be * For clock_gettime(PROCESS) the task does not need to be
* the actual group leader. tsk->sighand gives * the actual group leader. task->signal gives
* access to the group's clock. * access to the group's clock.
*
* Timers need the group leader because they take a
* reference on it and store the task pointer until the
* timer is destroyed.
*/ */
return (p == current || thread_group_leader(p)) ? p : NULL; return (p == current || thread_group_leader(p)) ? p : NULL;
} }
...@@ -82,7 +78,7 @@ static struct task_struct *lookup_task(const pid_t pid, bool thread, ...@@ -82,7 +78,7 @@ static struct task_struct *lookup_task(const pid_t pid, bool thread,
/* /*
* For processes require that p is group leader. * For processes require that p is group leader.
*/ */
return has_group_leader_pid(p) ? p : NULL; return thread_group_leader(p) ? p : NULL;
} }
static struct task_struct *__get_task_for_clock(const clockid_t clock, static struct task_struct *__get_task_for_clock(const clockid_t clock,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment