diff options
| author | Thomas Gleixner <tglx@linutronix.de> | 2008-10-22 09:48:06 +0200 | 
|---|---|---|
| committer | Thomas Gleixner <tglx@linutronix.de> | 2008-10-22 09:48:06 +0200 | 
| commit | 268a3dcfea2077fca60d3715caa5c96f9b5e6ea7 (patch) | |
| tree | c2232774508424e677e27f296090a68c775e4669 /include/linux/hrtimer.h | |
| parent | c4bd822e7b12a9008241d76db45b665f2fef180c (diff) | |
| parent | 592aa999d6a272856c9bfbdaac0cfba1bb37c24c (diff) | |
| download | olio-linux-3.10-268a3dcfea2077fca60d3715caa5c96f9b5e6ea7.tar.xz olio-linux-3.10-268a3dcfea2077fca60d3715caa5c96f9b5e6ea7.zip  | |
Merge branch 'timers/range-hrtimers' into v28-range-hrtimers-for-linus-v2
Conflicts:
	kernel/time/tick-sched.c
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'include/linux/hrtimer.h')
| -rw-r--r-- | include/linux/hrtimer.h | 105 | 
1 files changed, 101 insertions, 4 deletions
diff --git a/include/linux/hrtimer.h b/include/linux/hrtimer.h index 9a4e35cd5f7..2b3645b1acf 100644 --- a/include/linux/hrtimer.h +++ b/include/linux/hrtimer.h @@ -20,6 +20,8 @@  #include <linux/init.h>  #include <linux/list.h>  #include <linux/wait.h> +#include <linux/percpu.h> +  struct hrtimer_clock_base;  struct hrtimer_cpu_base; @@ -101,9 +103,14 @@ enum hrtimer_cb_mode {  /**   * struct hrtimer - the basic hrtimer structure   * @node:	red black tree node for time ordered insertion - * @expires:	the absolute expiry time in the hrtimers internal + * @_expires:	the absolute expiry time in the hrtimers internal   *		representation. The time is related to the clock on - *		which the timer is based. + *		which the timer is based. Is setup by adding + *		slack to the _softexpires value. For non range timers + *		identical to _softexpires. + * @_softexpires: the absolute earliest expiry time of the hrtimer. + *		The time which was given as expiry time when the timer + *		was armed.   * @function:	timer expiry callback function   * @base:	pointer to the timer base (per cpu and per clock)   * @state:	state information (See bit values above) @@ -121,7 +128,8 @@ enum hrtimer_cb_mode {   */  struct hrtimer {  	struct rb_node			node; -	ktime_t				expires; +	ktime_t				_expires; +	ktime_t				_softexpires;  	enum hrtimer_restart		(*function)(struct hrtimer *);  	struct hrtimer_clock_base	*base;  	unsigned long			state; @@ -201,6 +209,71 @@ struct hrtimer_cpu_base {  #endif  }; +static inline void hrtimer_set_expires(struct hrtimer *timer, ktime_t time) +{ +	timer->_expires = time; +	timer->_softexpires = time; +} + +static inline void hrtimer_set_expires_range(struct hrtimer *timer, ktime_t time, ktime_t delta) +{ +	timer->_softexpires = time; +	timer->_expires = ktime_add_safe(time, delta); +} + +static inline void hrtimer_set_expires_range_ns(struct hrtimer *timer, ktime_t time, unsigned long delta) +{ +	timer->_softexpires = time; +	timer->_expires = ktime_add_safe(time, ns_to_ktime(delta)); +} + +static inline void hrtimer_set_expires_tv64(struct hrtimer *timer, s64 tv64) +{ +	timer->_expires.tv64 = tv64; +	timer->_softexpires.tv64 = tv64; +} + +static inline void hrtimer_add_expires(struct hrtimer *timer, ktime_t time) +{ +	timer->_expires = ktime_add_safe(timer->_expires, time); +	timer->_softexpires = ktime_add_safe(timer->_softexpires, time); +} + +static inline void hrtimer_add_expires_ns(struct hrtimer *timer, unsigned long ns) +{ +	timer->_expires = ktime_add_ns(timer->_expires, ns); +	timer->_softexpires = ktime_add_ns(timer->_softexpires, ns); +} + +static inline ktime_t hrtimer_get_expires(const struct hrtimer *timer) +{ +	return timer->_expires; +} + +static inline ktime_t hrtimer_get_softexpires(const struct hrtimer *timer) +{ +	return timer->_softexpires; +} + +static inline s64 hrtimer_get_expires_tv64(const struct hrtimer *timer) +{ +	return timer->_expires.tv64; +} +static inline s64 hrtimer_get_softexpires_tv64(const struct hrtimer *timer) +{ +	return timer->_softexpires.tv64; +} + +static inline s64 hrtimer_get_expires_ns(const struct hrtimer *timer) +{ +	return ktime_to_ns(timer->_expires); +} + +static inline ktime_t hrtimer_expires_remaining(const struct hrtimer *timer) +{ +    return ktime_sub(timer->_expires, timer->base->get_time()); +} +  #ifdef CONFIG_HIGH_RES_TIMERS  struct clock_event_device; @@ -221,6 +294,8 @@ static inline int hrtimer_is_hres_active(struct hrtimer *timer)  	return timer->base->cpu_base->hres_active;  } +extern void hrtimer_peek_ahead_timers(void); +  /*   * The resolution of the clocks. The resolution value is returned in   * the clock_getres() system call to give application programmers an @@ -243,6 +318,7 @@ static inline int hrtimer_is_hres_active(struct hrtimer *timer)   * is expired in the next softirq when the clock was advanced.   */  static inline void clock_was_set(void) { } +static inline void hrtimer_peek_ahead_timers(void) { }  static inline void hres_timers_resume(void) { } @@ -264,6 +340,10 @@ static inline int hrtimer_is_hres_active(struct hrtimer *timer)  extern ktime_t ktime_get(void);  extern ktime_t ktime_get_real(void); + +DECLARE_PER_CPU(struct tick_device, tick_cpu_device); + +  /* Exported timer functions: */  /* Initialize timers: */ @@ -288,12 +368,25 @@ static inline void destroy_hrtimer_on_stack(struct hrtimer *timer) { }  /* Basic timer operations: */  extern int hrtimer_start(struct hrtimer *timer, ktime_t tim,  			 const enum hrtimer_mode mode); +extern int hrtimer_start_range_ns(struct hrtimer *timer, ktime_t tim, +			unsigned long range_ns, const enum hrtimer_mode mode);  extern int hrtimer_cancel(struct hrtimer *timer);  extern int hrtimer_try_to_cancel(struct hrtimer *timer); +static inline int hrtimer_start_expires(struct hrtimer *timer, +						enum hrtimer_mode mode) +{ +	unsigned long delta; +	ktime_t soft, hard; +	soft = hrtimer_get_softexpires(timer); +	hard = hrtimer_get_expires(timer); +	delta = ktime_to_ns(ktime_sub(hard, soft)); +	return hrtimer_start_range_ns(timer, soft, delta, mode); +} +  static inline int hrtimer_restart(struct hrtimer *timer)  { -	return hrtimer_start(timer, timer->expires, HRTIMER_MODE_ABS); +	return hrtimer_start_expires(timer, HRTIMER_MODE_ABS);  }  /* Query timers: */ @@ -350,6 +443,10 @@ extern long hrtimer_nanosleep_restart(struct restart_block *restart_block);  extern void hrtimer_init_sleeper(struct hrtimer_sleeper *sl,  				 struct task_struct *tsk); +extern int schedule_hrtimeout_range(ktime_t *expires, unsigned long delta, +						const enum hrtimer_mode mode); +extern int schedule_hrtimeout(ktime_t *expires, const enum hrtimer_mode mode); +  /* Soft interrupt function to run the hrtimer queues: */  extern void hrtimer_run_queues(void);  extern void hrtimer_run_pending(void);  |