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
#include <linux/stddef.h>

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

struct timer_list {
	struct list_head entry;
	unsigned long expires;

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

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

25
extern struct tvec_t_base_s boot_tvec_bases;
26

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

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

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

41 42 43 44 45 46 47 48 49
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);
}

50
/**
L
Linus Torvalds 已提交
51 52 53 54 55 56 57 58 59 60 61
 * 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)
{
62
	return timer->entry.next != NULL;
L
Linus Torvalds 已提交
63 64 65 66 67 68 69
}

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);

70 71 72 73 74 75
/*
 * The jiffies value which is added to now, when there is no timer
 * in the timer wheel:
 */
#define NEXT_TIMER_MAX_DELTA	((1UL << 30) - 1)

76 77 78 79
/*
 * Return when the next timer-wheel timeout occurs (in absolute jiffies),
 * locks the timer base:
 */
L
Linus Torvalds 已提交
80
extern unsigned long next_timer_interrupt(void);
81 82 83 84 85 86
/*
 * 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 已提交
87

88 89 90 91 92
/*
 * Timer-statistics info:
 */
#ifdef CONFIG_TIMER_STATS

93 94
#define TIMER_STATS_FLAG_DEFERRABLE	0x1

95 96 97
extern void init_timer_stats(void);

extern void timer_stats_update_stats(void *timer, pid_t pid, void *startf,
98 99
				     void *timerf, char *comm,
				     unsigned int timer_flag);
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

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_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);

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

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

157 158
#define del_singleshot_timer_sync(t) del_timer_sync(t)

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

164 165 166 167 168 169
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 已提交
170
#endif