Blame view

include/linux/workqueue.h 12.4 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
10
  /*
   * workqueue.h --- work queue handling for Linux.
   */
  
  #ifndef _LINUX_WORKQUEUE_H
  #define _LINUX_WORKQUEUE_H
  
  #include <linux/timer.h>
  #include <linux/linkage.h>
  #include <linux/bitops.h>
4e6045f13   Johannes Berg   workqueue: debug ...
11
  #include <linux/lockdep.h>
7a22ad757   Tejun Heo   workqueue: carry ...
12
  #include <linux/threads.h>
a08727bae   Linus Torvalds   Make workqueue bi...
13
  #include <asm/atomic.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
14
15
  
  struct workqueue_struct;
65f27f384   David Howells   WorkStruct: Pass ...
16
17
  struct work_struct;
  typedef void (*work_func_t)(struct work_struct *work);
6bb49e596   David Howells   WorkStruct: Typed...
18

a08727bae   Linus Torvalds   Make workqueue bi...
19
20
21
22
23
  /*
   * The first word is the work queue pointer and the flags rolled into
   * one
   */
  #define work_data_bits(work) ((unsigned long *)(&(work)->data))
22df02bb3   Tejun Heo   workqueue: define...
24
25
  enum {
  	WORK_STRUCT_PENDING_BIT	= 0,	/* work item is pending execution */
8a2e8e5de   Tejun Heo   workqueue: fix cw...
26
27
28
  	WORK_STRUCT_DELAYED_BIT	= 1,	/* work item is delayed */
  	WORK_STRUCT_CWQ_BIT	= 2,	/* data points to cwq */
  	WORK_STRUCT_LINKED_BIT	= 3,	/* next work is linked to this one */
22df02bb3   Tejun Heo   workqueue: define...
29
  #ifdef CONFIG_DEBUG_OBJECTS_WORK
8a2e8e5de   Tejun Heo   workqueue: fix cw...
30
31
  	WORK_STRUCT_STATIC_BIT	= 4,	/* static initializer (debugobjects) */
  	WORK_STRUCT_COLOR_SHIFT	= 5,	/* color for workqueue flushing */
0f900049c   Tejun Heo   workqueue: update...
32
  #else
8a2e8e5de   Tejun Heo   workqueue: fix cw...
33
  	WORK_STRUCT_COLOR_SHIFT	= 4,	/* color for workqueue flushing */
22df02bb3   Tejun Heo   workqueue: define...
34
  #endif
73f53c4aa   Tejun Heo   workqueue: reimpl...
35
  	WORK_STRUCT_COLOR_BITS	= 4,
22df02bb3   Tejun Heo   workqueue: define...
36
  	WORK_STRUCT_PENDING	= 1 << WORK_STRUCT_PENDING_BIT,
8a2e8e5de   Tejun Heo   workqueue: fix cw...
37
  	WORK_STRUCT_DELAYED	= 1 << WORK_STRUCT_DELAYED_BIT,
e120153dd   Tejun Heo   workqueue: fix ho...
38
  	WORK_STRUCT_CWQ		= 1 << WORK_STRUCT_CWQ_BIT,
affee4b29   Tejun Heo   workqueue: reimpl...
39
  	WORK_STRUCT_LINKED	= 1 << WORK_STRUCT_LINKED_BIT,
22df02bb3   Tejun Heo   workqueue: define...
40
41
42
43
44
  #ifdef CONFIG_DEBUG_OBJECTS_WORK
  	WORK_STRUCT_STATIC	= 1 << WORK_STRUCT_STATIC_BIT,
  #else
  	WORK_STRUCT_STATIC	= 0,
  #endif
73f53c4aa   Tejun Heo   workqueue: reimpl...
45
46
47
48
49
50
  	/*
  	 * The last color is no color used for works which don't
  	 * participate in workqueue flushing.
  	 */
  	WORK_NR_COLORS		= (1 << WORK_STRUCT_COLOR_BITS) - 1,
  	WORK_NO_COLOR		= WORK_NR_COLORS,
bdbc5dd7d   Tejun Heo   workqueue: prepar...
51
  	/* special cpu IDs */
f34217977   Tejun Heo   workqueue: implem...
52
53
  	WORK_CPU_UNBOUND	= NR_CPUS,
  	WORK_CPU_NONE		= NR_CPUS + 1,
bdbc5dd7d   Tejun Heo   workqueue: prepar...
54
  	WORK_CPU_LAST		= WORK_CPU_NONE,
73f53c4aa   Tejun Heo   workqueue: reimpl...
55
  	/*
e120153dd   Tejun Heo   workqueue: fix ho...
56
  	 * Reserve 7 bits off of cwq pointer w/ debugobjects turned
8a2e8e5de   Tejun Heo   workqueue: fix cw...
57
58
  	 * off.  This makes cwqs aligned to 256 bytes and allows 15
  	 * workqueue flush colors.
73f53c4aa   Tejun Heo   workqueue: reimpl...
59
60
61
  	 */
  	WORK_STRUCT_FLAG_BITS	= WORK_STRUCT_COLOR_SHIFT +
  				  WORK_STRUCT_COLOR_BITS,
0f900049c   Tejun Heo   workqueue: update...
62
  	WORK_STRUCT_FLAG_MASK	= (1UL << WORK_STRUCT_FLAG_BITS) - 1,
22df02bb3   Tejun Heo   workqueue: define...
63
  	WORK_STRUCT_WQ_DATA_MASK = ~WORK_STRUCT_FLAG_MASK,
bdbc5dd7d   Tejun Heo   workqueue: prepar...
64
  	WORK_STRUCT_NO_CPU	= WORK_CPU_NONE << WORK_STRUCT_FLAG_BITS,
dcd989cb7   Tejun Heo   workqueue: implem...
65
66
67
68
  
  	/* bit mask for work_busy() return values */
  	WORK_BUSY_PENDING	= 1 << 0,
  	WORK_BUSY_RUNNING	= 1 << 1,
22df02bb3   Tejun Heo   workqueue: define...
69
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
70
  struct work_struct {
a08727bae   Linus Torvalds   Make workqueue bi...
71
  	atomic_long_t data;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
72
  	struct list_head entry;
6bb49e596   David Howells   WorkStruct: Typed...
73
  	work_func_t func;
4e6045f13   Johannes Berg   workqueue: debug ...
74
75
76
  #ifdef CONFIG_LOCKDEP
  	struct lockdep_map lockdep_map;
  #endif
52bad64d9   David Howells   WorkStruct: Separ...
77
  };
7a22ad757   Tejun Heo   workqueue: carry ...
78
79
80
  #define WORK_DATA_INIT()	ATOMIC_LONG_INIT(WORK_STRUCT_NO_CPU)
  #define WORK_DATA_STATIC_INIT()	\
  	ATOMIC_LONG_INIT(WORK_STRUCT_NO_CPU | WORK_STRUCT_STATIC)
a08727bae   Linus Torvalds   Make workqueue bi...
81

52bad64d9   David Howells   WorkStruct: Separ...
82
83
  struct delayed_work {
  	struct work_struct work;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
84
85
  	struct timer_list timer;
  };
bf6aede71   Jean Delvare   workqueue: add to...
86
87
88
89
  static inline struct delayed_work *to_delayed_work(struct work_struct *work)
  {
  	return container_of(work, struct delayed_work, work);
  }
1fa44ecad   James Bottomley   [SCSI] add execut...
90
91
92
  struct execute_work {
  	struct work_struct work;
  };
4e6045f13   Johannes Berg   workqueue: debug ...
93
94
95
96
97
98
99
100
101
102
103
  #ifdef CONFIG_LOCKDEP
  /*
   * NB: because we have to copy the lockdep_map, setting _key
   * here is required, otherwise it could get initialised to the
   * copy of the lockdep_map!
   */
  #define __WORK_INIT_LOCKDEP_MAP(n, k) \
  	.lockdep_map = STATIC_LOCKDEP_MAP_INIT(n, k),
  #else
  #define __WORK_INIT_LOCKDEP_MAP(n, k)
  #endif
65f27f384   David Howells   WorkStruct: Pass ...
104
  #define __WORK_INITIALIZER(n, f) {				\
dc186ad74   Thomas Gleixner   workqueue: Add de...
105
  	.data = WORK_DATA_STATIC_INIT(),			\
23b2e5991   Oleg Nesterov   workqueue: kill N...
106
  	.entry	= { &(n).entry, &(n).entry },			\
65f27f384   David Howells   WorkStruct: Pass ...
107
  	.func = (f),						\
4e6045f13   Johannes Berg   workqueue: debug ...
108
  	__WORK_INIT_LOCKDEP_MAP(#n, &(n))			\
65f27f384   David Howells   WorkStruct: Pass ...
109
110
111
112
113
114
  	}
  
  #define __DELAYED_WORK_INITIALIZER(n, f) {			\
  	.work = __WORK_INITIALIZER((n).work, (f)),		\
  	.timer = TIMER_INITIALIZER(NULL, 0, 0),			\
  	}
dd6414b50   Phil Carmody   timer: Permit sta...
115
116
117
118
  #define __DEFERRED_WORK_INITIALIZER(n, f) {			\
  	.work = __WORK_INITIALIZER((n).work, (f)),		\
  	.timer = TIMER_DEFERRED_INITIALIZER(NULL, 0, 0),	\
  	}
65f27f384   David Howells   WorkStruct: Pass ...
119
120
  #define DECLARE_WORK(n, f)					\
  	struct work_struct n = __WORK_INITIALIZER(n, f)
65f27f384   David Howells   WorkStruct: Pass ...
121
122
  #define DECLARE_DELAYED_WORK(n, f)				\
  	struct delayed_work n = __DELAYED_WORK_INITIALIZER(n, f)
dd6414b50   Phil Carmody   timer: Permit sta...
123
124
  #define DECLARE_DEFERRED_WORK(n, f)				\
  	struct delayed_work n = __DEFERRED_WORK_INITIALIZER(n, f)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
125
  /*
65f27f384   David Howells   WorkStruct: Pass ...
126
   * initialize a work item's function pointer
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
127
   */
65f27f384   David Howells   WorkStruct: Pass ...
128
  #define PREPARE_WORK(_work, _func)				\
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
129
  	do {							\
52bad64d9   David Howells   WorkStruct: Separ...
130
  		(_work)->func = (_func);			\
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
131
  	} while (0)
65f27f384   David Howells   WorkStruct: Pass ...
132
133
  #define PREPARE_DELAYED_WORK(_work, _func)			\
  	PREPARE_WORK(&(_work)->work, (_func))
52bad64d9   David Howells   WorkStruct: Separ...
134

dc186ad74   Thomas Gleixner   workqueue: Add de...
135
136
137
  #ifdef CONFIG_DEBUG_OBJECTS_WORK
  extern void __init_work(struct work_struct *work, int onstack);
  extern void destroy_work_on_stack(struct work_struct *work);
4690c4ab5   Tejun Heo   workqueue: misc/c...
138
139
  static inline unsigned int work_static(struct work_struct *work)
  {
22df02bb3   Tejun Heo   workqueue: define...
140
  	return *work_data_bits(work) & WORK_STRUCT_STATIC;
4690c4ab5   Tejun Heo   workqueue: misc/c...
141
  }
dc186ad74   Thomas Gleixner   workqueue: Add de...
142
143
144
  #else
  static inline void __init_work(struct work_struct *work, int onstack) { }
  static inline void destroy_work_on_stack(struct work_struct *work) { }
4690c4ab5   Tejun Heo   workqueue: misc/c...
145
  static inline unsigned int work_static(struct work_struct *work) { return 0; }
dc186ad74   Thomas Gleixner   workqueue: Add de...
146
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
147
  /*
52bad64d9   David Howells   WorkStruct: Separ...
148
   * initialize all of a work item in one go
a08727bae   Linus Torvalds   Make workqueue bi...
149
   *
b9049df5a   Dmitri Vorobiev   Change "useing" -...
150
   * NOTE! No point in using "atomic_long_set()": using a direct
a08727bae   Linus Torvalds   Make workqueue bi...
151
152
   * assignment of the work data initializer allows the compiler
   * to generate better code.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
153
   */
4e6045f13   Johannes Berg   workqueue: debug ...
154
  #ifdef CONFIG_LOCKDEP
dc186ad74   Thomas Gleixner   workqueue: Add de...
155
  #define __INIT_WORK(_work, _func, _onstack)				\
65f27f384   David Howells   WorkStruct: Pass ...
156
  	do {								\
4e6045f13   Johannes Berg   workqueue: debug ...
157
158
  		static struct lock_class_key __key;			\
  									\
dc186ad74   Thomas Gleixner   workqueue: Add de...
159
  		__init_work((_work), _onstack);				\
23b2e5991   Oleg Nesterov   workqueue: kill N...
160
  		(_work)->data = (atomic_long_t) WORK_DATA_INIT();	\
4e6045f13   Johannes Berg   workqueue: debug ...
161
  		lockdep_init_map(&(_work)->lockdep_map, #_work, &__key, 0);\
65f27f384   David Howells   WorkStruct: Pass ...
162
163
164
  		INIT_LIST_HEAD(&(_work)->entry);			\
  		PREPARE_WORK((_work), (_func));				\
  	} while (0)
4e6045f13   Johannes Berg   workqueue: debug ...
165
  #else
dc186ad74   Thomas Gleixner   workqueue: Add de...
166
  #define __INIT_WORK(_work, _func, _onstack)				\
4e6045f13   Johannes Berg   workqueue: debug ...
167
  	do {								\
dc186ad74   Thomas Gleixner   workqueue: Add de...
168
  		__init_work((_work), _onstack);				\
4e6045f13   Johannes Berg   workqueue: debug ...
169
170
171
172
173
  		(_work)->data = (atomic_long_t) WORK_DATA_INIT();	\
  		INIT_LIST_HEAD(&(_work)->entry);			\
  		PREPARE_WORK((_work), (_func));				\
  	} while (0)
  #endif
65f27f384   David Howells   WorkStruct: Pass ...
174

dc186ad74   Thomas Gleixner   workqueue: Add de...
175
176
177
178
179
180
181
182
183
  #define INIT_WORK(_work, _func)					\
  	do {							\
  		__INIT_WORK((_work), (_func), 0);		\
  	} while (0)
  
  #define INIT_WORK_ON_STACK(_work, _func)			\
  	do {							\
  		__INIT_WORK((_work), (_func), 1);		\
  	} while (0)
65f27f384   David Howells   WorkStruct: Pass ...
184
185
186
187
  #define INIT_DELAYED_WORK(_work, _func)				\
  	do {							\
  		INIT_WORK(&(_work)->work, (_func));		\
  		init_timer(&(_work)->timer);			\
52bad64d9   David Howells   WorkStruct: Separ...
188
  	} while (0)
6d612b0f9   Peter Zijlstra   locking, hpet: an...
189
190
  #define INIT_DELAYED_WORK_ON_STACK(_work, _func)		\
  	do {							\
dc186ad74   Thomas Gleixner   workqueue: Add de...
191
  		INIT_WORK_ON_STACK(&(_work)->work, (_func));	\
6d612b0f9   Peter Zijlstra   locking, hpet: an...
192
193
  		init_timer_on_stack(&(_work)->timer);		\
  	} while (0)
dc186ad74   Thomas Gleixner   workqueue: Add de...
194
  #define INIT_DELAYED_WORK_DEFERRABLE(_work, _func)		\
28287033e   Venki Pallipadi   Add a new deferra...
195
196
197
198
  	do {							\
  		INIT_WORK(&(_work)->work, (_func));		\
  		init_timer_deferrable(&(_work)->timer);		\
  	} while (0)
365970a1e   David Howells   WorkStruct: Merge...
199
200
201
202
203
  /**
   * work_pending - Find out whether a work item is currently pending
   * @work: The work item in question
   */
  #define work_pending(work) \
22df02bb3   Tejun Heo   workqueue: define...
204
  	test_bit(WORK_STRUCT_PENDING_BIT, work_data_bits(work))
365970a1e   David Howells   WorkStruct: Merge...
205
206
207
208
209
210
  
  /**
   * delayed_work_pending - Find out whether a delayable work item is currently
   * pending
   * @work: The work item in question
   */
0221872a3   Linus Torvalds   Fix "delayed_work...
211
212
  #define delayed_work_pending(w) \
  	work_pending(&(w)->work)
365970a1e   David Howells   WorkStruct: Merge...
213

65f27f384   David Howells   WorkStruct: Pass ...
214
  /**
23b2e5991   Oleg Nesterov   workqueue: kill N...
215
216
   * work_clear_pending - for internal use only, mark a work item as not pending
   * @work: The work item in question
65f27f384   David Howells   WorkStruct: Pass ...
217
   */
23b2e5991   Oleg Nesterov   workqueue: kill N...
218
  #define work_clear_pending(work) \
22df02bb3   Tejun Heo   workqueue: define...
219
  	clear_bit(WORK_STRUCT_PENDING_BIT, work_data_bits(work))
65f27f384   David Howells   WorkStruct: Pass ...
220

97e37d7b9   Tejun Heo   workqueue: merge ...
221
  enum {
bdbc5dd7d   Tejun Heo   workqueue: prepar...
222
  	WQ_NON_REENTRANT	= 1 << 0, /* guarantee non-reentrance */
c7fc77f78   Tejun Heo   workqueue: remove...
223
  	WQ_UNBOUND		= 1 << 1, /* not bound to any cpu */
bdbc5dd7d   Tejun Heo   workqueue: prepar...
224
  	WQ_FREEZEABLE		= 1 << 2, /* freeze during suspend */
e22bee782   Tejun Heo   workqueue: implem...
225
  	WQ_RESCUER		= 1 << 3, /* has an rescue worker */
649027d73   Tejun Heo   workqueue: implem...
226
  	WQ_HIGHPRI		= 1 << 4, /* high priority */
fb0e7beb5   Tejun Heo   workqueue: implem...
227
  	WQ_CPU_INTENSIVE	= 1 << 5, /* cpu instensive workqueue */
b71ab8c20   Tejun Heo   workqueue: increa...
228

e41e704bc   Tejun Heo   workqueue: improv...
229
  	WQ_DYING		= 1 << 6, /* internal: workqueue is dying */
b71ab8c20   Tejun Heo   workqueue: increa...
230
  	WQ_MAX_ACTIVE		= 512,	  /* I like 512, better ideas? */
f34217977   Tejun Heo   workqueue: implem...
231
  	WQ_MAX_UNBOUND_PER_CPU	= 4,	  /* 4 * #cpus for unbound wq */
b71ab8c20   Tejun Heo   workqueue: increa...
232
  	WQ_DFL_ACTIVE		= WQ_MAX_ACTIVE / 2,
97e37d7b9   Tejun Heo   workqueue: merge ...
233
  };
52bad64d9   David Howells   WorkStruct: Separ...
234

f34217977   Tejun Heo   workqueue: implem...
235
236
237
  /* unbound wq's aren't per-cpu, scale max_active according to #cpus */
  #define WQ_UNBOUND_MAX_ACTIVE	\
  	max_t(int, WQ_MAX_ACTIVE, num_possible_cpus() * WQ_MAX_UNBOUND_PER_CPU)
65f27f384   David Howells   WorkStruct: Pass ...
238

d320c0383   Tejun Heo   workqueue: s/__cr...
239
240
241
242
243
244
245
246
247
248
249
250
251
252
  /*
   * System-wide workqueues which are always present.
   *
   * system_wq is the one used by schedule[_delayed]_work[_on]().
   * Multi-CPU multi-threaded.  There are users which expect relatively
   * short queue flush time.  Don't queue works which can run for too
   * long.
   *
   * system_long_wq is similar to system_wq but may host long running
   * works.  Queue flushing might take relatively long.
   *
   * system_nrt_wq is non-reentrant and guarantees that any given work
   * item is never executed in parallel by multiple CPUs.  Queue
   * flushing might take relatively long.
f34217977   Tejun Heo   workqueue: implem...
253
254
255
256
257
   *
   * system_unbound_wq is unbound workqueue.  Workers are not bound to
   * any specific CPU, not concurrency managed, and all queued works are
   * executed immediately as long as max_active limit is not reached and
   * resources are available.
d320c0383   Tejun Heo   workqueue: s/__cr...
258
259
260
261
   */
  extern struct workqueue_struct *system_wq;
  extern struct workqueue_struct *system_long_wq;
  extern struct workqueue_struct *system_nrt_wq;
f34217977   Tejun Heo   workqueue: implem...
262
  extern struct workqueue_struct *system_unbound_wq;
52bad64d9   David Howells   WorkStruct: Separ...
263

4e6045f13   Johannes Berg   workqueue: debug ...
264
  extern struct workqueue_struct *
d320c0383   Tejun Heo   workqueue: s/__cr...
265
266
  __alloc_workqueue_key(const char *name, unsigned int flags, int max_active,
  		      struct lock_class_key *key, const char *lock_name);
4e6045f13   Johannes Berg   workqueue: debug ...
267
268
  
  #ifdef CONFIG_LOCKDEP
d320c0383   Tejun Heo   workqueue: s/__cr...
269
  #define alloc_workqueue(name, flags, max_active)		\
4e6045f13   Johannes Berg   workqueue: debug ...
270
271
  ({								\
  	static struct lock_class_key __key;			\
eb13ba873   Johannes Berg   lockdep: fix work...
272
273
274
275
276
277
  	const char *__lock_name;				\
  								\
  	if (__builtin_constant_p(name))				\
  		__lock_name = (name);				\
  	else							\
  		__lock_name = #name;				\
4e6045f13   Johannes Berg   workqueue: debug ...
278
  								\
d320c0383   Tejun Heo   workqueue: s/__cr...
279
280
  	__alloc_workqueue_key((name), (flags), (max_active),	\
  			      &__key, __lock_name);		\
4e6045f13   Johannes Berg   workqueue: debug ...
281
282
  })
  #else
d320c0383   Tejun Heo   workqueue: s/__cr...
283
284
  #define alloc_workqueue(name, flags, max_active)		\
  	__alloc_workqueue_key((name), (flags), (max_active), NULL, NULL)
4e6045f13   Johannes Berg   workqueue: debug ...
285
  #endif
97e37d7b9   Tejun Heo   workqueue: merge ...
286
  #define create_workqueue(name)					\
d320c0383   Tejun Heo   workqueue: s/__cr...
287
  	alloc_workqueue((name), WQ_RESCUER, 1)
97e37d7b9   Tejun Heo   workqueue: merge ...
288
  #define create_freezeable_workqueue(name)			\
c7fc77f78   Tejun Heo   workqueue: remove...
289
  	alloc_workqueue((name), WQ_FREEZEABLE | WQ_UNBOUND | WQ_RESCUER, 1)
97e37d7b9   Tejun Heo   workqueue: merge ...
290
  #define create_singlethread_workqueue(name)			\
c7fc77f78   Tejun Heo   workqueue: remove...
291
  	alloc_workqueue((name), WQ_UNBOUND | WQ_RESCUER, 1)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
292
293
  
  extern void destroy_workqueue(struct workqueue_struct *wq);
b3c975286   Harvey Harrison   include/linux: Re...
294
  extern int queue_work(struct workqueue_struct *wq, struct work_struct *work);
c1a220e7a   Zhang Rui   pm: introduce new...
295
296
  extern int queue_work_on(int cpu, struct workqueue_struct *wq,
  			struct work_struct *work);
b3c975286   Harvey Harrison   include/linux: Re...
297
298
  extern int queue_delayed_work(struct workqueue_struct *wq,
  			struct delayed_work *work, unsigned long delay);
7a6bc1cdd   Venkatesh Pallipadi   [CPUFREQ] Add que...
299
  extern int queue_delayed_work_on(int cpu, struct workqueue_struct *wq,
28e53bddf   Oleg Nesterov   unify flush_work/...
300
  			struct delayed_work *work, unsigned long delay);
b3c975286   Harvey Harrison   include/linux: Re...
301
  extern void flush_workqueue(struct workqueue_struct *wq);
28e53bddf   Oleg Nesterov   unify flush_work/...
302
  extern void flush_scheduled_work(void);
43046b606   Linus Torvalds   workqueue: add 'f...
303
  extern void flush_delayed_work(struct delayed_work *work);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
304

b3c975286   Harvey Harrison   include/linux: Re...
305
  extern int schedule_work(struct work_struct *work);
c1a220e7a   Zhang Rui   pm: introduce new...
306
  extern int schedule_work_on(int cpu, struct work_struct *work);
b3c975286   Harvey Harrison   include/linux: Re...
307
  extern int schedule_delayed_work(struct delayed_work *work, unsigned long delay);
28e53bddf   Oleg Nesterov   unify flush_work/...
308
309
  extern int schedule_delayed_work_on(int cpu, struct delayed_work *work,
  					unsigned long delay);
65f27f384   David Howells   WorkStruct: Pass ...
310
  extern int schedule_on_each_cpu(work_func_t func);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
311
  extern int keventd_up(void);
65f27f384   David Howells   WorkStruct: Pass ...
312
  int execute_in_process_context(work_func_t fn, struct execute_work *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
313

db7008972   Oleg Nesterov   workqueues: imple...
314
  extern int flush_work(struct work_struct *work);
1f1f642e2   Oleg Nesterov   make cancel_xxx_w...
315
  extern int cancel_work_sync(struct work_struct *work);
28e53bddf   Oleg Nesterov   unify flush_work/...
316

dcd989cb7   Tejun Heo   workqueue: implem...
317
318
319
320
321
  extern void workqueue_set_max_active(struct workqueue_struct *wq,
  				     int max_active);
  extern bool workqueue_congested(unsigned int cpu, struct workqueue_struct *wq);
  extern unsigned int work_cpu(struct work_struct *work);
  extern unsigned int work_busy(struct work_struct *work);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
322
323
  /*
   * Kill off a pending schedule_delayed_work().  Note that the work callback
071b63868   Oleg Nesterov   [WORKQUEUE]: canc...
324
325
   * function may still be running on return from cancel_delayed_work(), unless
   * it returns 1 and the work doesn't re-arm itself. Run flush_workqueue() or
28e53bddf   Oleg Nesterov   unify flush_work/...
326
   * cancel_work_sync() to wait on it.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
327
   */
52bad64d9   David Howells   WorkStruct: Separ...
328
  static inline int cancel_delayed_work(struct delayed_work *work)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
329
330
  {
  	int ret;
223a10a98   Oleg Nesterov   revert "cancel_de...
331
  	ret = del_timer_sync(&work->timer);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
332
  	if (ret)
23b2e5991   Oleg Nesterov   workqueue: kill N...
333
  		work_clear_pending(&work->work);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
334
335
  	return ret;
  }
4e49627b9   Oleg Nesterov   workqueues: intro...
336
337
338
339
340
341
342
343
344
345
346
347
348
349
  /*
   * Like above, but uses del_timer() instead of del_timer_sync(). This means,
   * if it returns 0 the timer function may be running and the queueing is in
   * progress.
   */
  static inline int __cancel_delayed_work(struct delayed_work *work)
  {
  	int ret;
  
  	ret = del_timer(&work->timer);
  	if (ret)
  		work_clear_pending(&work->work);
  	return ret;
  }
1f1f642e2   Oleg Nesterov   make cancel_xxx_w...
350
  extern int cancel_delayed_work_sync(struct delayed_work *work);
1634c48f8   Oleg Nesterov   make cancel_rearm...
351

f5a421a45   Oleg Nesterov   rename cancel_rea...
352
  /* Obsolete. use cancel_delayed_work_sync() */
1634c48f8   Oleg Nesterov   make cancel_rearm...
353
354
355
356
  static inline
  void cancel_rearming_delayed_workqueue(struct workqueue_struct *wq,
  					struct delayed_work *work)
  {
f5a421a45   Oleg Nesterov   rename cancel_rea...
357
358
359
360
361
362
363
364
  	cancel_delayed_work_sync(work);
  }
  
  /* Obsolete. use cancel_delayed_work_sync() */
  static inline
  void cancel_rearming_delayed_work(struct delayed_work *work)
  {
  	cancel_delayed_work_sync(work);
1634c48f8   Oleg Nesterov   make cancel_rearm...
365
  }
2d3854a37   Rusty Russell   cpumask: introduc...
366
367
368
369
370
371
372
373
  #ifndef CONFIG_SMP
  static inline long work_on_cpu(unsigned int cpu, long (*fn)(void *), void *arg)
  {
  	return fn(arg);
  }
  #else
  long work_on_cpu(unsigned int cpu, long (*fn)(void *), void *arg);
  #endif /* CONFIG_SMP */
a25909a4d   Paul E. McKenney   lockdep: Add an i...
374

a0a1a5fd4   Tejun Heo   workqueue: reimpl...
375
376
377
378
379
  #ifdef CONFIG_FREEZER
  extern void freeze_workqueues_begin(void);
  extern bool freeze_workqueues_busy(void);
  extern void thaw_workqueues(void);
  #endif /* CONFIG_FREEZER */
a25909a4d   Paul E. McKenney   lockdep: Add an i...
380
381
382
  #ifdef CONFIG_LOCKDEP
  int in_workqueue_context(struct workqueue_struct *wq);
  #endif
3b7433b8a   Linus Torvalds   Merge branch 'for...
383

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
384
  #endif