HRTIMER_RESTART,
};
-#define HRTIMER_INACTIVE ((void *)1UL)
+/*
+ * Timer states:
+ */
+enum hrtimer_state {
+ HRTIMER_INACTIVE, /* Timer is inactive */
+ HRTIMER_EXPIRED, /* Timer is expired */
+ HRTIMER_RUNNING, /* Timer is running the callback function */
+ HRTIMER_PENDING, /* Timer is pending */
+};
struct hrtimer_base;
* @expires: the absolute expiry time in the hrtimers internal
* representation. The time is related to the clock on
* which the timer is based.
+ * @state: state of the timer
* @function: timer expiry callback function
+ * @data: argument for the callback function
* @base: pointer to the timer base (per cpu and per clock)
*
* The hrtimer structure must be initialized by init_hrtimer_#CLOCKTYPE()
struct hrtimer {
struct rb_node node;
ktime_t expires;
- int (*function)(struct hrtimer *);
+ enum hrtimer_state state;
+ int (*function)(void *);
+ void *data;
struct hrtimer_base *base;
};
-/**
- * struct hrtimer_sleeper - simple sleeper structure
- *
- * @timer: embedded timer structure
- * @task: task to wake up
- *
- * task is set to NULL, when the timer expires.
- */
-struct hrtimer_sleeper {
- struct hrtimer timer;
- struct task_struct *task;
-};
-
/**
* struct hrtimer_base - the timer base for a specific clock
*
- * @index: clock type index for per_cpu support when moving a timer
- * to a base on another cpu.
- * @lock: lock protecting the base and associated timers
- * @active: red black tree root node for the active timers
- * @first: pointer to the timer node which expires first
- * @resolution: the resolution of the clock, in nanoseconds
- * @get_time: function to retrieve the current time of the clock
- * @get_softirq_time: function to retrieve the current time from the softirq
- * @curr_timer: the timer which is executing a callback right now
- * @softirq_time: the time when running the hrtimer queue in the softirq
+ * @index: clock type index for per_cpu support when moving a timer
+ * to a base on another cpu.
+ * @lock: lock protecting the base and associated timers
+ * @active: red black tree root node for the active timers
+ * @first: pointer to the timer node which expires first
+ * @resolution: the resolution of the clock, in nanoseconds
+ * @get_time: function to retrieve the current time of the clock
+ * @curr_timer: the timer which is executing a callback right now
*/
struct hrtimer_base {
clockid_t index;
struct rb_node *first;
ktime_t resolution;
ktime_t (*get_time)(void);
- ktime_t (*get_softirq_time)(void);
struct hrtimer *curr_timer;
- ktime_t softirq_time;
};
/*
static inline int hrtimer_active(const struct hrtimer *timer)
{
- return timer->node.rb_parent != HRTIMER_INACTIVE;
+ return timer->state == HRTIMER_PENDING;
}
/* Forward a hrtimer so it expires after now: */
-extern unsigned long
-hrtimer_forward(struct hrtimer *timer, ktime_t now, ktime_t interval);
+extern unsigned long hrtimer_forward(struct hrtimer *timer, ktime_t interval);
/* Precise sleep: */
extern long hrtimer_nanosleep(struct timespec *rqtp,
const enum hrtimer_mode mode,
const clockid_t clockid);
-extern void hrtimer_init_sleeper(struct hrtimer_sleeper *sl,
- struct task_struct *tsk);
-
/* Soft interrupt function to run the hrtimer queues: */
extern void hrtimer_run_queues(void);