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

Commit af888d67 authored by Thomas Gleixner's avatar Thomas Gleixner
Browse files

posix-timers: Unify overrun/requeue_pending handling



hrtimer based posix-timers and posix-cpu-timers handle the update of the
rearming and overflow related status fields differently.

Move that update to the common rearming code.

Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: John Stultz <john.stultz@linaro.org>
Link: http://lkml.kernel.org/r/20170530211656.484936964@linutronix.de
parent bab0aae9
Loading
Loading
Loading
Loading
+7 −11
Original line number Diff line number Diff line
@@ -527,6 +527,7 @@ static void cpu_timer_fire(struct k_itimer *timer)
		 * ticking in case the signal is deliverable next time.
		 */
		posix_cpu_timer_schedule(timer);
		++timer->it_requeue_pending;
	}
}

@@ -997,12 +998,12 @@ void posix_cpu_timer_schedule(struct k_itimer *timer)
		cpu_clock_sample(timer->it_clock, p, &now);
		bump_cpu_timer(timer, now);
		if (unlikely(p->exit_state))
			goto out;
			return;

		/* Protect timer list r/w in arm_timer() */
		sighand = lock_task_sighand(p, &flags);
		if (!sighand)
			goto out;
			return;
	} else {
		/*
		 * Protect arm_timer() and timer sampling in case of call to
@@ -1015,11 +1016,10 @@ void posix_cpu_timer_schedule(struct k_itimer *timer)
			 * We can't even collect a sample any more.
			 */
			timer->it.cpu.expires = 0;
			goto out;
			return;
		} else if (unlikely(p->exit_state) && thread_group_empty(p)) {
			unlock_task_sighand(p, &flags);
			/* Optimizations: if the process is dying, no need to rearm */
			goto out;
			/* If the process is dying, no need to rearm */
			goto unlock;
		}
		cpu_timer_sample_group(timer->it_clock, p, &now);
		bump_cpu_timer(timer, now);
@@ -1031,12 +1031,8 @@ void posix_cpu_timer_schedule(struct k_itimer *timer)
	 */
	WARN_ON_ONCE(!irqs_disabled());
	arm_timer(timer);
unlock:
	unlock_task_sighand(p, &flags);

out:
	timer->it_overrun_last = timer->it_overrun;
	timer->it_overrun = -1;
	++timer->it_requeue_pending;
}

/**
+8 −7
Original line number Diff line number Diff line
@@ -291,10 +291,6 @@ static void schedule_next_timer(struct k_itimer *timr)
	timr->it_overrun += (unsigned int) hrtimer_forward(timer,
						timer->base->get_time(),
						timr->it.real.interval);

	timr->it_overrun_last = timr->it_overrun;
	timr->it_overrun = -1;
	++timr->it_requeue_pending;
	hrtimer_restart(timer);
}

@@ -315,17 +311,22 @@ void do_schedule_next_timer(struct siginfo *info)
	unsigned long flags;

	timr = lock_timer(info->si_tid, &flags);
	if (!timr)
		return;

	if (timr && timr->it_requeue_pending == info->si_sys_private) {
	if (timr->it_requeue_pending == info->si_sys_private) {
		if (timr->it_clock < 0)
			posix_cpu_timer_schedule(timr);
		else
			schedule_next_timer(timr);

		timr->it_overrun_last = timr->it_overrun;
		timr->it_overrun = -1;
		++timr->it_requeue_pending;

		info->si_overrun += timr->it_overrun_last;
	}

	if (timr)
	unlock_timer(timr, flags);
}