]> git.baikalelectronics.ru Git - kernel.git/commitdiff
posix-cpu-timers: Remove unnecessary locking around cpu_clock_sample_group
authorEric W. Biederman <ebiederm@xmission.com>
Fri, 28 Feb 2020 17:09:19 +0000 (11:09 -0600)
committerThomas Gleixner <tglx@linutronix.de>
Sun, 1 Mar 2020 10:21:44 +0000 (11:21 +0100)
As of f95c236363e8 ("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

index 46cc188bf5ab1431a9e1defed6f8265c5123cbb7..40c2d8396bb9d2c2ab6f6f4d10f97a756a29a619 100644 (file)
@@ -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);
 }