diff options
Diffstat (limited to 'kernel/time/tick-oneshot.c')
| -rw-r--r-- | kernel/time/tick-oneshot.c | 82 | 
1 files changed, 6 insertions, 76 deletions
diff --git a/kernel/time/tick-oneshot.c b/kernel/time/tick-oneshot.c index aada0e52680..824109060a3 100644 --- a/kernel/time/tick-oneshot.c +++ b/kernel/time/tick-oneshot.c @@ -18,86 +18,17 @@  #include <linux/percpu.h>  #include <linux/profile.h>  #include <linux/sched.h> -#include <linux/tick.h>  #include "tick-internal.h" -/* Limit min_delta to a jiffie */ -#define MIN_DELTA_LIMIT		(NSEC_PER_SEC / HZ) - -static int tick_increase_min_delta(struct clock_event_device *dev) -{ -	/* Nothing to do if we already reached the limit */ -	if (dev->min_delta_ns >= MIN_DELTA_LIMIT) -		return -ETIME; - -	if (dev->min_delta_ns < 5000) -		dev->min_delta_ns = 5000; -	else -		dev->min_delta_ns += dev->min_delta_ns >> 1; - -	if (dev->min_delta_ns > MIN_DELTA_LIMIT) -		dev->min_delta_ns = MIN_DELTA_LIMIT; - -	printk(KERN_WARNING "CE: %s increased min_delta_ns to %llu nsec\n", -	       dev->name ? dev->name : "?", -	       (unsigned long long) dev->min_delta_ns); -	return 0; -} - -/** - * tick_program_event internal worker function - */ -int tick_dev_program_event(struct clock_event_device *dev, ktime_t expires, -			   int force) -{ -	ktime_t now = ktime_get(); -	int i; - -	for (i = 0;;) { -		int ret = clockevents_program_event(dev, expires, now); - -		if (!ret || !force) -			return ret; - -		dev->retries++; -		/* -		 * We tried 3 times to program the device with the given -		 * min_delta_ns. If that's not working then we increase it -		 * and emit a warning. -		 */ -		if (++i > 2) { -			/* Increase the min. delta and try again */ -			if (tick_increase_min_delta(dev)) { -				/* -				 * Get out of the loop if min_delta_ns -				 * hit the limit already. That's -				 * better than staying here forever. -				 * -				 * We clear next_event so we have a -				 * chance that the box survives. -				 */ -				printk(KERN_WARNING -				       "CE: Reprogramming failure. Giving up\n"); -				dev->next_event.tv64 = KTIME_MAX; -				return -ETIME; -			} -			i = 0; -		} - -		now = ktime_get(); -		expires = ktime_add_ns(now, dev->min_delta_ns); -	} -} -  /**   * tick_program_event   */  int tick_program_event(ktime_t expires, int force)  { -	struct clock_event_device *dev = __get_cpu_var(tick_cpu_device).evtdev; +	struct clock_event_device *dev = __this_cpu_read(tick_cpu_device.evtdev); -	return tick_dev_program_event(dev, expires, force); +	return clockevents_program_event(dev, expires, force);  }  /** @@ -105,11 +36,10 @@ int tick_program_event(ktime_t expires, int force)   */  void tick_resume_oneshot(void)  { -	struct tick_device *td = &__get_cpu_var(tick_cpu_device); -	struct clock_event_device *dev = td->evtdev; +	struct clock_event_device *dev = __this_cpu_read(tick_cpu_device.evtdev);  	clockevents_set_mode(dev, CLOCK_EVT_MODE_ONESHOT); -	tick_program_event(ktime_get(), 1); +	clockevents_program_event(dev, ktime_get(), true);  }  /** @@ -121,7 +51,7 @@ void tick_setup_oneshot(struct clock_event_device *newdev,  {  	newdev->event_handler = handler;  	clockevents_set_mode(newdev, CLOCK_EVT_MODE_ONESHOT); -	tick_dev_program_event(newdev, next_event, 1); +	clockevents_program_event(newdev, next_event, true);  }  /** @@ -167,7 +97,7 @@ int tick_oneshot_mode_active(void)  	int ret;  	local_irq_save(flags); -	ret = __get_cpu_var(tick_cpu_device).mode == TICKDEV_MODE_ONESHOT; +	ret = __this_cpu_read(tick_cpu_device.mode) == TICKDEV_MODE_ONESHOT;  	local_irq_restore(flags);  	return ret;  | 
