Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 934715a1 authored by Jason Low's avatar Jason Low Committed by Thomas Gleixner
Browse files

posix_cpu_timer: Check thread timers only when there are active thread timers



The fastpath_timer_check() contains logic to check for if any timers
are set by checking if !task_cputime_zero(). Similarly, we can do this
before calling check_thread_timers(). In the case where there
are only process-wide timers, this will skip all of the computations for
per-thread timers when there are no per-thread timers.

As suggested by George, we can put the task_cputime_zero() check in
check_thread_timers(), since that is more of an optization to the
function. Similarly, we move the existing check of cputimer->running
to check_process_timers().

Signed-off-by: default avatarJason Low <jason.low2@hp.com>
Reviewed-by: default avatarOleg Nesterov <oleg@redhat.com>
Reviewed-by: default avatarGeorge Spelvin <linux@horizon.com>
Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Davidlohr Bueso <dave@stgolabs.net>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: hideaki.kimura@hpe.com
Cc: terry.rudd@hpe.com
Cc: scott.norton@hpe.com
Cc: Peter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/r/1444849677-29330-3-git-send-email-jason.low2@hp.com


Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
parent 7c177d99
Loading
Loading
Loading
Loading
+16 −6
Original line number Diff line number Diff line
@@ -864,6 +864,13 @@ static void check_thread_timers(struct task_struct *tsk,
	unsigned long long expires;
	unsigned long soft;

	/*
	 * If cputime_expires is zero, then there are no active
	 * per thread CPU timers.
	 */
	if (task_cputime_zero(&tsk->cputime_expires))
		return;

	expires = check_timers_list(timers, firing, prof_ticks(tsk));
	tsk_expires->prof_exp = expires_to_cputime(expires);

@@ -961,6 +968,13 @@ static void check_process_timers(struct task_struct *tsk,
	struct task_cputime cputime;
	unsigned long soft;

	/*
	 * If cputimer is not running, then there are no active
	 * process wide timers (POSIX 1.b, itimers, RLIMIT_CPU).
	 */
	if (!READ_ONCE(tsk->signal->cputimer.running))
		return;

	/*
	 * Collect the current process totals.
	 */
@@ -1169,11 +1183,7 @@ void run_posix_cpu_timers(struct task_struct *tsk)
	 * put them on the firing list.
	 */
	check_thread_timers(tsk, &firing);
	/*
	 * If there are any active process wide timers (POSIX 1.b, itimers,
	 * RLIMIT_CPU) cputimer must be running.
	 */
	if (READ_ONCE(tsk->signal->cputimer.running))

	check_process_timers(tsk, &firing);

	/*