timer.h 4.38 KB
Newer Older
Linus Torvalds's avatar
Linus Torvalds committed
1 2 3 4
#ifndef _LINUX_TIMER_H
#define _LINUX_TIMER_H

#include <linux/list.h>
5
#include <linux/ktime.h>
Linus Torvalds's avatar
Linus Torvalds committed
6 7
#include <linux/stddef.h>

8
struct tvec_t_base_s;
Linus Torvalds's avatar
Linus Torvalds committed
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
Linus Torvalds's avatar
Linus Torvalds committed
23 24
};

25
extern struct tvec_t_base_s boot_tvec_bases;
26

Linus Torvalds's avatar
Linus Torvalds committed
27 28 29 30
#define TIMER_INITIALIZER(_function, _expires, _data) {		\
		.function = (_function),			\
		.expires = (_expires),				\
		.data = (_data),				\
31
		.base = &boot_tvec_bases,			\
Linus Torvalds's avatar
Linus Torvalds committed
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);
Linus Torvalds's avatar
Linus Torvalds committed
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
/**
Linus Torvalds's avatar
Linus Torvalds committed
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;
Linus Torvalds's avatar
Linus Torvalds committed
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:
 */
Linus Torvalds's avatar
Linus Torvalds committed
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);
Linus Torvalds's avatar
Linus Torvalds committed
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
/**
Linus Torvalds's avatar
Linus Torvalds committed
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
Andrzej Zaborowski's avatar
Andrzej Zaborowski committed
134
 * timer interrupt at the ->expires point in the future. The
Linus Torvalds's avatar
Linus Torvalds committed
135 136
 * current time is 'jiffies'.
 *
Andrzej Zaborowski's avatar
Andrzej Zaborowski committed
137
 * The timer's ->expires, ->function (and if the handler uses it, ->data)
Linus Torvalds's avatar
Linus Torvalds committed
138 139
 * fields must be set prior calling this function.
 *
Andrzej Zaborowski's avatar
Andrzej Zaborowski committed
140
 * Timers with an ->expires field in the past will be executed in the next
Linus Torvalds's avatar
Linus Torvalds committed
141 142
 * timer tick.
 */
143
static inline void add_timer(struct timer_list *timer)
Linus Torvalds's avatar
Linus Torvalds committed
144
{
145
	BUG_ON(timer_pending(timer));
Linus Torvalds's avatar
Linus Torvalds committed
146 147 148 149
	__mod_timer(timer, timer->expires);
}

#ifdef CONFIG_SMP
150
  extern int try_to_del_timer_sync(struct timer_list *timer);
Linus Torvalds's avatar
Linus Torvalds committed
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)
Linus Torvalds's avatar
Linus Torvalds committed
155 156
#endif

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

Linus Torvalds's avatar
Linus Torvalds committed
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 *);
Linus Torvalds's avatar
Linus Torvalds committed
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);


Linus Torvalds's avatar
Linus Torvalds committed
170
#endif