timer.h 4.4 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4
#ifndef _LINUX_TIMER_H
#define _LINUX_TIMER_H

#include <linux/list.h>
5
#include <linux/ktime.h>
L
Linus Torvalds 已提交
6 7 8
#include <linux/spinlock.h>
#include <linux/stddef.h>

9
struct tvec_t_base_s;
L
Linus Torvalds 已提交
10 11 12 13 14 15 16 17

struct timer_list {
	struct list_head entry;
	unsigned long expires;

	void (*function)(unsigned long);
	unsigned long data;

18
	struct tvec_t_base_s *base;
19 20 21 22 23
#ifdef CONFIG_TIMER_STATS
	void *start_site;
	char start_comm[16];
	int start_pid;
#endif
L
Linus Torvalds 已提交
24 25
};

26
extern struct tvec_t_base_s boot_tvec_bases;
27

L
Linus Torvalds 已提交
28 29 30 31
#define TIMER_INITIALIZER(_function, _expires, _data) {		\
		.function = (_function),			\
		.expires = (_expires),				\
		.data = (_data),				\
32
		.base = &boot_tvec_bases,			\
L
Linus Torvalds 已提交
33 34
	}

35 36 37 38
#define DEFINE_TIMER(_name, _function, _expires, _data)		\
	struct timer_list _name =				\
		TIMER_INITIALIZER(_function, _expires, _data)

39
void fastcall init_timer(struct timer_list * timer);
40
void fastcall init_timer_deferrable(struct timer_list *timer);
L
Linus Torvalds 已提交
41

42 43 44 45 46 47 48 49 50
static inline void setup_timer(struct timer_list * timer,
				void (*function)(unsigned long),
				unsigned long data)
{
	timer->function = function;
	timer->data = data;
	init_timer(timer);
}

51
/**
L
Linus Torvalds 已提交
52 53 54 55 56 57 58 59 60 61 62
 * timer_pending - is a timer pending?
 * @timer: the timer in question
 *
 * timer_pending will tell whether a given timer is currently pending,
 * or not. Callers must ensure serialization wrt. other operations done
 * to this timer, eg. interrupt contexts, or other CPUs on SMP.
 *
 * return value: 1 if the timer is pending, 0 if not.
 */
static inline int timer_pending(const struct timer_list * timer)
{
63
	return timer->entry.next != NULL;
L
Linus Torvalds 已提交
64 65 66 67 68 69 70
}

extern void add_timer_on(struct timer_list *timer, int cpu);
extern int del_timer(struct timer_list * timer);
extern int __mod_timer(struct timer_list *timer, unsigned long expires);
extern int mod_timer(struct timer_list *timer, unsigned long expires);

71 72 73 74
/*
 * Return when the next timer-wheel timeout occurs (in absolute jiffies),
 * locks the timer base:
 */
L
Linus Torvalds 已提交
75
extern unsigned long next_timer_interrupt(void);
76 77 78 79 80 81
/*
 * Return when the next timer-wheel timeout occurs (in absolute jiffies),
 * locks the timer base and does the comparison against the given
 * jiffie.
 */
extern unsigned long get_next_timer_interrupt(unsigned long now);
L
Linus Torvalds 已提交
82

83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
/*
 * Timer-statistics info:
 */
#ifdef CONFIG_TIMER_STATS

extern void init_timer_stats(void);

extern void timer_stats_update_stats(void *timer, pid_t pid, void *startf,
				     void *timerf, char * comm);

static inline void timer_stats_account_timer(struct timer_list *timer)
{
	timer_stats_update_stats(timer, timer->start_pid, timer->start_site,
				 timer->function, timer->start_comm);
}

extern void __timer_stats_timer_set_start_info(struct timer_list *timer,
					       void *addr);

static inline void timer_stats_timer_set_start_info(struct timer_list *timer)
{
	__timer_stats_timer_set_start_info(timer, __builtin_return_address(0));
}

static inline void timer_stats_timer_clear_start_info(struct timer_list *timer)
{
	timer->start_site = NULL;
}
#else
static inline void init_timer_stats(void)
{
}

static inline void timer_stats_account_timer(struct timer_list *timer)
{
}

static inline void timer_stats_timer_set_start_info(struct timer_list *timer)
{
}

static inline void timer_stats_timer_clear_start_info(struct timer_list *timer)
{
}
#endif

extern void delayed_work_timer_fn(unsigned long __data);

131
/**
L
Linus Torvalds 已提交
132 133 134 135
 * add_timer - start a timer
 * @timer: the timer to be added
 *
 * The kernel will do a ->function(->data) callback from the
A
Andrzej Zaborowski 已提交
136
 * timer interrupt at the ->expires point in the future. The
L
Linus Torvalds 已提交
137 138
 * current time is 'jiffies'.
 *
A
Andrzej Zaborowski 已提交
139
 * The timer's ->expires, ->function (and if the handler uses it, ->data)
L
Linus Torvalds 已提交
140 141
 * fields must be set prior calling this function.
 *
A
Andrzej Zaborowski 已提交
142
 * Timers with an ->expires field in the past will be executed in the next
L
Linus Torvalds 已提交
143 144
 * timer tick.
 */
145
static inline void add_timer(struct timer_list *timer)
L
Linus Torvalds 已提交
146
{
147
	BUG_ON(timer_pending(timer));
L
Linus Torvalds 已提交
148 149 150 151
	__mod_timer(timer, timer->expires);
}

#ifdef CONFIG_SMP
152
  extern int try_to_del_timer_sync(struct timer_list *timer);
L
Linus Torvalds 已提交
153 154
  extern int del_timer_sync(struct timer_list *timer);
#else
155 156
# define try_to_del_timer_sync(t)	del_timer(t)
# define del_timer_sync(t)		del_timer(t)
L
Linus Torvalds 已提交
157 158
#endif

159 160
#define del_singleshot_timer_sync(t) del_timer_sync(t)

L
Linus Torvalds 已提交
161 162
extern void init_timers(void);
extern void run_local_timers(void);
163
struct hrtimer;
164
extern enum hrtimer_restart it_real_fn(struct hrtimer *);
L
Linus Torvalds 已提交
165

166 167 168 169 170 171
unsigned long __round_jiffies(unsigned long j, int cpu);
unsigned long __round_jiffies_relative(unsigned long j, int cpu);
unsigned long round_jiffies(unsigned long j);
unsigned long round_jiffies_relative(unsigned long j);


L
Linus Torvalds 已提交
172
#endif