lkml.org 
[lkml]   [2020]   [Mar]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[tip: timers/core] posix-cpu-timers: Remove unnecessary locking around cpu_clock_sample_group
    The following commit has been merged into the timers/core branch of tip:

    Commit-ID: 60f2ceaa8111d9ec51af87bde4a6809f2b3235e4
    Gitweb: https://git.kernel.org/tip/60f2ceaa8111d9ec51af87bde4a6809f2b3235e4
    Author: Eric W. Biederman <ebiederm@xmission.com>
    AuthorDate: Fri, 28 Feb 2020 11:09:19 -06:00
    Committer: Thomas Gleixner <tglx@linutronix.de>
    CommitterDate: Sun, 01 Mar 2020 11:21:44 +01:00

    posix-cpu-timers: Remove unnecessary locking around cpu_clock_sample_group

    As of e78c3496790e ("time, signal: Protect resource use statistics
    with seqlock") cpu_clock_sample_group no longers needs siglock
    protection. Unfortunately no one realized it at the time.

    Remove the extra locking that is for cpu_clock_sample_group and not
    for cpu_clock_sample. This significantly simplifies the code.

    Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Link: https://lkml.kernel.org/r/878skmvdts.fsf@x220.int.ebiederm.org

    ---
    kernel/time/posix-cpu-timers.c | 66 ++++++---------------------------
    1 file changed, 12 insertions(+), 54 deletions(-)

    diff --git a/kernel/time/posix-cpu-timers.c b/kernel/time/posix-cpu-timers.c
    index 46cc188..40c2d83 100644
    --- a/kernel/time/posix-cpu-timers.c
    +++ b/kernel/time/posix-cpu-timers.c
    @@ -718,31 +718,10 @@ static void posix_cpu_timer_get(struct k_itimer *timer, struct itimerspec64 *itp
    /*
    * Sample the clock to take the difference with the expiry time.
    */
    - if (CPUCLOCK_PERTHREAD(timer->it_clock)) {
    + if (CPUCLOCK_PERTHREAD(timer->it_clock))
    now = cpu_clock_sample(clkid, p);
    - } else {
    - struct sighand_struct *sighand;
    - unsigned long flags;
    -
    - /*
    - * Protect against sighand release/switch in exit/exec and
    - * also make timer sampling safe if it ends up calling
    - * thread_group_cputime().
    - */
    - sighand = lock_task_sighand(p, &flags);
    - if (unlikely(sighand == NULL)) {
    - /*
    - * The process has been reaped.
    - * We can't even collect a sample any more.
    - * Disarm the timer, nothing else to do.
    - */
    - cpu_timer_setexpires(ctmr, 0);
    - return;
    - } else {
    - now = cpu_clock_sample_group(clkid, p, false);
    - unlock_task_sighand(p, &flags);
    - }
    - }
    + else
    + now = cpu_clock_sample_group(clkid, p, false);

    if (now < expires) {
    itp->it_value = ns_to_timespec64(expires - now);
    @@ -986,43 +965,22 @@ static void posix_cpu_timer_rearm(struct k_itimer *timer)
    /*
    * Fetch the current sample and update the timer's expiry time.
    */
    - if (CPUCLOCK_PERTHREAD(timer->it_clock)) {
    + if (CPUCLOCK_PERTHREAD(timer->it_clock))
    now = cpu_clock_sample(clkid, p);
    - bump_cpu_timer(timer, now);
    - if (unlikely(p->exit_state))
    - return;
    -
    - /* Protect timer list r/w in arm_timer() */
    - sighand = lock_task_sighand(p, &flags);
    - if (!sighand)
    - return;
    - } else {
    - /*
    - * Protect arm_timer() and timer sampling in case of call to
    - * thread_group_cputime().
    - */
    - sighand = lock_task_sighand(p, &flags);
    - if (unlikely(sighand == NULL)) {
    - /*
    - * The process has been reaped.
    - * We can't even collect a sample any more.
    - */
    - cpu_timer_setexpires(ctmr, 0);
    - return;
    - } else if (unlikely(p->exit_state) && thread_group_empty(p)) {
    - /* If the process is dying, no need to rearm */
    - goto unlock;
    - }
    + else
    now = cpu_clock_sample_group(clkid, p, true);
    - bump_cpu_timer(timer, now);
    - /* Leave the sighand locked for the call below. */
    - }
    +
    + bump_cpu_timer(timer, now);
    +
    + /* Protect timer list r/w in arm_timer() */
    + sighand = lock_task_sighand(p, &flags);
    + if (unlikely(sighand == NULL))
    + return;

    /*
    * Now re-arm for the new expiry time.
    */
    arm_timer(timer);
    -unlock:
    unlock_task_sighand(p, &flags);
    }

    \
     
     \ /
      Last update: 2020-03-01 11:29    [W:2.642 / U:0.132 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site