Blame view

include/linux/workqueue.h 13 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>
60063497a   Arun Sharma   atomic: use <linu...
13
  #include <linux/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
  #define INIT_WORK(_work, _func)					\
  	do {							\
  		__INIT_WORK((_work), (_func), 0);		\
  	} while (0)
ca1cab37d   Andrew Morton   workqueues: s/ON_...
179
  #define INIT_WORK_ONSTACK(_work, _func)				\
dc186ad74   Thomas Gleixner   workqueue: Add de...
180
181
182
  	do {							\
  		__INIT_WORK((_work), (_func), 1);		\
  	} while (0)
65f27f384   David Howells   WorkStruct: Pass ...
183
184
185
186
  #define INIT_DELAYED_WORK(_work, _func)				\
  	do {							\
  		INIT_WORK(&(_work)->work, (_func));		\
  		init_timer(&(_work)->timer);			\
52bad64d9   David Howells   WorkStruct: Separ...
187
  	} while (0)
ca1cab37d   Andrew Morton   workqueues: s/ON_...
188
  #define INIT_DELAYED_WORK_ONSTACK(_work, _func)			\
6d612b0f9   Peter Zijlstra   locking, hpet: an...
189
  	do {							\
ca1cab37d   Andrew Morton   workqueues: s/ON_...
190
  		INIT_WORK_ONSTACK(&(_work)->work, (_func));	\
6d612b0f9   Peter Zijlstra   locking, hpet: an...
191
192
  		init_timer_on_stack(&(_work)->timer);		\
  	} while (0)
dc186ad74   Thomas Gleixner   workqueue: Add de...
193
  #define INIT_DELAYED_WORK_DEFERRABLE(_work, _func)		\
28287033e   Venki Pallipadi   Add a new deferra...
194
195
196
197
  	do {							\
  		INIT_WORK(&(_work)->work, (_func));		\
  		init_timer_deferrable(&(_work)->timer);		\
  	} while (0)
365970a1e   David Howells   WorkStruct: Merge...
198
199
200
201
202
  /**
   * 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...
203
  	test_bit(WORK_STRUCT_PENDING_BIT, work_data_bits(work))
365970a1e   David Howells   WorkStruct: Merge...
204
205
206
207
208
209
  
  /**
   * 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...
210
211
  #define delayed_work_pending(w) \
  	work_pending(&(w)->work)
365970a1e   David Howells   WorkStruct: Merge...
212

65f27f384   David Howells   WorkStruct: Pass ...
213
  /**
23b2e5991   Oleg Nesterov   workqueue: kill N...
214
215
   * 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 ...
216
   */
23b2e5991   Oleg Nesterov   workqueue: kill N...
217
  #define work_clear_pending(work) \
22df02bb3   Tejun Heo   workqueue: define...
218
  	clear_bit(WORK_STRUCT_PENDING_BIT, work_data_bits(work))
65f27f384   David Howells   WorkStruct: Pass ...
219

c54fce6ef   Tejun Heo   workqueue: add do...
220
221
222
223
  /*
   * Workqueue flags and constants.  For details, please refer to
   * Documentation/workqueue.txt.
   */
97e37d7b9   Tejun Heo   workqueue: merge ...
224
  enum {
bdbc5dd7d   Tejun Heo   workqueue: prepar...
225
  	WQ_NON_REENTRANT	= 1 << 0, /* guarantee non-reentrance */
c7fc77f78   Tejun Heo   workqueue: remove...
226
  	WQ_UNBOUND		= 1 << 1, /* not bound to any cpu */
58a69cb47   Tejun Heo   workqueue, freeze...
227
  	WQ_FREEZABLE		= 1 << 2, /* freeze during suspend */
6370a6ad3   Tejun Heo   workqueue: add an...
228
  	WQ_MEM_RECLAIM		= 1 << 3, /* may be used for memory reclaim */
649027d73   Tejun Heo   workqueue: implem...
229
  	WQ_HIGHPRI		= 1 << 4, /* high priority */
fb0e7beb5   Tejun Heo   workqueue: implem...
230
  	WQ_CPU_INTENSIVE	= 1 << 5, /* cpu instensive workqueue */
b71ab8c20   Tejun Heo   workqueue: increa...
231

9c5a2ba70   Tejun Heo   workqueue: separa...
232
  	WQ_DRAINING		= 1 << 6, /* internal: workqueue is draining */
6370a6ad3   Tejun Heo   workqueue: add an...
233
  	WQ_RESCUER		= 1 << 7, /* internal: workqueue has rescuer */
e41e704bc   Tejun Heo   workqueue: improv...
234

b71ab8c20   Tejun Heo   workqueue: increa...
235
  	WQ_MAX_ACTIVE		= 512,	  /* I like 512, better ideas? */
f34217977   Tejun Heo   workqueue: implem...
236
  	WQ_MAX_UNBOUND_PER_CPU	= 4,	  /* 4 * #cpus for unbound wq */
b71ab8c20   Tejun Heo   workqueue: increa...
237
  	WQ_DFL_ACTIVE		= WQ_MAX_ACTIVE / 2,
97e37d7b9   Tejun Heo   workqueue: merge ...
238
  };
52bad64d9   David Howells   WorkStruct: Separ...
239

f34217977   Tejun Heo   workqueue: implem...
240
241
242
  /* 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 ...
243

d320c0383   Tejun Heo   workqueue: s/__cr...
244
245
246
247
248
249
250
251
252
253
254
255
256
257
  /*
   * 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...
258
259
260
261
262
   *
   * 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.
4149efb22   Tejun Heo   workqueue: add sy...
263
   *
24d51add7   Tejun Heo   workqueue: fix bu...
264
265
   * system_freezable_wq is equivalent to system_wq except that it's
   * freezable.
d320c0383   Tejun Heo   workqueue: s/__cr...
266
267
268
269
   */
  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...
270
  extern struct workqueue_struct *system_unbound_wq;
24d51add7   Tejun Heo   workqueue: fix bu...
271
  extern struct workqueue_struct *system_freezable_wq;
52bad64d9   David Howells   WorkStruct: Separ...
272

4e6045f13   Johannes Berg   workqueue: debug ...
273
  extern struct workqueue_struct *
d320c0383   Tejun Heo   workqueue: s/__cr...
274
275
  __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 ...
276
277
  
  #ifdef CONFIG_LOCKDEP
d320c0383   Tejun Heo   workqueue: s/__cr...
278
  #define alloc_workqueue(name, flags, max_active)		\
4e6045f13   Johannes Berg   workqueue: debug ...
279
280
  ({								\
  	static struct lock_class_key __key;			\
eb13ba873   Johannes Berg   lockdep: fix work...
281
282
283
284
285
286
  	const char *__lock_name;				\
  								\
  	if (__builtin_constant_p(name))				\
  		__lock_name = (name);				\
  	else							\
  		__lock_name = #name;				\
4e6045f13   Johannes Berg   workqueue: debug ...
287
  								\
d320c0383   Tejun Heo   workqueue: s/__cr...
288
289
  	__alloc_workqueue_key((name), (flags), (max_active),	\
  			      &__key, __lock_name);		\
4e6045f13   Johannes Berg   workqueue: debug ...
290
291
  })
  #else
d320c0383   Tejun Heo   workqueue: s/__cr...
292
293
  #define alloc_workqueue(name, flags, max_active)		\
  	__alloc_workqueue_key((name), (flags), (max_active), NULL, NULL)
4e6045f13   Johannes Berg   workqueue: debug ...
294
  #endif
81dcaf651   Tejun Heo   workqueue: implem...
295
296
297
  /**
   * alloc_ordered_workqueue - allocate an ordered workqueue
   * @name: name of the workqueue
58a69cb47   Tejun Heo   workqueue, freeze...
298
   * @flags: WQ_* flags (only WQ_FREEZABLE and WQ_MEM_RECLAIM are meaningful)
81dcaf651   Tejun Heo   workqueue: implem...
299
300
301
302
303
304
305
306
307
308
309
310
311
   *
   * Allocate an ordered workqueue.  An ordered workqueue executes at
   * most one work item at any given time in the queued order.  They are
   * implemented as unbound workqueues with @max_active of one.
   *
   * RETURNS:
   * Pointer to the allocated workqueue on success, %NULL on failure.
   */
  static inline struct workqueue_struct *
  alloc_ordered_workqueue(const char *name, unsigned int flags)
  {
  	return alloc_workqueue(name, WQ_UNBOUND | flags, 1);
  }
97e37d7b9   Tejun Heo   workqueue: merge ...
312
  #define create_workqueue(name)					\
6370a6ad3   Tejun Heo   workqueue: add an...
313
  	alloc_workqueue((name), WQ_MEM_RECLAIM, 1)
58a69cb47   Tejun Heo   workqueue, freeze...
314
315
  #define create_freezable_workqueue(name)			\
  	alloc_workqueue((name), WQ_FREEZABLE | WQ_UNBOUND | WQ_MEM_RECLAIM, 1)
97e37d7b9   Tejun Heo   workqueue: merge ...
316
  #define create_singlethread_workqueue(name)			\
6370a6ad3   Tejun Heo   workqueue: add an...
317
  	alloc_workqueue((name), WQ_UNBOUND | WQ_MEM_RECLAIM, 1)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
318
319
  
  extern void destroy_workqueue(struct workqueue_struct *wq);
b3c975286   Harvey Harrison   include/linux: Re...
320
  extern int queue_work(struct workqueue_struct *wq, struct work_struct *work);
c1a220e7a   Zhang Rui   pm: introduce new...
321
322
  extern int queue_work_on(int cpu, struct workqueue_struct *wq,
  			struct work_struct *work);
b3c975286   Harvey Harrison   include/linux: Re...
323
324
  extern int queue_delayed_work(struct workqueue_struct *wq,
  			struct delayed_work *work, unsigned long delay);
7a6bc1cdd   Venkatesh Pallipadi   [CPUFREQ] Add que...
325
  extern int queue_delayed_work_on(int cpu, struct workqueue_struct *wq,
28e53bddf   Oleg Nesterov   unify flush_work/...
326
  			struct delayed_work *work, unsigned long delay);
b3c975286   Harvey Harrison   include/linux: Re...
327
  extern void flush_workqueue(struct workqueue_struct *wq);
9c5a2ba70   Tejun Heo   workqueue: separa...
328
  extern void drain_workqueue(struct workqueue_struct *wq);
28e53bddf   Oleg Nesterov   unify flush_work/...
329
  extern void flush_scheduled_work(void);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
330

b3c975286   Harvey Harrison   include/linux: Re...
331
  extern int schedule_work(struct work_struct *work);
c1a220e7a   Zhang Rui   pm: introduce new...
332
  extern int schedule_work_on(int cpu, struct work_struct *work);
b3c975286   Harvey Harrison   include/linux: Re...
333
  extern int schedule_delayed_work(struct delayed_work *work, unsigned long delay);
28e53bddf   Oleg Nesterov   unify flush_work/...
334
335
  extern int schedule_delayed_work_on(int cpu, struct delayed_work *work,
  					unsigned long delay);
65f27f384   David Howells   WorkStruct: Pass ...
336
  extern int schedule_on_each_cpu(work_func_t func);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
337
  extern int keventd_up(void);
65f27f384   David Howells   WorkStruct: Pass ...
338
  int execute_in_process_context(work_func_t fn, struct execute_work *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
339

401a8d048   Tejun Heo   workqueue: cleanu...
340
  extern bool flush_work(struct work_struct *work);
09383498c   Tejun Heo   workqueue: implem...
341
  extern bool flush_work_sync(struct work_struct *work);
401a8d048   Tejun Heo   workqueue: cleanu...
342
343
344
  extern bool cancel_work_sync(struct work_struct *work);
  
  extern bool flush_delayed_work(struct delayed_work *dwork);
09383498c   Tejun Heo   workqueue: implem...
345
  extern bool flush_delayed_work_sync(struct delayed_work *work);
401a8d048   Tejun Heo   workqueue: cleanu...
346
  extern bool cancel_delayed_work_sync(struct delayed_work *dwork);
28e53bddf   Oleg Nesterov   unify flush_work/...
347

dcd989cb7   Tejun Heo   workqueue: implem...
348
349
350
351
352
  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
353
354
  /*
   * Kill off a pending schedule_delayed_work().  Note that the work callback
071b63868   Oleg Nesterov   [WORKQUEUE]: canc...
355
356
   * 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/...
357
   * cancel_work_sync() to wait on it.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
358
   */
401a8d048   Tejun Heo   workqueue: cleanu...
359
  static inline bool cancel_delayed_work(struct delayed_work *work)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
360
  {
401a8d048   Tejun Heo   workqueue: cleanu...
361
  	bool ret;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
362

223a10a98   Oleg Nesterov   revert "cancel_de...
363
  	ret = del_timer_sync(&work->timer);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
364
  	if (ret)
23b2e5991   Oleg Nesterov   workqueue: kill N...
365
  		work_clear_pending(&work->work);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
366
367
  	return ret;
  }
4e49627b9   Oleg Nesterov   workqueues: intro...
368
369
370
371
372
  /*
   * 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.
   */
401a8d048   Tejun Heo   workqueue: cleanu...
373
  static inline bool __cancel_delayed_work(struct delayed_work *work)
4e49627b9   Oleg Nesterov   workqueues: intro...
374
  {
401a8d048   Tejun Heo   workqueue: cleanu...
375
  	bool ret;
4e49627b9   Oleg Nesterov   workqueues: intro...
376
377
378
379
380
381
  
  	ret = del_timer(&work->timer);
  	if (ret)
  		work_clear_pending(&work->work);
  	return ret;
  }
2d3854a37   Rusty Russell   cpumask: introduc...
382
383
384
385
386
387
388
389
  #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...
390

a0a1a5fd4   Tejun Heo   workqueue: reimpl...
391
392
393
394
395
  #ifdef CONFIG_FREEZER
  extern void freeze_workqueues_begin(void);
  extern bool freeze_workqueues_busy(void);
  extern void thaw_workqueues(void);
  #endif /* CONFIG_FREEZER */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
396
  #endif