• Eric W. Biederman's avatar
    posix-cpu-timers: Replace __get_task_for_clock with pid_for_clock · 96498773
    Eric W. Biederman authored
    Now that the codes store references to pids instead of referendes to
    tasks.  Looking up a task for a clock instead of looking up a struct
    pid makes the code more difficult to verify it is correct than
    necessary.
    
    In posix_cpu_timers_create get_task_pid can race with release_task for
    threads and return a NULL pid.  As put_pid and cpu_timer_task_rcu
    handle NULL pids just fine the code works without problems but it is
    an extra case to consider and keep in mind while verifying and
    modifying the code.
    
    There are races with de_thread to consider that only don't apply
    because thread clocks are only allowed for threads in the same
    thread_group.
    
    So instead of leaving a burden for people making modification to the
    code in the future return a rcu protected struct pid for the clock
    instead.
    
    The logic for __get_task_for_pid and lookup_task has been folded into
    the new function pid_for_clock with the only change being the logic
    has been modified from working on a task to working on a pid that
    will be returned.
    
    In posix_cpu_clock_get instead of calling pid_for_clock checking the
    result and then calling pid_task to get the task.  The result of
    pid_for_clock is fed directly into pid_task.  This is safe because
    pid_task handles NULL pids.  As such an extra error check was
    unnecessary.
    
    Instead of hiding the flag that enables the special clock_gettime
    handling, I have made the 3 callers just pass the flag in themselves.
    That is less code and seems just as simple to work with as the
    wrapper functions.
    
    Historically the clock_gettime special case of allowing a process
    clock to be found by the thread id did not even exist [33ab0fec]
    but Thomas Gleixner reports that he has found code that uses that
    functionality [55e8c8eb].
    
    Link: https://lkml.kernel.org/r/87zhaxqkwa.fsf@nanos.tec.linutronix.de/
    Ref: 33ab0fec ("posix-timers: Consolidate posix_cpu_clock_get()")
    Ref: 55e8c8eb ("posix-cpu-timers: Store a reference to a pid not a task")
    Signed-off-by: default avatar"Eric W. Biederman" <ebiederm@xmission.com>
    96498773
posix-cpu-timers.c 37 KB