mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	posix-cpu-timers: Remove unnecessary locking around cpu_clock_sample_group
As of e78c349679 ("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
			
			
This commit is contained in:
		
							parent
							
								
									a2efdbf4fc
								
							
						
					
					
						commit
						60f2ceaa81
					
				
					 1 changed files with 12 additions and 54 deletions
				
			
		| 
						 | 
				
			
			@ -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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue