• Eric W. Biederman's avatar
    posix-cpu-timers: Store a reference to a pid not a task · 55e8c8eb
    Eric W. Biederman authored
    posix cpu timers do not handle the death of a process well.
    
    This is most clearly seen when a multi-threaded process calls exec from a
    thread that is not the leader of the thread group.  The posix cpu timer code
    continues to pin the old thread group leader and is unable to find the
    siglock from there.
    
    This results in posix_cpu_timer_del being unable to delete a timer,
    posix_cpu_timer_set being unable to set a timer.  Further to compensate for
    the problems in posix_cpu_timer_del on a multi-threaded exec all timers
    that point at the multi-threaded task are stopped.
    
    The code for the timers fundamentally needs to check if the target
    process/thread is alive.  This needs an extra level of indirection. This
    level of indirection is already available in struct pid.
    
    So replace cpu.task with cpu.pid to get the needed extra layer of
    indirection.
    
    In addition to handling things more cleanly this reduces the amount of
    memory a timer can pin when a process exits and then is reaped from
    a task_struct to the vastly smaller struct pid.
    
    Fixes: e0a70217 ("posix-cpu-timers: workaround to suppress the problems with mt exec")
    Signed-off-by: default avatar"Eric W. Biederman" <ebiederm@xmission.com>
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Link: https://lkml.kernel.org/r/87wo86tz6d.fsf@x220.int.ebiederm.org
    55e8c8eb
posix-cpu-timers.c 37.4 KB