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

Commit ecff4fcc authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge branch 'timers-fixes-for-linus' of...

Merge branch 'timers-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip

* 'timers-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
  timers: Consider slack value in mod_timer()
  clockevents: Handle empty cpumask gracefully
parents 58a9a36b 1c3cc116
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -182,7 +182,10 @@ void clockevents_register_device(struct clock_event_device *dev)
	unsigned long flags;

	BUG_ON(dev->mode != CLOCK_EVT_MODE_UNUSED);
	BUG_ON(!dev->cpumask);
	if (!dev->cpumask) {
		WARN_ON(num_possible_cpus() > 1);
		dev->cpumask = cpumask_of(smp_processor_id());
	}

	raw_spin_lock_irqsave(&clockevents_lock, flags);

+7 −8
Original line number Diff line number Diff line
@@ -749,16 +749,15 @@ unsigned long apply_slack(struct timer_list *timer, unsigned long expires)
	unsigned long expires_limit, mask;
	int bit;

	expires_limit = expires;

	if (timer->slack >= 0) {
		expires_limit = expires + timer->slack;
	} else {
		unsigned long now = jiffies;
		long delta = expires - jiffies;

		if (delta < 256)
			return expires;

		/* No slack, if already expired else auto slack 0.4% */
		if (time_after(expires, now))
			expires_limit = expires + (expires - now)/256;
		expires_limit = expires + delta / 256;
	}
	mask = expires ^ expires_limit;
	if (mask == 0)
@@ -795,6 +794,8 @@ unsigned long apply_slack(struct timer_list *timer, unsigned long expires)
 */
int mod_timer(struct timer_list *timer, unsigned long expires)
{
	expires = apply_slack(timer, expires);

	/*
	 * This is a common optimization triggered by the
	 * networking code - if the timer is re-modified
@@ -803,8 +804,6 @@ int mod_timer(struct timer_list *timer, unsigned long expires)
	if (timer_pending(timer) && timer->expires == expires)
		return 1;

	expires = apply_slack(timer, expires);

	return __mod_timer(timer, expires, false, TIMER_NOT_PINNED);
}
EXPORT_SYMBOL(mod_timer);