Blame view

kernel/workqueue.c 102 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
  /*
c54fce6ef   Tejun Heo   workqueue: add do...
2
   * kernel/workqueue.c - generic async execution with shared worker pool
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3
   *
c54fce6ef   Tejun Heo   workqueue: add do...
4
   * Copyright (C) 2002		Ingo Molnar
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5
   *
c54fce6ef   Tejun Heo   workqueue: add do...
6
7
8
9
10
   *   Derived from the taskqueue/keventd code by:
   *     David Woodhouse <dwmw2@infradead.org>
   *     Andrew Morton
   *     Kai Petzke <wpp@marie.physik.tu-berlin.de>
   *     Theodore Ts'o <tytso@mit.edu>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
11
   *
c54fce6ef   Tejun Heo   workqueue: add do...
12
   * Made to use alloc_percpu by Christoph Lameter.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
13
   *
c54fce6ef   Tejun Heo   workqueue: add do...
14
15
   * Copyright (C) 2010		SUSE Linux Products GmbH
   * Copyright (C) 2010		Tejun Heo <tj@kernel.org>
89ada6791   Christoph Lameter   [PATCH] Use alloc...
16
   *
c54fce6ef   Tejun Heo   workqueue: add do...
17
18
19
20
21
22
23
   * This is the generic async execution mechanism.  Work items as are
   * executed in process context.  The worker pool is shared and
   * automatically managed.  There is one worker pool for each CPU and
   * one extra for works which are better served by workers which are
   * not bound to any specific CPU.
   *
   * Please read Documentation/workqueue.txt for details.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
24
25
26
27
28
29
30
31
32
33
34
35
36
   */
  
  #include <linux/module.h>
  #include <linux/kernel.h>
  #include <linux/sched.h>
  #include <linux/init.h>
  #include <linux/signal.h>
  #include <linux/completion.h>
  #include <linux/workqueue.h>
  #include <linux/slab.h>
  #include <linux/cpu.h>
  #include <linux/notifier.h>
  #include <linux/kthread.h>
1fa44ecad   James Bottomley   [SCSI] add execut...
37
  #include <linux/hardirq.h>
469340236   Christoph Lameter   [PATCH] mm: keven...
38
  #include <linux/mempolicy.h>
341a59585   Rafael J. Wysocki   [PATCH] Support f...
39
  #include <linux/freezer.h>
d5abe6691   Peter Zijlstra   [PATCH] debug: wo...
40
41
  #include <linux/kallsyms.h>
  #include <linux/debug_locks.h>
4e6045f13   Johannes Berg   workqueue: debug ...
42
  #include <linux/lockdep.h>
c34056a3f   Tejun Heo   workqueue: introd...
43
  #include <linux/idr.h>
e22bee782   Tejun Heo   workqueue: implem...
44
45
  
  #include "workqueue_sched.h"
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
46

c8e55f360   Tejun Heo   workqueue: implem...
47
  enum {
db7bccf45   Tejun Heo   workqueue: reimpl...
48
  	/* global_cwq flags */
e22bee782   Tejun Heo   workqueue: implem...
49
50
51
  	GCWQ_MANAGE_WORKERS	= 1 << 0,	/* need to manage workers */
  	GCWQ_MANAGING_WORKERS	= 1 << 1,	/* managing workers */
  	GCWQ_DISASSOCIATED	= 1 << 2,	/* cpu can't serve workers */
db7bccf45   Tejun Heo   workqueue: reimpl...
52
  	GCWQ_FREEZING		= 1 << 3,	/* freeze in progress */
649027d73   Tejun Heo   workqueue: implem...
53
  	GCWQ_HIGHPRI_PENDING	= 1 << 4,	/* highpri works on queue */
db7bccf45   Tejun Heo   workqueue: reimpl...
54

c8e55f360   Tejun Heo   workqueue: implem...
55
56
57
58
  	/* worker flags */
  	WORKER_STARTED		= 1 << 0,	/* started */
  	WORKER_DIE		= 1 << 1,	/* die die die */
  	WORKER_IDLE		= 1 << 2,	/* is idle */
e22bee782   Tejun Heo   workqueue: implem...
59
  	WORKER_PREP		= 1 << 3,	/* preparing to run works */
db7bccf45   Tejun Heo   workqueue: reimpl...
60
  	WORKER_ROGUE		= 1 << 4,	/* not bound to any cpu */
e22bee782   Tejun Heo   workqueue: implem...
61
  	WORKER_REBIND		= 1 << 5,	/* mom is home, come back */
fb0e7beb5   Tejun Heo   workqueue: implem...
62
  	WORKER_CPU_INTENSIVE	= 1 << 6,	/* cpu intensive */
f34217977   Tejun Heo   workqueue: implem...
63
  	WORKER_UNBOUND		= 1 << 7,	/* worker is unbound */
e22bee782   Tejun Heo   workqueue: implem...
64

fb0e7beb5   Tejun Heo   workqueue: implem...
65
  	WORKER_NOT_RUNNING	= WORKER_PREP | WORKER_ROGUE | WORKER_REBIND |
f34217977   Tejun Heo   workqueue: implem...
66
  				  WORKER_CPU_INTENSIVE | WORKER_UNBOUND,
db7bccf45   Tejun Heo   workqueue: reimpl...
67
68
69
70
71
72
73
  
  	/* gcwq->trustee_state */
  	TRUSTEE_START		= 0,		/* start */
  	TRUSTEE_IN_CHARGE	= 1,		/* trustee in charge of gcwq */
  	TRUSTEE_BUTCHER		= 2,		/* butcher workers */
  	TRUSTEE_RELEASE		= 3,		/* release workers */
  	TRUSTEE_DONE		= 4,		/* trustee is done */
c8e55f360   Tejun Heo   workqueue: implem...
74
75
76
77
  
  	BUSY_WORKER_HASH_ORDER	= 6,		/* 64 pointers */
  	BUSY_WORKER_HASH_SIZE	= 1 << BUSY_WORKER_HASH_ORDER,
  	BUSY_WORKER_HASH_MASK	= BUSY_WORKER_HASH_SIZE - 1,
db7bccf45   Tejun Heo   workqueue: reimpl...
78

e22bee782   Tejun Heo   workqueue: implem...
79
80
81
82
83
84
  	MAX_IDLE_WORKERS_RATIO	= 4,		/* 1/4 of busy can be idle */
  	IDLE_WORKER_TIMEOUT	= 300 * HZ,	/* keep idle ones for 5 mins */
  
  	MAYDAY_INITIAL_TIMEOUT	= HZ / 100,	/* call for help after 10ms */
  	MAYDAY_INTERVAL		= HZ / 10,	/* and then every 100ms */
  	CREATE_COOLDOWN		= HZ,		/* time to breath after fail */
db7bccf45   Tejun Heo   workqueue: reimpl...
85
  	TRUSTEE_COOLDOWN	= HZ / 10,	/* for trustee draining */
e22bee782   Tejun Heo   workqueue: implem...
86
87
88
89
90
91
  
  	/*
  	 * Rescue workers are used only on emergencies and shared by
  	 * all cpus.  Give -20.
  	 */
  	RESCUER_NICE_LEVEL	= -20,
c8e55f360   Tejun Heo   workqueue: implem...
92
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
93
94
  
  /*
4690c4ab5   Tejun Heo   workqueue: misc/c...
95
96
   * Structure fields follow one of the following exclusion rules.
   *
e41e704bc   Tejun Heo   workqueue: improv...
97
98
   * I: Modifiable by initialization/destruction paths and read-only for
   *    everyone else.
4690c4ab5   Tejun Heo   workqueue: misc/c...
99
   *
e22bee782   Tejun Heo   workqueue: implem...
100
101
102
   * P: Preemption protected.  Disabling preemption is enough and should
   *    only be modified and accessed from the local cpu.
   *
8b03ae3cd   Tejun Heo   workqueue: introd...
103
   * L: gcwq->lock protected.  Access with gcwq->lock held.
4690c4ab5   Tejun Heo   workqueue: misc/c...
104
   *
e22bee782   Tejun Heo   workqueue: implem...
105
106
107
   * X: During normal operation, modification requires gcwq->lock and
   *    should be done only from local cpu.  Either disabling preemption
   *    on local cpu or grabbing gcwq->lock is enough for read access.
f34217977   Tejun Heo   workqueue: implem...
108
   *    If GCWQ_DISASSOCIATED is set, it's identical to L.
e22bee782   Tejun Heo   workqueue: implem...
109
   *
73f53c4aa   Tejun Heo   workqueue: reimpl...
110
111
   * F: wq->flush_mutex protected.
   *
4690c4ab5   Tejun Heo   workqueue: misc/c...
112
   * W: workqueue_lock protected.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
113
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
114

8b03ae3cd   Tejun Heo   workqueue: introd...
115
  struct global_cwq;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
116

e22bee782   Tejun Heo   workqueue: implem...
117
118
119
120
  /*
   * The poor guys doing the actual heavy lifting.  All on-duty workers
   * are either serving the manager role, on idle list or on busy hash.
   */
c34056a3f   Tejun Heo   workqueue: introd...
121
  struct worker {
c8e55f360   Tejun Heo   workqueue: implem...
122
123
124
125
126
  	/* on idle list while idle, on busy hash table while busy */
  	union {
  		struct list_head	entry;	/* L: while idle */
  		struct hlist_node	hentry;	/* L: while busy */
  	};
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
127

c34056a3f   Tejun Heo   workqueue: introd...
128
  	struct work_struct	*current_work;	/* L: work being processed */
8cca0eea3   Tejun Heo   workqueue: add fi...
129
  	struct cpu_workqueue_struct *current_cwq; /* L: current_work's cwq */
affee4b29   Tejun Heo   workqueue: reimpl...
130
  	struct list_head	scheduled;	/* L: scheduled works */
c34056a3f   Tejun Heo   workqueue: introd...
131
  	struct task_struct	*task;		/* I: worker task */
8b03ae3cd   Tejun Heo   workqueue: introd...
132
  	struct global_cwq	*gcwq;		/* I: the associated gcwq */
e22bee782   Tejun Heo   workqueue: implem...
133
134
135
  	/* 64 bytes boundary on 64bit, 32 on 32bit */
  	unsigned long		last_active;	/* L: last active timestamp */
  	unsigned int		flags;		/* X: flags */
c34056a3f   Tejun Heo   workqueue: introd...
136
  	int			id;		/* I: worker id */
e22bee782   Tejun Heo   workqueue: implem...
137
  	struct work_struct	rebind_work;	/* L: rebind worker to cpu */
c34056a3f   Tejun Heo   workqueue: introd...
138
  };
4690c4ab5   Tejun Heo   workqueue: misc/c...
139
  /*
e22bee782   Tejun Heo   workqueue: implem...
140
141
142
   * Global per-cpu workqueue.  There's one and only one for each cpu
   * and all works are queued and processed here regardless of their
   * target workqueues.
8b03ae3cd   Tejun Heo   workqueue: introd...
143
144
145
   */
  struct global_cwq {
  	spinlock_t		lock;		/* the gcwq lock */
7e11629d0   Tejun Heo   workqueue: use sh...
146
  	struct list_head	worklist;	/* L: list of pending works */
8b03ae3cd   Tejun Heo   workqueue: introd...
147
  	unsigned int		cpu;		/* I: the associated cpu */
db7bccf45   Tejun Heo   workqueue: reimpl...
148
  	unsigned int		flags;		/* L: GCWQ_* flags */
c8e55f360   Tejun Heo   workqueue: implem...
149
150
151
152
153
  
  	int			nr_workers;	/* L: total number of workers */
  	int			nr_idle;	/* L: currently idle ones */
  
  	/* workers are chained either in the idle_list or busy_hash */
e22bee782   Tejun Heo   workqueue: implem...
154
  	struct list_head	idle_list;	/* X: list of idle workers */
c8e55f360   Tejun Heo   workqueue: implem...
155
156
  	struct hlist_head	busy_hash[BUSY_WORKER_HASH_SIZE];
  						/* L: hash of busy workers */
e22bee782   Tejun Heo   workqueue: implem...
157
158
  	struct timer_list	idle_timer;	/* L: worker idle timeout */
  	struct timer_list	mayday_timer;	/* L: SOS timer for dworkers */
8b03ae3cd   Tejun Heo   workqueue: introd...
159
  	struct ida		worker_ida;	/* L: for worker IDs */
db7bccf45   Tejun Heo   workqueue: reimpl...
160
161
162
163
  
  	struct task_struct	*trustee;	/* L: for gcwq shutdown */
  	unsigned int		trustee_state;	/* L: trustee state */
  	wait_queue_head_t	trustee_wait;	/* trustee wait */
e22bee782   Tejun Heo   workqueue: implem...
164
  	struct worker		*first_idle;	/* L: first idle worker */
8b03ae3cd   Tejun Heo   workqueue: introd...
165
166
167
  } ____cacheline_aligned_in_smp;
  
  /*
502ca9d81   Tejun Heo   workqueue: make s...
168
   * The per-CPU workqueue.  The lower WORK_STRUCT_FLAG_BITS of
0f900049c   Tejun Heo   workqueue: update...
169
170
   * work_struct->data are used for flags and thus cwqs need to be
   * aligned at two's power of the number of flag bits.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
171
172
   */
  struct cpu_workqueue_struct {
8b03ae3cd   Tejun Heo   workqueue: introd...
173
  	struct global_cwq	*gcwq;		/* I: the associated gcwq */
4690c4ab5   Tejun Heo   workqueue: misc/c...
174
  	struct workqueue_struct *wq;		/* I: the owning workqueue */
73f53c4aa   Tejun Heo   workqueue: reimpl...
175
176
177
178
  	int			work_color;	/* L: current color */
  	int			flush_color;	/* L: flushing color */
  	int			nr_in_flight[WORK_NR_COLORS];
  						/* L: nr of in_flight works */
1e19ffc63   Tejun Heo   workqueue: implem...
179
  	int			nr_active;	/* L: nr of active works */
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
180
  	int			max_active;	/* L: max active works */
1e19ffc63   Tejun Heo   workqueue: implem...
181
  	struct list_head	delayed_works;	/* L: delayed works */
0f900049c   Tejun Heo   workqueue: update...
182
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
183
184
  
  /*
73f53c4aa   Tejun Heo   workqueue: reimpl...
185
186
187
188
189
190
191
192
193
   * Structure used to wait for workqueue flush.
   */
  struct wq_flusher {
  	struct list_head	list;		/* F: list of flushers */
  	int			flush_color;	/* F: flush color waiting for */
  	struct completion	done;		/* flush completion */
  };
  
  /*
f2e005aaf   Tejun Heo   workqueue: fix ma...
194
195
196
197
198
199
200
201
202
   * All cpumasks are assumed to be always set on UP and thus can't be
   * used to determine whether there's something to be done.
   */
  #ifdef CONFIG_SMP
  typedef cpumask_var_t mayday_mask_t;
  #define mayday_test_and_set_cpu(cpu, mask)	\
  	cpumask_test_and_set_cpu((cpu), (mask))
  #define mayday_clear_cpu(cpu, mask)		cpumask_clear_cpu((cpu), (mask))
  #define for_each_mayday_cpu(cpu, mask)		for_each_cpu((cpu), (mask))
9c37547ab   Tejun Heo   workqueue: use za...
203
  #define alloc_mayday_mask(maskp, gfp)		zalloc_cpumask_var((maskp), (gfp))
f2e005aaf   Tejun Heo   workqueue: fix ma...
204
205
206
207
208
209
210
211
212
  #define free_mayday_mask(mask)			free_cpumask_var((mask))
  #else
  typedef unsigned long mayday_mask_t;
  #define mayday_test_and_set_cpu(cpu, mask)	test_and_set_bit(0, &(mask))
  #define mayday_clear_cpu(cpu, mask)		clear_bit(0, &(mask))
  #define for_each_mayday_cpu(cpu, mask)		if ((cpu) = 0, (mask))
  #define alloc_mayday_mask(maskp, gfp)		true
  #define free_mayday_mask(mask)			do { } while (0)
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
213
214
215
216
217
218
  
  /*
   * The externally visible workqueue abstraction is an array of
   * per-CPU workqueues:
   */
  struct workqueue_struct {
97e37d7b9   Tejun Heo   workqueue: merge ...
219
  	unsigned int		flags;		/* I: WQ_* flags */
bdbc5dd7d   Tejun Heo   workqueue: prepar...
220
221
222
223
224
  	union {
  		struct cpu_workqueue_struct __percpu	*pcpu;
  		struct cpu_workqueue_struct		*single;
  		unsigned long				v;
  	} cpu_wq;				/* I: cwq's */
4690c4ab5   Tejun Heo   workqueue: misc/c...
225
  	struct list_head	list;		/* W: list of all workqueues */
73f53c4aa   Tejun Heo   workqueue: reimpl...
226
227
228
229
230
231
232
233
  
  	struct mutex		flush_mutex;	/* protects wq flushing */
  	int			work_color;	/* F: current work color */
  	int			flush_color;	/* F: current flush color */
  	atomic_t		nr_cwqs_to_flush; /* flush in progress */
  	struct wq_flusher	*first_flusher;	/* F: first flusher */
  	struct list_head	flusher_queue;	/* F: flush waiters */
  	struct list_head	flusher_overflow; /* F: flush overflow list */
f2e005aaf   Tejun Heo   workqueue: fix ma...
234
  	mayday_mask_t		mayday_mask;	/* cpus requesting rescue */
e22bee782   Tejun Heo   workqueue: implem...
235
  	struct worker		*rescuer;	/* I: rescue worker */
dcd989cb7   Tejun Heo   workqueue: implem...
236
  	int			saved_max_active; /* W: saved cwq max_active */
4690c4ab5   Tejun Heo   workqueue: misc/c...
237
  	const char		*name;		/* I: workqueue name */
4e6045f13   Johannes Berg   workqueue: debug ...
238
  #ifdef CONFIG_LOCKDEP
4690c4ab5   Tejun Heo   workqueue: misc/c...
239
  	struct lockdep_map	lockdep_map;
4e6045f13   Johannes Berg   workqueue: debug ...
240
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
241
  };
d320c0383   Tejun Heo   workqueue: s/__cr...
242
243
244
  struct workqueue_struct *system_wq __read_mostly;
  struct workqueue_struct *system_long_wq __read_mostly;
  struct workqueue_struct *system_nrt_wq __read_mostly;
f34217977   Tejun Heo   workqueue: implem...
245
  struct workqueue_struct *system_unbound_wq __read_mostly;
d320c0383   Tejun Heo   workqueue: s/__cr...
246
247
248
  EXPORT_SYMBOL_GPL(system_wq);
  EXPORT_SYMBOL_GPL(system_long_wq);
  EXPORT_SYMBOL_GPL(system_nrt_wq);
f34217977   Tejun Heo   workqueue: implem...
249
  EXPORT_SYMBOL_GPL(system_unbound_wq);
d320c0383   Tejun Heo   workqueue: s/__cr...
250

97bd23470   Tejun Heo   workqueue: prepar...
251
252
  #define CREATE_TRACE_POINTS
  #include <trace/events/workqueue.h>
db7bccf45   Tejun Heo   workqueue: reimpl...
253
254
255
  #define for_each_busy_worker(worker, i, pos, gcwq)			\
  	for (i = 0; i < BUSY_WORKER_HASH_SIZE; i++)			\
  		hlist_for_each_entry(worker, pos, &gcwq->busy_hash[i], hentry)
f34217977   Tejun Heo   workqueue: implem...
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
  static inline int __next_gcwq_cpu(int cpu, const struct cpumask *mask,
  				  unsigned int sw)
  {
  	if (cpu < nr_cpu_ids) {
  		if (sw & 1) {
  			cpu = cpumask_next(cpu, mask);
  			if (cpu < nr_cpu_ids)
  				return cpu;
  		}
  		if (sw & 2)
  			return WORK_CPU_UNBOUND;
  	}
  	return WORK_CPU_NONE;
  }
  
  static inline int __next_wq_cpu(int cpu, const struct cpumask *mask,
  				struct workqueue_struct *wq)
  {
  	return __next_gcwq_cpu(cpu, mask, !(wq->flags & WQ_UNBOUND) ? 1 : 2);
  }
098849516   Tejun Heo   workqueue: explai...
276
277
278
279
280
281
282
283
284
285
286
287
288
  /*
   * CPU iterators
   *
   * An extra gcwq is defined for an invalid cpu number
   * (WORK_CPU_UNBOUND) to host workqueues which are not bound to any
   * specific CPU.  The following iterators are similar to
   * for_each_*_cpu() iterators but also considers the unbound gcwq.
   *
   * for_each_gcwq_cpu()		: possible CPUs + WORK_CPU_UNBOUND
   * for_each_online_gcwq_cpu()	: online CPUs + WORK_CPU_UNBOUND
   * for_each_cwq_cpu()		: possible CPUs for bound workqueues,
   *				  WORK_CPU_UNBOUND for unbound workqueues
   */
f34217977   Tejun Heo   workqueue: implem...
289
290
291
292
293
294
295
296
297
298
299
300
301
302
  #define for_each_gcwq_cpu(cpu)						\
  	for ((cpu) = __next_gcwq_cpu(-1, cpu_possible_mask, 3);		\
  	     (cpu) < WORK_CPU_NONE;					\
  	     (cpu) = __next_gcwq_cpu((cpu), cpu_possible_mask, 3))
  
  #define for_each_online_gcwq_cpu(cpu)					\
  	for ((cpu) = __next_gcwq_cpu(-1, cpu_online_mask, 3);		\
  	     (cpu) < WORK_CPU_NONE;					\
  	     (cpu) = __next_gcwq_cpu((cpu), cpu_online_mask, 3))
  
  #define for_each_cwq_cpu(cpu, wq)					\
  	for ((cpu) = __next_wq_cpu(-1, cpu_possible_mask, (wq));	\
  	     (cpu) < WORK_CPU_NONE;					\
  	     (cpu) = __next_wq_cpu((cpu), cpu_possible_mask, (wq)))
dc186ad74   Thomas Gleixner   workqueue: Add de...
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
  #ifdef CONFIG_DEBUG_OBJECTS_WORK
  
  static struct debug_obj_descr work_debug_descr;
  
  /*
   * fixup_init is called when:
   * - an active object is initialized
   */
  static int work_fixup_init(void *addr, enum debug_obj_state state)
  {
  	struct work_struct *work = addr;
  
  	switch (state) {
  	case ODEBUG_STATE_ACTIVE:
  		cancel_work_sync(work);
  		debug_object_init(work, &work_debug_descr);
  		return 1;
  	default:
  		return 0;
  	}
  }
  
  /*
   * fixup_activate is called when:
   * - an active object is activated
   * - an unknown object is activated (might be a statically initialized object)
   */
  static int work_fixup_activate(void *addr, enum debug_obj_state state)
  {
  	struct work_struct *work = addr;
  
  	switch (state) {
  
  	case ODEBUG_STATE_NOTAVAILABLE:
  		/*
  		 * This is not really a fixup. The work struct was
  		 * statically initialized. We just make sure that it
  		 * is tracked in the object tracker.
  		 */
22df02bb3   Tejun Heo   workqueue: define...
342
  		if (test_bit(WORK_STRUCT_STATIC_BIT, work_data_bits(work))) {
dc186ad74   Thomas Gleixner   workqueue: Add de...
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
  			debug_object_init(work, &work_debug_descr);
  			debug_object_activate(work, &work_debug_descr);
  			return 0;
  		}
  		WARN_ON_ONCE(1);
  		return 0;
  
  	case ODEBUG_STATE_ACTIVE:
  		WARN_ON(1);
  
  	default:
  		return 0;
  	}
  }
  
  /*
   * fixup_free is called when:
   * - an active object is freed
   */
  static int work_fixup_free(void *addr, enum debug_obj_state state)
  {
  	struct work_struct *work = addr;
  
  	switch (state) {
  	case ODEBUG_STATE_ACTIVE:
  		cancel_work_sync(work);
  		debug_object_free(work, &work_debug_descr);
  		return 1;
  	default:
  		return 0;
  	}
  }
  
  static struct debug_obj_descr work_debug_descr = {
  	.name		= "work_struct",
  	.fixup_init	= work_fixup_init,
  	.fixup_activate	= work_fixup_activate,
  	.fixup_free	= work_fixup_free,
  };
  
  static inline void debug_work_activate(struct work_struct *work)
  {
  	debug_object_activate(work, &work_debug_descr);
  }
  
  static inline void debug_work_deactivate(struct work_struct *work)
  {
  	debug_object_deactivate(work, &work_debug_descr);
  }
  
  void __init_work(struct work_struct *work, int onstack)
  {
  	if (onstack)
  		debug_object_init_on_stack(work, &work_debug_descr);
  	else
  		debug_object_init(work, &work_debug_descr);
  }
  EXPORT_SYMBOL_GPL(__init_work);
  
  void destroy_work_on_stack(struct work_struct *work)
  {
  	debug_object_free(work, &work_debug_descr);
  }
  EXPORT_SYMBOL_GPL(destroy_work_on_stack);
  
  #else
  static inline void debug_work_activate(struct work_struct *work) { }
  static inline void debug_work_deactivate(struct work_struct *work) { }
  #endif
95402b382   Gautham R Shenoy   cpu-hotplug: repl...
412
413
  /* Serializes the accesses to the list of workqueues. */
  static DEFINE_SPINLOCK(workqueue_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
414
  static LIST_HEAD(workqueues);
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
415
  static bool workqueue_freezing;		/* W: have wqs started freezing? */
c34056a3f   Tejun Heo   workqueue: introd...
416

e22bee782   Tejun Heo   workqueue: implem...
417
418
419
420
421
  /*
   * The almighty global cpu workqueues.  nr_running is the only field
   * which is expected to be used frequently by other cpus via
   * try_to_wake_up().  Put it in a separate cacheline.
   */
8b03ae3cd   Tejun Heo   workqueue: introd...
422
  static DEFINE_PER_CPU(struct global_cwq, global_cwq);
e22bee782   Tejun Heo   workqueue: implem...
423
  static DEFINE_PER_CPU_SHARED_ALIGNED(atomic_t, gcwq_nr_running);
8b03ae3cd   Tejun Heo   workqueue: introd...
424

f34217977   Tejun Heo   workqueue: implem...
425
426
427
428
429
430
431
  /*
   * Global cpu workqueue and nr_running counter for unbound gcwq.  The
   * gcwq is always online, has GCWQ_DISASSOCIATED set, and all its
   * workers have WORKER_UNBOUND set.
   */
  static struct global_cwq unbound_global_cwq;
  static atomic_t unbound_gcwq_nr_running = ATOMIC_INIT(0);	/* always 0 */
c34056a3f   Tejun Heo   workqueue: introd...
432
  static int worker_thread(void *__worker);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
433

8b03ae3cd   Tejun Heo   workqueue: introd...
434
435
  static struct global_cwq *get_gcwq(unsigned int cpu)
  {
f34217977   Tejun Heo   workqueue: implem...
436
437
438
439
  	if (cpu != WORK_CPU_UNBOUND)
  		return &per_cpu(global_cwq, cpu);
  	else
  		return &unbound_global_cwq;
8b03ae3cd   Tejun Heo   workqueue: introd...
440
  }
e22bee782   Tejun Heo   workqueue: implem...
441
442
  static atomic_t *get_gcwq_nr_running(unsigned int cpu)
  {
f34217977   Tejun Heo   workqueue: implem...
443
444
445
446
  	if (cpu != WORK_CPU_UNBOUND)
  		return &per_cpu(gcwq_nr_running, cpu);
  	else
  		return &unbound_gcwq_nr_running;
e22bee782   Tejun Heo   workqueue: implem...
447
  }
1537663f5   Tejun Heo   workqueue: kill c...
448
449
  static struct cpu_workqueue_struct *get_cwq(unsigned int cpu,
  					    struct workqueue_struct *wq)
b1f4ec172   Oleg Nesterov   workqueue: introd...
450
  {
f34217977   Tejun Heo   workqueue: implem...
451
452
453
454
  	if (!(wq->flags & WQ_UNBOUND)) {
  		if (likely(cpu < nr_cpu_ids)) {
  #ifdef CONFIG_SMP
  			return per_cpu_ptr(wq->cpu_wq.pcpu, cpu);
bdbc5dd7d   Tejun Heo   workqueue: prepar...
455
  #else
f34217977   Tejun Heo   workqueue: implem...
456
  			return wq->cpu_wq.single;
bdbc5dd7d   Tejun Heo   workqueue: prepar...
457
  #endif
f34217977   Tejun Heo   workqueue: implem...
458
459
460
461
  		}
  	} else if (likely(cpu == WORK_CPU_UNBOUND))
  		return wq->cpu_wq.single;
  	return NULL;
b1f4ec172   Oleg Nesterov   workqueue: introd...
462
  }
73f53c4aa   Tejun Heo   workqueue: reimpl...
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
  static unsigned int work_color_to_flags(int color)
  {
  	return color << WORK_STRUCT_COLOR_SHIFT;
  }
  
  static int get_work_color(struct work_struct *work)
  {
  	return (*work_data_bits(work) >> WORK_STRUCT_COLOR_SHIFT) &
  		((1 << WORK_STRUCT_COLOR_BITS) - 1);
  }
  
  static int work_next_color(int color)
  {
  	return (color + 1) % WORK_NR_COLORS;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
478

14441960e   Oleg Nesterov   simplify cleanup_...
479
  /*
e120153dd   Tejun Heo   workqueue: fix ho...
480
481
482
   * A work's data points to the cwq with WORK_STRUCT_CWQ set while the
   * work is on queue.  Once execution starts, WORK_STRUCT_CWQ is
   * cleared and the work data contains the cpu number it was last on.
7a22ad757   Tejun Heo   workqueue: carry ...
483
484
485
486
487
488
489
490
491
   *
   * set_work_{cwq|cpu}() and clear_work_data() can be used to set the
   * cwq, cpu or clear work->data.  These functions should only be
   * called while the work is owned - ie. while the PENDING bit is set.
   *
   * get_work_[g]cwq() can be used to obtain the gcwq or cwq
   * corresponding to a work.  gcwq is available once the work has been
   * queued anywhere after initialization.  cwq is available only from
   * queueing until execution starts.
14441960e   Oleg Nesterov   simplify cleanup_...
492
   */
7a22ad757   Tejun Heo   workqueue: carry ...
493
494
  static inline void set_work_data(struct work_struct *work, unsigned long data,
  				 unsigned long flags)
365970a1e   David Howells   WorkStruct: Merge...
495
  {
4594bf159   David Howells   [PATCH] WorkStruc...
496
  	BUG_ON(!work_pending(work));
7a22ad757   Tejun Heo   workqueue: carry ...
497
498
  	atomic_long_set(&work->data, data | flags | work_static(work));
  }
365970a1e   David Howells   WorkStruct: Merge...
499

7a22ad757   Tejun Heo   workqueue: carry ...
500
501
502
503
504
  static void set_work_cwq(struct work_struct *work,
  			 struct cpu_workqueue_struct *cwq,
  			 unsigned long extra_flags)
  {
  	set_work_data(work, (unsigned long)cwq,
e120153dd   Tejun Heo   workqueue: fix ho...
505
  		      WORK_STRUCT_PENDING | WORK_STRUCT_CWQ | extra_flags);
365970a1e   David Howells   WorkStruct: Merge...
506
  }
7a22ad757   Tejun Heo   workqueue: carry ...
507
508
509
510
  static void set_work_cpu(struct work_struct *work, unsigned int cpu)
  {
  	set_work_data(work, cpu << WORK_STRUCT_FLAG_BITS, WORK_STRUCT_PENDING);
  }
f756d5e25   Nathan Lynch   [PATCH] fix workq...
511

7a22ad757   Tejun Heo   workqueue: carry ...
512
  static void clear_work_data(struct work_struct *work)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
513
  {
7a22ad757   Tejun Heo   workqueue: carry ...
514
  	set_work_data(work, WORK_STRUCT_NO_CPU, 0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
515
  }
7a22ad757   Tejun Heo   workqueue: carry ...
516
  static struct cpu_workqueue_struct *get_work_cwq(struct work_struct *work)
b1f4ec172   Oleg Nesterov   workqueue: introd...
517
  {
e120153dd   Tejun Heo   workqueue: fix ho...
518
  	unsigned long data = atomic_long_read(&work->data);
7a22ad757   Tejun Heo   workqueue: carry ...
519

e120153dd   Tejun Heo   workqueue: fix ho...
520
521
522
523
  	if (data & WORK_STRUCT_CWQ)
  		return (void *)(data & WORK_STRUCT_WQ_DATA_MASK);
  	else
  		return NULL;
4d707b9f4   Oleg Nesterov   workqueue: change...
524
  }
7a22ad757   Tejun Heo   workqueue: carry ...
525
  static struct global_cwq *get_work_gcwq(struct work_struct *work)
365970a1e   David Howells   WorkStruct: Merge...
526
  {
e120153dd   Tejun Heo   workqueue: fix ho...
527
  	unsigned long data = atomic_long_read(&work->data);
7a22ad757   Tejun Heo   workqueue: carry ...
528
  	unsigned int cpu;
e120153dd   Tejun Heo   workqueue: fix ho...
529
530
531
  	if (data & WORK_STRUCT_CWQ)
  		return ((struct cpu_workqueue_struct *)
  			(data & WORK_STRUCT_WQ_DATA_MASK))->gcwq;
7a22ad757   Tejun Heo   workqueue: carry ...
532
533
  
  	cpu = data >> WORK_STRUCT_FLAG_BITS;
bdbc5dd7d   Tejun Heo   workqueue: prepar...
534
  	if (cpu == WORK_CPU_NONE)
7a22ad757   Tejun Heo   workqueue: carry ...
535
  		return NULL;
f34217977   Tejun Heo   workqueue: implem...
536
  	BUG_ON(cpu >= nr_cpu_ids && cpu != WORK_CPU_UNBOUND);
7a22ad757   Tejun Heo   workqueue: carry ...
537
  	return get_gcwq(cpu);
b1f4ec172   Oleg Nesterov   workqueue: introd...
538
  }
e22bee782   Tejun Heo   workqueue: implem...
539
540
541
542
543
  /*
   * Policy functions.  These define the policies on how the global
   * worker pool is managed.  Unless noted otherwise, these functions
   * assume that they're being called with gcwq->lock held.
   */
649027d73   Tejun Heo   workqueue: implem...
544
  static bool __need_more_worker(struct global_cwq *gcwq)
a848e3b67   Oleg Nesterov   workqueue: introd...
545
  {
649027d73   Tejun Heo   workqueue: implem...
546
547
  	return !atomic_read(get_gcwq_nr_running(gcwq->cpu)) ||
  		gcwq->flags & GCWQ_HIGHPRI_PENDING;
a848e3b67   Oleg Nesterov   workqueue: introd...
548
  }
4594bf159   David Howells   [PATCH] WorkStruc...
549
  /*
e22bee782   Tejun Heo   workqueue: implem...
550
551
   * Need to wake up a worker?  Called from anything but currently
   * running workers.
4594bf159   David Howells   [PATCH] WorkStruc...
552
   */
e22bee782   Tejun Heo   workqueue: implem...
553
  static bool need_more_worker(struct global_cwq *gcwq)
365970a1e   David Howells   WorkStruct: Merge...
554
  {
649027d73   Tejun Heo   workqueue: implem...
555
  	return !list_empty(&gcwq->worklist) && __need_more_worker(gcwq);
e22bee782   Tejun Heo   workqueue: implem...
556
  }
4594bf159   David Howells   [PATCH] WorkStruc...
557

e22bee782   Tejun Heo   workqueue: implem...
558
559
560
561
562
563
564
565
566
567
  /* Can I start working?  Called from busy but !running workers. */
  static bool may_start_working(struct global_cwq *gcwq)
  {
  	return gcwq->nr_idle;
  }
  
  /* Do I need to keep working?  Called from currently running workers. */
  static bool keep_working(struct global_cwq *gcwq)
  {
  	atomic_t *nr_running = get_gcwq_nr_running(gcwq->cpu);
30310045d   Tejun Heo   workqueue: fix HI...
568
569
570
  	return !list_empty(&gcwq->worklist) &&
  		(atomic_read(nr_running) <= 1 ||
  		 gcwq->flags & GCWQ_HIGHPRI_PENDING);
e22bee782   Tejun Heo   workqueue: implem...
571
572
573
574
575
576
577
  }
  
  /* Do we need a new worker?  Called from manager. */
  static bool need_to_create_worker(struct global_cwq *gcwq)
  {
  	return need_more_worker(gcwq) && !may_start_working(gcwq);
  }
365970a1e   David Howells   WorkStruct: Merge...
578

e22bee782   Tejun Heo   workqueue: implem...
579
580
581
582
583
584
585
586
587
588
589
590
591
592
  /* Do I need to be the manager? */
  static bool need_to_manage_workers(struct global_cwq *gcwq)
  {
  	return need_to_create_worker(gcwq) || gcwq->flags & GCWQ_MANAGE_WORKERS;
  }
  
  /* Do we have too many workers and should some go away? */
  static bool too_many_workers(struct global_cwq *gcwq)
  {
  	bool managing = gcwq->flags & GCWQ_MANAGING_WORKERS;
  	int nr_idle = gcwq->nr_idle + managing; /* manager is considered idle */
  	int nr_busy = gcwq->nr_workers - nr_idle;
  
  	return nr_idle > 2 && (nr_idle - 2) * MAX_IDLE_WORKERS_RATIO >= nr_busy;
365970a1e   David Howells   WorkStruct: Merge...
593
  }
4d707b9f4   Oleg Nesterov   workqueue: change...
594
  /*
e22bee782   Tejun Heo   workqueue: implem...
595
596
   * Wake up functions.
   */
7e11629d0   Tejun Heo   workqueue: use sh...
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
  /* Return the first worker.  Safe with preemption disabled */
  static struct worker *first_worker(struct global_cwq *gcwq)
  {
  	if (unlikely(list_empty(&gcwq->idle_list)))
  		return NULL;
  
  	return list_first_entry(&gcwq->idle_list, struct worker, entry);
  }
  
  /**
   * wake_up_worker - wake up an idle worker
   * @gcwq: gcwq to wake worker for
   *
   * Wake up the first idle worker of @gcwq.
   *
   * CONTEXT:
   * spin_lock_irq(gcwq->lock).
   */
  static void wake_up_worker(struct global_cwq *gcwq)
  {
  	struct worker *worker = first_worker(gcwq);
  
  	if (likely(worker))
  		wake_up_process(worker->task);
  }
4690c4ab5   Tejun Heo   workqueue: misc/c...
622
  /**
e22bee782   Tejun Heo   workqueue: implem...
623
624
625
626
627
628
629
630
631
632
633
634
635
   * wq_worker_waking_up - a worker is waking up
   * @task: task waking up
   * @cpu: CPU @task is waking up to
   *
   * This function is called during try_to_wake_up() when a worker is
   * being awoken.
   *
   * CONTEXT:
   * spin_lock_irq(rq->lock)
   */
  void wq_worker_waking_up(struct task_struct *task, unsigned int cpu)
  {
  	struct worker *worker = kthread_data(task);
2d64672ed   Steven Rostedt   workqueue: It is ...
636
  	if (!(worker->flags & WORKER_NOT_RUNNING))
e22bee782   Tejun Heo   workqueue: implem...
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
  		atomic_inc(get_gcwq_nr_running(cpu));
  }
  
  /**
   * wq_worker_sleeping - a worker is going to sleep
   * @task: task going to sleep
   * @cpu: CPU in question, must be the current CPU number
   *
   * This function is called during schedule() when a busy worker is
   * going to sleep.  Worker on the same cpu can be woken up by
   * returning pointer to its task.
   *
   * CONTEXT:
   * spin_lock_irq(rq->lock)
   *
   * RETURNS:
   * Worker task on @cpu to wake up, %NULL if none.
   */
  struct task_struct *wq_worker_sleeping(struct task_struct *task,
  				       unsigned int cpu)
  {
  	struct worker *worker = kthread_data(task), *to_wakeup = NULL;
  	struct global_cwq *gcwq = get_gcwq(cpu);
  	atomic_t *nr_running = get_gcwq_nr_running(cpu);
2d64672ed   Steven Rostedt   workqueue: It is ...
661
  	if (worker->flags & WORKER_NOT_RUNNING)
e22bee782   Tejun Heo   workqueue: implem...
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
  		return NULL;
  
  	/* this can only happen on the local cpu */
  	BUG_ON(cpu != raw_smp_processor_id());
  
  	/*
  	 * The counterpart of the following dec_and_test, implied mb,
  	 * worklist not empty test sequence is in insert_work().
  	 * Please read comment there.
  	 *
  	 * NOT_RUNNING is clear.  This means that trustee is not in
  	 * charge and we're running on the local cpu w/ rq lock held
  	 * and preemption disabled, which in turn means that none else
  	 * could be manipulating idle_list, so dereferencing idle_list
  	 * without gcwq lock is safe.
  	 */
  	if (atomic_dec_and_test(nr_running) && !list_empty(&gcwq->worklist))
  		to_wakeup = first_worker(gcwq);
  	return to_wakeup ? to_wakeup->task : NULL;
  }
  
  /**
   * worker_set_flags - set worker flags and adjust nr_running accordingly
cb4447669   Tejun Heo   workqueue: use wo...
685
   * @worker: self
d302f0178   Tejun Heo   workqueue: implem...
686
687
688
   * @flags: flags to set
   * @wakeup: wakeup an idle worker if necessary
   *
e22bee782   Tejun Heo   workqueue: implem...
689
690
691
   * Set @flags in @worker->flags and adjust nr_running accordingly.  If
   * nr_running becomes zero and @wakeup is %true, an idle worker is
   * woken up.
d302f0178   Tejun Heo   workqueue: implem...
692
   *
cb4447669   Tejun Heo   workqueue: use wo...
693
694
   * CONTEXT:
   * spin_lock_irq(gcwq->lock)
d302f0178   Tejun Heo   workqueue: implem...
695
696
697
698
   */
  static inline void worker_set_flags(struct worker *worker, unsigned int flags,
  				    bool wakeup)
  {
e22bee782   Tejun Heo   workqueue: implem...
699
  	struct global_cwq *gcwq = worker->gcwq;
cb4447669   Tejun Heo   workqueue: use wo...
700
  	WARN_ON_ONCE(worker->task != current);
e22bee782   Tejun Heo   workqueue: implem...
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
  	/*
  	 * If transitioning into NOT_RUNNING, adjust nr_running and
  	 * wake up an idle worker as necessary if requested by
  	 * @wakeup.
  	 */
  	if ((flags & WORKER_NOT_RUNNING) &&
  	    !(worker->flags & WORKER_NOT_RUNNING)) {
  		atomic_t *nr_running = get_gcwq_nr_running(gcwq->cpu);
  
  		if (wakeup) {
  			if (atomic_dec_and_test(nr_running) &&
  			    !list_empty(&gcwq->worklist))
  				wake_up_worker(gcwq);
  		} else
  			atomic_dec(nr_running);
  	}
d302f0178   Tejun Heo   workqueue: implem...
717
718
719
720
  	worker->flags |= flags;
  }
  
  /**
e22bee782   Tejun Heo   workqueue: implem...
721
   * worker_clr_flags - clear worker flags and adjust nr_running accordingly
cb4447669   Tejun Heo   workqueue: use wo...
722
   * @worker: self
d302f0178   Tejun Heo   workqueue: implem...
723
724
   * @flags: flags to clear
   *
e22bee782   Tejun Heo   workqueue: implem...
725
   * Clear @flags in @worker->flags and adjust nr_running accordingly.
d302f0178   Tejun Heo   workqueue: implem...
726
   *
cb4447669   Tejun Heo   workqueue: use wo...
727
728
   * CONTEXT:
   * spin_lock_irq(gcwq->lock)
d302f0178   Tejun Heo   workqueue: implem...
729
730
731
   */
  static inline void worker_clr_flags(struct worker *worker, unsigned int flags)
  {
e22bee782   Tejun Heo   workqueue: implem...
732
733
  	struct global_cwq *gcwq = worker->gcwq;
  	unsigned int oflags = worker->flags;
cb4447669   Tejun Heo   workqueue: use wo...
734
  	WARN_ON_ONCE(worker->task != current);
d302f0178   Tejun Heo   workqueue: implem...
735
  	worker->flags &= ~flags;
e22bee782   Tejun Heo   workqueue: implem...
736

42c025f3d   Tejun Heo   workqueue: note t...
737
738
739
740
741
  	/*
  	 * If transitioning out of NOT_RUNNING, increment nr_running.  Note
  	 * that the nested NOT_RUNNING is not a noop.  NOT_RUNNING is mask
  	 * of multiple flags, not a single flag.
  	 */
e22bee782   Tejun Heo   workqueue: implem...
742
743
744
  	if ((flags & WORKER_NOT_RUNNING) && (oflags & WORKER_NOT_RUNNING))
  		if (!(worker->flags & WORKER_NOT_RUNNING))
  			atomic_inc(get_gcwq_nr_running(gcwq->cpu));
d302f0178   Tejun Heo   workqueue: implem...
745
746
747
  }
  
  /**
c8e55f360   Tejun Heo   workqueue: implem...
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
   * busy_worker_head - return the busy hash head for a work
   * @gcwq: gcwq of interest
   * @work: work to be hashed
   *
   * Return hash head of @gcwq for @work.
   *
   * CONTEXT:
   * spin_lock_irq(gcwq->lock).
   *
   * RETURNS:
   * Pointer to the hash head.
   */
  static struct hlist_head *busy_worker_head(struct global_cwq *gcwq,
  					   struct work_struct *work)
  {
  	const int base_shift = ilog2(sizeof(struct work_struct));
  	unsigned long v = (unsigned long)work;
  
  	/* simple shift and fold hash, do we need something better? */
  	v >>= base_shift;
  	v += v >> BUSY_WORKER_HASH_ORDER;
  	v &= BUSY_WORKER_HASH_MASK;
  
  	return &gcwq->busy_hash[v];
  }
  
  /**
8cca0eea3   Tejun Heo   workqueue: add fi...
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
   * __find_worker_executing_work - find worker which is executing a work
   * @gcwq: gcwq of interest
   * @bwh: hash head as returned by busy_worker_head()
   * @work: work to find worker for
   *
   * Find a worker which is executing @work on @gcwq.  @bwh should be
   * the hash head obtained by calling busy_worker_head() with the same
   * work.
   *
   * CONTEXT:
   * spin_lock_irq(gcwq->lock).
   *
   * RETURNS:
   * Pointer to worker which is executing @work if found, NULL
   * otherwise.
   */
  static struct worker *__find_worker_executing_work(struct global_cwq *gcwq,
  						   struct hlist_head *bwh,
  						   struct work_struct *work)
  {
  	struct worker *worker;
  	struct hlist_node *tmp;
  
  	hlist_for_each_entry(worker, tmp, bwh, hentry)
  		if (worker->current_work == work)
  			return worker;
  	return NULL;
  }
  
  /**
   * find_worker_executing_work - find worker which is executing a work
   * @gcwq: gcwq of interest
   * @work: work to find worker for
   *
   * Find a worker which is executing @work on @gcwq.  This function is
   * identical to __find_worker_executing_work() except that this
   * function calculates @bwh itself.
   *
   * CONTEXT:
   * spin_lock_irq(gcwq->lock).
   *
   * RETURNS:
   * Pointer to worker which is executing @work if found, NULL
   * otherwise.
4d707b9f4   Oleg Nesterov   workqueue: change...
819
   */
8cca0eea3   Tejun Heo   workqueue: add fi...
820
821
  static struct worker *find_worker_executing_work(struct global_cwq *gcwq,
  						 struct work_struct *work)
4d707b9f4   Oleg Nesterov   workqueue: change...
822
  {
8cca0eea3   Tejun Heo   workqueue: add fi...
823
824
  	return __find_worker_executing_work(gcwq, busy_worker_head(gcwq, work),
  					    work);
4d707b9f4   Oleg Nesterov   workqueue: change...
825
  }
8cca0eea3   Tejun Heo   workqueue: add fi...
826
  /**
649027d73   Tejun Heo   workqueue: implem...
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
   * gcwq_determine_ins_pos - find insertion position
   * @gcwq: gcwq of interest
   * @cwq: cwq a work is being queued for
   *
   * A work for @cwq is about to be queued on @gcwq, determine insertion
   * position for the work.  If @cwq is for HIGHPRI wq, the work is
   * queued at the head of the queue but in FIFO order with respect to
   * other HIGHPRI works; otherwise, at the end of the queue.  This
   * function also sets GCWQ_HIGHPRI_PENDING flag to hint @gcwq that
   * there are HIGHPRI works pending.
   *
   * CONTEXT:
   * spin_lock_irq(gcwq->lock).
   *
   * RETURNS:
   * Pointer to inserstion position.
   */
  static inline struct list_head *gcwq_determine_ins_pos(struct global_cwq *gcwq,
  					       struct cpu_workqueue_struct *cwq)
365970a1e   David Howells   WorkStruct: Merge...
846
  {
649027d73   Tejun Heo   workqueue: implem...
847
848
849
850
851
852
853
854
855
856
857
858
859
860
  	struct work_struct *twork;
  
  	if (likely(!(cwq->wq->flags & WQ_HIGHPRI)))
  		return &gcwq->worklist;
  
  	list_for_each_entry(twork, &gcwq->worklist, entry) {
  		struct cpu_workqueue_struct *tcwq = get_work_cwq(twork);
  
  		if (!(tcwq->wq->flags & WQ_HIGHPRI))
  			break;
  	}
  
  	gcwq->flags |= GCWQ_HIGHPRI_PENDING;
  	return &twork->entry;
365970a1e   David Howells   WorkStruct: Merge...
861
  }
649027d73   Tejun Heo   workqueue: implem...
862
  /**
7e11629d0   Tejun Heo   workqueue: use sh...
863
   * insert_work - insert a work into gcwq
4690c4ab5   Tejun Heo   workqueue: misc/c...
864
865
866
867
868
   * @cwq: cwq @work belongs to
   * @work: work to insert
   * @head: insertion point
   * @extra_flags: extra WORK_STRUCT_* flags to set
   *
7e11629d0   Tejun Heo   workqueue: use sh...
869
870
   * Insert @work which belongs to @cwq into @gcwq after @head.
   * @extra_flags is or'd to work_struct flags.
4690c4ab5   Tejun Heo   workqueue: misc/c...
871
872
   *
   * CONTEXT:
8b03ae3cd   Tejun Heo   workqueue: introd...
873
   * spin_lock_irq(gcwq->lock).
4690c4ab5   Tejun Heo   workqueue: misc/c...
874
   */
b89deed32   Oleg Nesterov   implement flush_w...
875
  static void insert_work(struct cpu_workqueue_struct *cwq,
4690c4ab5   Tejun Heo   workqueue: misc/c...
876
877
  			struct work_struct *work, struct list_head *head,
  			unsigned int extra_flags)
b89deed32   Oleg Nesterov   implement flush_w...
878
  {
e22bee782   Tejun Heo   workqueue: implem...
879
  	struct global_cwq *gcwq = cwq->gcwq;
4690c4ab5   Tejun Heo   workqueue: misc/c...
880
  	/* we own @work, set data and link */
7a22ad757   Tejun Heo   workqueue: carry ...
881
  	set_work_cwq(work, cwq, extra_flags);
e1d8aa9f1   Frederic Weisbecker   tracing: add a ne...
882

6e84d644b   Oleg Nesterov   make cancel_rearm...
883
884
885
886
887
  	/*
  	 * Ensure that we get the right work->data if we see the
  	 * result of list_add() below, see try_to_grab_pending().
  	 */
  	smp_wmb();
4690c4ab5   Tejun Heo   workqueue: misc/c...
888

1a4d9b0aa   Oleg Nesterov   workqueues: inser...
889
  	list_add_tail(&work->entry, head);
e22bee782   Tejun Heo   workqueue: implem...
890
891
892
893
894
895
896
  
  	/*
  	 * Ensure either worker_sched_deactivated() sees the above
  	 * list_add_tail() or we see zero nr_running to avoid workers
  	 * lying around lazily while there are works to be processed.
  	 */
  	smp_mb();
649027d73   Tejun Heo   workqueue: implem...
897
  	if (__need_more_worker(gcwq))
e22bee782   Tejun Heo   workqueue: implem...
898
  		wake_up_worker(gcwq);
b89deed32   Oleg Nesterov   implement flush_w...
899
  }
c8efcc258   Tejun Heo   workqueue: allow ...
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
  /*
   * Test whether @work is being queued from another work executing on the
   * same workqueue.  This is rather expensive and should only be used from
   * cold paths.
   */
  static bool is_chained_work(struct workqueue_struct *wq)
  {
  	unsigned long flags;
  	unsigned int cpu;
  
  	for_each_gcwq_cpu(cpu) {
  		struct global_cwq *gcwq = get_gcwq(cpu);
  		struct worker *worker;
  		struct hlist_node *pos;
  		int i;
  
  		spin_lock_irqsave(&gcwq->lock, flags);
  		for_each_busy_worker(worker, i, pos, gcwq) {
  			if (worker->task != current)
  				continue;
  			spin_unlock_irqrestore(&gcwq->lock, flags);
  			/*
  			 * I'm @worker, no locking necessary.  See if @work
  			 * is headed to the same workqueue.
  			 */
  			return worker->current_cwq->wq == wq;
  		}
  		spin_unlock_irqrestore(&gcwq->lock, flags);
  	}
  	return false;
  }
4690c4ab5   Tejun Heo   workqueue: misc/c...
931
  static void __queue_work(unsigned int cpu, struct workqueue_struct *wq,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
932
933
  			 struct work_struct *work)
  {
502ca9d81   Tejun Heo   workqueue: make s...
934
935
  	struct global_cwq *gcwq;
  	struct cpu_workqueue_struct *cwq;
1e19ffc63   Tejun Heo   workqueue: implem...
936
  	struct list_head *worklist;
8a2e8e5de   Tejun Heo   workqueue: fix cw...
937
  	unsigned int work_flags;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
938
  	unsigned long flags;
dc186ad74   Thomas Gleixner   workqueue: Add de...
939
  	debug_work_activate(work);
1e19ffc63   Tejun Heo   workqueue: implem...
940

c8efcc258   Tejun Heo   workqueue: allow ...
941
942
943
  	/* if dying, only works from the same workqueue are allowed */
  	if (unlikely(wq->flags & WQ_DYING) &&
  	    WARN_ON_ONCE(!is_chained_work(wq)))
e41e704bc   Tejun Heo   workqueue: improv...
944
  		return;
c7fc77f78   Tejun Heo   workqueue: remove...
945
946
  	/* determine gcwq to use */
  	if (!(wq->flags & WQ_UNBOUND)) {
18aa9effa   Tejun Heo   workqueue: implem...
947
  		struct global_cwq *last_gcwq;
c7fc77f78   Tejun Heo   workqueue: remove...
948
949
  		if (unlikely(cpu == WORK_CPU_UNBOUND))
  			cpu = raw_smp_processor_id();
18aa9effa   Tejun Heo   workqueue: implem...
950
951
952
953
954
955
  		/*
  		 * It's multi cpu.  If @wq is non-reentrant and @work
  		 * was previously on a different cpu, it might still
  		 * be running there, in which case the work needs to
  		 * be queued on that cpu to guarantee non-reentrance.
  		 */
502ca9d81   Tejun Heo   workqueue: make s...
956
  		gcwq = get_gcwq(cpu);
18aa9effa   Tejun Heo   workqueue: implem...
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
  		if (wq->flags & WQ_NON_REENTRANT &&
  		    (last_gcwq = get_work_gcwq(work)) && last_gcwq != gcwq) {
  			struct worker *worker;
  
  			spin_lock_irqsave(&last_gcwq->lock, flags);
  
  			worker = find_worker_executing_work(last_gcwq, work);
  
  			if (worker && worker->current_cwq->wq == wq)
  				gcwq = last_gcwq;
  			else {
  				/* meh... not running there, queue here */
  				spin_unlock_irqrestore(&last_gcwq->lock, flags);
  				spin_lock_irqsave(&gcwq->lock, flags);
  			}
  		} else
  			spin_lock_irqsave(&gcwq->lock, flags);
f34217977   Tejun Heo   workqueue: implem...
974
975
976
  	} else {
  		gcwq = get_gcwq(WORK_CPU_UNBOUND);
  		spin_lock_irqsave(&gcwq->lock, flags);
502ca9d81   Tejun Heo   workqueue: make s...
977
978
979
980
  	}
  
  	/* gcwq determined, get cwq and queue */
  	cwq = get_cwq(gcwq->cpu, wq);
cdadf0097   Tejun Heo   workqueue: add qu...
981
  	trace_workqueue_queue_work(cpu, cwq, work);
502ca9d81   Tejun Heo   workqueue: make s...
982

4690c4ab5   Tejun Heo   workqueue: misc/c...
983
  	BUG_ON(!list_empty(&work->entry));
1e19ffc63   Tejun Heo   workqueue: implem...
984

73f53c4aa   Tejun Heo   workqueue: reimpl...
985
  	cwq->nr_in_flight[cwq->work_color]++;
8a2e8e5de   Tejun Heo   workqueue: fix cw...
986
  	work_flags = work_color_to_flags(cwq->work_color);
1e19ffc63   Tejun Heo   workqueue: implem...
987
988
  
  	if (likely(cwq->nr_active < cwq->max_active)) {
cdadf0097   Tejun Heo   workqueue: add qu...
989
  		trace_workqueue_activate_work(work);
1e19ffc63   Tejun Heo   workqueue: implem...
990
  		cwq->nr_active++;
649027d73   Tejun Heo   workqueue: implem...
991
  		worklist = gcwq_determine_ins_pos(gcwq, cwq);
8a2e8e5de   Tejun Heo   workqueue: fix cw...
992
993
  	} else {
  		work_flags |= WORK_STRUCT_DELAYED;
1e19ffc63   Tejun Heo   workqueue: implem...
994
  		worklist = &cwq->delayed_works;
8a2e8e5de   Tejun Heo   workqueue: fix cw...
995
  	}
1e19ffc63   Tejun Heo   workqueue: implem...
996

8a2e8e5de   Tejun Heo   workqueue: fix cw...
997
  	insert_work(cwq, work, worklist, work_flags);
1e19ffc63   Tejun Heo   workqueue: implem...
998

8b03ae3cd   Tejun Heo   workqueue: introd...
999
  	spin_unlock_irqrestore(&gcwq->lock, flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1000
  }
0fcb78c22   Rolf Eike Beer   [PATCH] Add DocBo...
1001
1002
1003
1004
1005
  /**
   * queue_work - queue work on a workqueue
   * @wq: workqueue to use
   * @work: work to queue
   *
057647fc4   Alan Stern   [PATCH] workqueue...
1006
   * Returns 0 if @work was already on a queue, non-zero otherwise.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1007
   *
00dfcaf74   Oleg Nesterov   workqueues: shrin...
1008
1009
   * We queue the work to the CPU on which it was submitted, but if the CPU dies
   * it can be processed by another CPU.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1010
   */
7ad5b3a50   Harvey Harrison   kernel: remove fa...
1011
  int queue_work(struct workqueue_struct *wq, struct work_struct *work)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1012
  {
ef1ca236b   Oleg Nesterov   workqueues: queue...
1013
1014
1015
1016
  	int ret;
  
  	ret = queue_work_on(get_cpu(), wq, work);
  	put_cpu();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1017
1018
  	return ret;
  }
ae90dd5db   Dave Jones   Move workqueue ex...
1019
  EXPORT_SYMBOL_GPL(queue_work);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1020

c1a220e7a   Zhang Rui   pm: introduce new...
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
  /**
   * queue_work_on - queue work on specific cpu
   * @cpu: CPU number to execute work on
   * @wq: workqueue to use
   * @work: work to queue
   *
   * Returns 0 if @work was already on a queue, non-zero otherwise.
   *
   * We queue the work to a specific CPU, the caller must ensure it
   * can't go away.
   */
  int
  queue_work_on(int cpu, struct workqueue_struct *wq, struct work_struct *work)
  {
  	int ret = 0;
22df02bb3   Tejun Heo   workqueue: define...
1036
  	if (!test_and_set_bit(WORK_STRUCT_PENDING_BIT, work_data_bits(work))) {
4690c4ab5   Tejun Heo   workqueue: misc/c...
1037
  		__queue_work(cpu, wq, work);
c1a220e7a   Zhang Rui   pm: introduce new...
1038
1039
1040
1041
1042
  		ret = 1;
  	}
  	return ret;
  }
  EXPORT_SYMBOL_GPL(queue_work_on);
6d141c3ff   Li Zefan   workqueue: make d...
1043
  static void delayed_work_timer_fn(unsigned long __data)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1044
  {
52bad64d9   David Howells   WorkStruct: Separ...
1045
  	struct delayed_work *dwork = (struct delayed_work *)__data;
7a22ad757   Tejun Heo   workqueue: carry ...
1046
  	struct cpu_workqueue_struct *cwq = get_work_cwq(&dwork->work);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1047

4690c4ab5   Tejun Heo   workqueue: misc/c...
1048
  	__queue_work(smp_processor_id(), cwq->wq, &dwork->work);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1049
  }
0fcb78c22   Rolf Eike Beer   [PATCH] Add DocBo...
1050
1051
1052
  /**
   * queue_delayed_work - queue work on a workqueue after delay
   * @wq: workqueue to use
af9997e42   Randy Dunlap   [PATCH] fix kerne...
1053
   * @dwork: delayable work to queue
0fcb78c22   Rolf Eike Beer   [PATCH] Add DocBo...
1054
1055
   * @delay: number of jiffies to wait before queueing
   *
057647fc4   Alan Stern   [PATCH] workqueue...
1056
   * Returns 0 if @work was already on a queue, non-zero otherwise.
0fcb78c22   Rolf Eike Beer   [PATCH] Add DocBo...
1057
   */
7ad5b3a50   Harvey Harrison   kernel: remove fa...
1058
  int queue_delayed_work(struct workqueue_struct *wq,
52bad64d9   David Howells   WorkStruct: Separ...
1059
  			struct delayed_work *dwork, unsigned long delay)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1060
  {
52bad64d9   David Howells   WorkStruct: Separ...
1061
  	if (delay == 0)
63bc03625   Oleg Nesterov   unify queue_delay...
1062
  		return queue_work(wq, &dwork->work);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1063

63bc03625   Oleg Nesterov   unify queue_delay...
1064
  	return queue_delayed_work_on(-1, wq, dwork, delay);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1065
  }
ae90dd5db   Dave Jones   Move workqueue ex...
1066
  EXPORT_SYMBOL_GPL(queue_delayed_work);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1067

0fcb78c22   Rolf Eike Beer   [PATCH] Add DocBo...
1068
1069
1070
1071
  /**
   * queue_delayed_work_on - queue work on specific CPU after delay
   * @cpu: CPU number to execute work on
   * @wq: workqueue to use
af9997e42   Randy Dunlap   [PATCH] fix kerne...
1072
   * @dwork: work to queue
0fcb78c22   Rolf Eike Beer   [PATCH] Add DocBo...
1073
1074
   * @delay: number of jiffies to wait before queueing
   *
057647fc4   Alan Stern   [PATCH] workqueue...
1075
   * Returns 0 if @work was already on a queue, non-zero otherwise.
0fcb78c22   Rolf Eike Beer   [PATCH] Add DocBo...
1076
   */
7a6bc1cdd   Venkatesh Pallipadi   [CPUFREQ] Add que...
1077
  int queue_delayed_work_on(int cpu, struct workqueue_struct *wq,
52bad64d9   David Howells   WorkStruct: Separ...
1078
  			struct delayed_work *dwork, unsigned long delay)
7a6bc1cdd   Venkatesh Pallipadi   [CPUFREQ] Add que...
1079
1080
  {
  	int ret = 0;
52bad64d9   David Howells   WorkStruct: Separ...
1081
1082
  	struct timer_list *timer = &dwork->timer;
  	struct work_struct *work = &dwork->work;
7a6bc1cdd   Venkatesh Pallipadi   [CPUFREQ] Add que...
1083

22df02bb3   Tejun Heo   workqueue: define...
1084
  	if (!test_and_set_bit(WORK_STRUCT_PENDING_BIT, work_data_bits(work))) {
c7fc77f78   Tejun Heo   workqueue: remove...
1085
  		unsigned int lcpu;
7a22ad757   Tejun Heo   workqueue: carry ...
1086

7a6bc1cdd   Venkatesh Pallipadi   [CPUFREQ] Add que...
1087
1088
  		BUG_ON(timer_pending(timer));
  		BUG_ON(!list_empty(&work->entry));
8a3e77cc2   Andrew Liu   workqueue: remove...
1089
  		timer_stats_timer_set_start_info(&dwork->timer);
7a22ad757   Tejun Heo   workqueue: carry ...
1090
1091
1092
1093
1094
  		/*
  		 * This stores cwq for the moment, for the timer_fn.
  		 * Note that the work's gcwq is preserved to allow
  		 * reentrance detection for delayed works.
  		 */
c7fc77f78   Tejun Heo   workqueue: remove...
1095
1096
1097
1098
1099
1100
1101
1102
1103
  		if (!(wq->flags & WQ_UNBOUND)) {
  			struct global_cwq *gcwq = get_work_gcwq(work);
  
  			if (gcwq && gcwq->cpu != WORK_CPU_UNBOUND)
  				lcpu = gcwq->cpu;
  			else
  				lcpu = raw_smp_processor_id();
  		} else
  			lcpu = WORK_CPU_UNBOUND;
7a22ad757   Tejun Heo   workqueue: carry ...
1104
  		set_work_cwq(work, get_cwq(lcpu, wq), 0);
c7fc77f78   Tejun Heo   workqueue: remove...
1105

7a6bc1cdd   Venkatesh Pallipadi   [CPUFREQ] Add que...
1106
  		timer->expires = jiffies + delay;
52bad64d9   David Howells   WorkStruct: Separ...
1107
  		timer->data = (unsigned long)dwork;
7a6bc1cdd   Venkatesh Pallipadi   [CPUFREQ] Add que...
1108
  		timer->function = delayed_work_timer_fn;
63bc03625   Oleg Nesterov   unify queue_delay...
1109
1110
1111
1112
1113
  
  		if (unlikely(cpu >= 0))
  			add_timer_on(timer, cpu);
  		else
  			add_timer(timer);
7a6bc1cdd   Venkatesh Pallipadi   [CPUFREQ] Add que...
1114
1115
1116
1117
  		ret = 1;
  	}
  	return ret;
  }
ae90dd5db   Dave Jones   Move workqueue ex...
1118
  EXPORT_SYMBOL_GPL(queue_delayed_work_on);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1119

c8e55f360   Tejun Heo   workqueue: implem...
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
  /**
   * worker_enter_idle - enter idle state
   * @worker: worker which is entering idle state
   *
   * @worker is entering idle state.  Update stats and idle timer if
   * necessary.
   *
   * LOCKING:
   * spin_lock_irq(gcwq->lock).
   */
  static void worker_enter_idle(struct worker *worker)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1131
  {
c8e55f360   Tejun Heo   workqueue: implem...
1132
1133
1134
1135
1136
  	struct global_cwq *gcwq = worker->gcwq;
  
  	BUG_ON(worker->flags & WORKER_IDLE);
  	BUG_ON(!list_empty(&worker->entry) &&
  	       (worker->hentry.next || worker->hentry.pprev));
cb4447669   Tejun Heo   workqueue: use wo...
1137
1138
  	/* can't use worker_set_flags(), also called from start_worker() */
  	worker->flags |= WORKER_IDLE;
c8e55f360   Tejun Heo   workqueue: implem...
1139
  	gcwq->nr_idle++;
e22bee782   Tejun Heo   workqueue: implem...
1140
  	worker->last_active = jiffies;
c8e55f360   Tejun Heo   workqueue: implem...
1141
1142
1143
  
  	/* idle_list is LIFO */
  	list_add(&worker->entry, &gcwq->idle_list);
db7bccf45   Tejun Heo   workqueue: reimpl...
1144

e22bee782   Tejun Heo   workqueue: implem...
1145
1146
1147
1148
1149
  	if (likely(!(worker->flags & WORKER_ROGUE))) {
  		if (too_many_workers(gcwq) && !timer_pending(&gcwq->idle_timer))
  			mod_timer(&gcwq->idle_timer,
  				  jiffies + IDLE_WORKER_TIMEOUT);
  	} else
db7bccf45   Tejun Heo   workqueue: reimpl...
1150
  		wake_up_all(&gcwq->trustee_wait);
cb4447669   Tejun Heo   workqueue: use wo...
1151
1152
1153
1154
  
  	/* sanity check nr_running */
  	WARN_ON_ONCE(gcwq->nr_workers == gcwq->nr_idle &&
  		     atomic_read(get_gcwq_nr_running(gcwq->cpu)));
c8e55f360   Tejun Heo   workqueue: implem...
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
  }
  
  /**
   * worker_leave_idle - leave idle state
   * @worker: worker which is leaving idle state
   *
   * @worker is leaving idle state.  Update stats.
   *
   * LOCKING:
   * spin_lock_irq(gcwq->lock).
   */
  static void worker_leave_idle(struct worker *worker)
  {
  	struct global_cwq *gcwq = worker->gcwq;
  
  	BUG_ON(!(worker->flags & WORKER_IDLE));
d302f0178   Tejun Heo   workqueue: implem...
1171
  	worker_clr_flags(worker, WORKER_IDLE);
c8e55f360   Tejun Heo   workqueue: implem...
1172
1173
1174
  	gcwq->nr_idle--;
  	list_del_init(&worker->entry);
  }
e22bee782   Tejun Heo   workqueue: implem...
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
  /**
   * worker_maybe_bind_and_lock - bind worker to its cpu if possible and lock gcwq
   * @worker: self
   *
   * Works which are scheduled while the cpu is online must at least be
   * scheduled to a worker which is bound to the cpu so that if they are
   * flushed from cpu callbacks while cpu is going down, they are
   * guaranteed to execute on the cpu.
   *
   * This function is to be used by rogue workers and rescuers to bind
   * themselves to the target cpu and may race with cpu going down or
   * coming online.  kthread_bind() can't be used because it may put the
   * worker to already dead cpu and set_cpus_allowed_ptr() can't be used
   * verbatim as it's best effort and blocking and gcwq may be
   * [dis]associated in the meantime.
   *
   * This function tries set_cpus_allowed() and locks gcwq and verifies
   * the binding against GCWQ_DISASSOCIATED which is set during
   * CPU_DYING and cleared during CPU_ONLINE, so if the worker enters
   * idle state or fetches works without dropping lock, it can guarantee
   * the scheduling requirement described in the first paragraph.
   *
   * CONTEXT:
   * Might sleep.  Called without any lock but returns with gcwq->lock
   * held.
   *
   * RETURNS:
   * %true if the associated gcwq is online (@worker is successfully
   * bound), %false if offline.
   */
  static bool worker_maybe_bind_and_lock(struct worker *worker)
972fa1c53   Namhyung Kim   workqueue: mark l...
1206
  __acquires(&gcwq->lock)
e22bee782   Tejun Heo   workqueue: implem...
1207
1208
1209
1210
1211
  {
  	struct global_cwq *gcwq = worker->gcwq;
  	struct task_struct *task = worker->task;
  
  	while (true) {
4e6045f13   Johannes Berg   workqueue: debug ...
1212
  		/*
e22bee782   Tejun Heo   workqueue: implem...
1213
1214
1215
1216
  		 * The following call may fail, succeed or succeed
  		 * without actually migrating the task to the cpu if
  		 * it races with cpu hotunplug operation.  Verify
  		 * against GCWQ_DISASSOCIATED.
4e6045f13   Johannes Berg   workqueue: debug ...
1217
  		 */
f34217977   Tejun Heo   workqueue: implem...
1218
1219
  		if (!(gcwq->flags & GCWQ_DISASSOCIATED))
  			set_cpus_allowed_ptr(task, get_cpu_mask(gcwq->cpu));
e22bee782   Tejun Heo   workqueue: implem...
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
  
  		spin_lock_irq(&gcwq->lock);
  		if (gcwq->flags & GCWQ_DISASSOCIATED)
  			return false;
  		if (task_cpu(task) == gcwq->cpu &&
  		    cpumask_equal(&current->cpus_allowed,
  				  get_cpu_mask(gcwq->cpu)))
  			return true;
  		spin_unlock_irq(&gcwq->lock);
  
  		/* CPU has come up inbetween, retry migration */
  		cpu_relax();
  	}
  }
  
  /*
   * Function for worker->rebind_work used to rebind rogue busy workers
   * to the associated cpu which is coming back online.  This is
   * scheduled by cpu up but can race with other cpu hotplug operations
   * and may be executed twice without intervening cpu down.
   */
  static void worker_rebind_fn(struct work_struct *work)
  {
  	struct worker *worker = container_of(work, struct worker, rebind_work);
  	struct global_cwq *gcwq = worker->gcwq;
  
  	if (worker_maybe_bind_and_lock(worker))
  		worker_clr_flags(worker, WORKER_REBIND);
  
  	spin_unlock_irq(&gcwq->lock);
  }
c34056a3f   Tejun Heo   workqueue: introd...
1251
1252
1253
1254
1255
  static struct worker *alloc_worker(void)
  {
  	struct worker *worker;
  
  	worker = kzalloc(sizeof(*worker), GFP_KERNEL);
c8e55f360   Tejun Heo   workqueue: implem...
1256
1257
  	if (worker) {
  		INIT_LIST_HEAD(&worker->entry);
affee4b29   Tejun Heo   workqueue: reimpl...
1258
  		INIT_LIST_HEAD(&worker->scheduled);
e22bee782   Tejun Heo   workqueue: implem...
1259
1260
1261
  		INIT_WORK(&worker->rebind_work, worker_rebind_fn);
  		/* on creation a worker is in !idle && prep state */
  		worker->flags = WORKER_PREP;
c8e55f360   Tejun Heo   workqueue: implem...
1262
  	}
c34056a3f   Tejun Heo   workqueue: introd...
1263
1264
1265
1266
1267
  	return worker;
  }
  
  /**
   * create_worker - create a new workqueue worker
7e11629d0   Tejun Heo   workqueue: use sh...
1268
   * @gcwq: gcwq the new worker will belong to
c34056a3f   Tejun Heo   workqueue: introd...
1269
1270
   * @bind: whether to set affinity to @cpu or not
   *
7e11629d0   Tejun Heo   workqueue: use sh...
1271
   * Create a new worker which is bound to @gcwq.  The returned worker
c34056a3f   Tejun Heo   workqueue: introd...
1272
1273
1274
1275
1276
1277
1278
1279
1280
   * can be started by calling start_worker() or destroyed using
   * destroy_worker().
   *
   * CONTEXT:
   * Might sleep.  Does GFP_KERNEL allocations.
   *
   * RETURNS:
   * Pointer to the newly created worker.
   */
7e11629d0   Tejun Heo   workqueue: use sh...
1281
  static struct worker *create_worker(struct global_cwq *gcwq, bool bind)
c34056a3f   Tejun Heo   workqueue: introd...
1282
  {
f34217977   Tejun Heo   workqueue: implem...
1283
  	bool on_unbound_cpu = gcwq->cpu == WORK_CPU_UNBOUND;
c34056a3f   Tejun Heo   workqueue: introd...
1284
  	struct worker *worker = NULL;
f34217977   Tejun Heo   workqueue: implem...
1285
  	int id = -1;
c34056a3f   Tejun Heo   workqueue: introd...
1286

8b03ae3cd   Tejun Heo   workqueue: introd...
1287
1288
1289
1290
  	spin_lock_irq(&gcwq->lock);
  	while (ida_get_new(&gcwq->worker_ida, &id)) {
  		spin_unlock_irq(&gcwq->lock);
  		if (!ida_pre_get(&gcwq->worker_ida, GFP_KERNEL))
c34056a3f   Tejun Heo   workqueue: introd...
1291
  			goto fail;
8b03ae3cd   Tejun Heo   workqueue: introd...
1292
  		spin_lock_irq(&gcwq->lock);
c34056a3f   Tejun Heo   workqueue: introd...
1293
  	}
8b03ae3cd   Tejun Heo   workqueue: introd...
1294
  	spin_unlock_irq(&gcwq->lock);
c34056a3f   Tejun Heo   workqueue: introd...
1295
1296
1297
1298
  
  	worker = alloc_worker();
  	if (!worker)
  		goto fail;
8b03ae3cd   Tejun Heo   workqueue: introd...
1299
  	worker->gcwq = gcwq;
c34056a3f   Tejun Heo   workqueue: introd...
1300
  	worker->id = id;
f34217977   Tejun Heo   workqueue: implem...
1301
1302
1303
1304
1305
1306
  	if (!on_unbound_cpu)
  		worker->task = kthread_create(worker_thread, worker,
  					      "kworker/%u:%d", gcwq->cpu, id);
  	else
  		worker->task = kthread_create(worker_thread, worker,
  					      "kworker/u:%d", id);
c34056a3f   Tejun Heo   workqueue: introd...
1307
1308
  	if (IS_ERR(worker->task))
  		goto fail;
db7bccf45   Tejun Heo   workqueue: reimpl...
1309
1310
1311
1312
1313
  	/*
  	 * A rogue worker will become a regular one if CPU comes
  	 * online later on.  Make sure every worker has
  	 * PF_THREAD_BOUND set.
  	 */
f34217977   Tejun Heo   workqueue: implem...
1314
  	if (bind && !on_unbound_cpu)
8b03ae3cd   Tejun Heo   workqueue: introd...
1315
  		kthread_bind(worker->task, gcwq->cpu);
f34217977   Tejun Heo   workqueue: implem...
1316
  	else {
db7bccf45   Tejun Heo   workqueue: reimpl...
1317
  		worker->task->flags |= PF_THREAD_BOUND;
f34217977   Tejun Heo   workqueue: implem...
1318
1319
1320
  		if (on_unbound_cpu)
  			worker->flags |= WORKER_UNBOUND;
  	}
c34056a3f   Tejun Heo   workqueue: introd...
1321
1322
1323
1324
  
  	return worker;
  fail:
  	if (id >= 0) {
8b03ae3cd   Tejun Heo   workqueue: introd...
1325
1326
1327
  		spin_lock_irq(&gcwq->lock);
  		ida_remove(&gcwq->worker_ida, id);
  		spin_unlock_irq(&gcwq->lock);
c34056a3f   Tejun Heo   workqueue: introd...
1328
1329
1330
1331
1332
1333
1334
1335
1336
  	}
  	kfree(worker);
  	return NULL;
  }
  
  /**
   * start_worker - start a newly created worker
   * @worker: worker to start
   *
c8e55f360   Tejun Heo   workqueue: implem...
1337
   * Make the gcwq aware of @worker and start it.
c34056a3f   Tejun Heo   workqueue: introd...
1338
1339
   *
   * CONTEXT:
8b03ae3cd   Tejun Heo   workqueue: introd...
1340
   * spin_lock_irq(gcwq->lock).
c34056a3f   Tejun Heo   workqueue: introd...
1341
1342
1343
   */
  static void start_worker(struct worker *worker)
  {
cb4447669   Tejun Heo   workqueue: use wo...
1344
  	worker->flags |= WORKER_STARTED;
c8e55f360   Tejun Heo   workqueue: implem...
1345
1346
  	worker->gcwq->nr_workers++;
  	worker_enter_idle(worker);
c34056a3f   Tejun Heo   workqueue: introd...
1347
1348
1349
1350
1351
1352
1353
  	wake_up_process(worker->task);
  }
  
  /**
   * destroy_worker - destroy a workqueue worker
   * @worker: worker to be destroyed
   *
c8e55f360   Tejun Heo   workqueue: implem...
1354
1355
1356
1357
   * Destroy @worker and adjust @gcwq stats accordingly.
   *
   * CONTEXT:
   * spin_lock_irq(gcwq->lock) which is released and regrabbed.
c34056a3f   Tejun Heo   workqueue: introd...
1358
1359
1360
   */
  static void destroy_worker(struct worker *worker)
  {
8b03ae3cd   Tejun Heo   workqueue: introd...
1361
  	struct global_cwq *gcwq = worker->gcwq;
c34056a3f   Tejun Heo   workqueue: introd...
1362
1363
1364
1365
  	int id = worker->id;
  
  	/* sanity check frenzy */
  	BUG_ON(worker->current_work);
affee4b29   Tejun Heo   workqueue: reimpl...
1366
  	BUG_ON(!list_empty(&worker->scheduled));
c34056a3f   Tejun Heo   workqueue: introd...
1367

c8e55f360   Tejun Heo   workqueue: implem...
1368
1369
1370
1371
1372
1373
  	if (worker->flags & WORKER_STARTED)
  		gcwq->nr_workers--;
  	if (worker->flags & WORKER_IDLE)
  		gcwq->nr_idle--;
  
  	list_del_init(&worker->entry);
cb4447669   Tejun Heo   workqueue: use wo...
1374
  	worker->flags |= WORKER_DIE;
c8e55f360   Tejun Heo   workqueue: implem...
1375
1376
  
  	spin_unlock_irq(&gcwq->lock);
c34056a3f   Tejun Heo   workqueue: introd...
1377
1378
  	kthread_stop(worker->task);
  	kfree(worker);
8b03ae3cd   Tejun Heo   workqueue: introd...
1379
1380
  	spin_lock_irq(&gcwq->lock);
  	ida_remove(&gcwq->worker_ida, id);
c34056a3f   Tejun Heo   workqueue: introd...
1381
  }
e22bee782   Tejun Heo   workqueue: implem...
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
  static void idle_worker_timeout(unsigned long __gcwq)
  {
  	struct global_cwq *gcwq = (void *)__gcwq;
  
  	spin_lock_irq(&gcwq->lock);
  
  	if (too_many_workers(gcwq)) {
  		struct worker *worker;
  		unsigned long expires;
  
  		/* idle_list is kept in LIFO order, check the last one */
  		worker = list_entry(gcwq->idle_list.prev, struct worker, entry);
  		expires = worker->last_active + IDLE_WORKER_TIMEOUT;
  
  		if (time_before(jiffies, expires))
  			mod_timer(&gcwq->idle_timer, expires);
  		else {
  			/* it's been idle for too long, wake up manager */
  			gcwq->flags |= GCWQ_MANAGE_WORKERS;
  			wake_up_worker(gcwq);
d5abe6691   Peter Zijlstra   [PATCH] debug: wo...
1402
  		}
e22bee782   Tejun Heo   workqueue: implem...
1403
1404
1405
1406
  	}
  
  	spin_unlock_irq(&gcwq->lock);
  }
d5abe6691   Peter Zijlstra   [PATCH] debug: wo...
1407

e22bee782   Tejun Heo   workqueue: implem...
1408
1409
1410
1411
  static bool send_mayday(struct work_struct *work)
  {
  	struct cpu_workqueue_struct *cwq = get_work_cwq(work);
  	struct workqueue_struct *wq = cwq->wq;
f34217977   Tejun Heo   workqueue: implem...
1412
  	unsigned int cpu;
e22bee782   Tejun Heo   workqueue: implem...
1413
1414
1415
1416
1417
  
  	if (!(wq->flags & WQ_RESCUER))
  		return false;
  
  	/* mayday mayday mayday */
f34217977   Tejun Heo   workqueue: implem...
1418
1419
1420
1421
  	cpu = cwq->gcwq->cpu;
  	/* WORK_CPU_UNBOUND can't be set in cpumask, use cpu 0 instead */
  	if (cpu == WORK_CPU_UNBOUND)
  		cpu = 0;
f2e005aaf   Tejun Heo   workqueue: fix ma...
1422
  	if (!mayday_test_and_set_cpu(cpu, wq->mayday_mask))
e22bee782   Tejun Heo   workqueue: implem...
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
  		wake_up_process(wq->rescuer->task);
  	return true;
  }
  
  static void gcwq_mayday_timeout(unsigned long __gcwq)
  {
  	struct global_cwq *gcwq = (void *)__gcwq;
  	struct work_struct *work;
  
  	spin_lock_irq(&gcwq->lock);
  
  	if (need_to_create_worker(gcwq)) {
  		/*
  		 * We've been trying to create a new worker but
  		 * haven't been successful.  We might be hitting an
  		 * allocation deadlock.  Send distress signals to
  		 * rescuers.
  		 */
  		list_for_each_entry(work, &gcwq->worklist, entry)
  			send_mayday(work);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1443
  	}
e22bee782   Tejun Heo   workqueue: implem...
1444
1445
1446
1447
  
  	spin_unlock_irq(&gcwq->lock);
  
  	mod_timer(&gcwq->mayday_timer, jiffies + MAYDAY_INTERVAL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1448
  }
e22bee782   Tejun Heo   workqueue: implem...
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
  /**
   * maybe_create_worker - create a new worker if necessary
   * @gcwq: gcwq to create a new worker for
   *
   * Create a new worker for @gcwq if necessary.  @gcwq is guaranteed to
   * have at least one idle worker on return from this function.  If
   * creating a new worker takes longer than MAYDAY_INTERVAL, mayday is
   * sent to all rescuers with works scheduled on @gcwq to resolve
   * possible allocation deadlock.
   *
   * On return, need_to_create_worker() is guaranteed to be false and
   * may_start_working() true.
   *
   * LOCKING:
   * spin_lock_irq(gcwq->lock) which may be released and regrabbed
   * multiple times.  Does GFP_KERNEL allocations.  Called only from
   * manager.
   *
   * RETURNS:
   * false if no action was taken and gcwq->lock stayed locked, true
   * otherwise.
   */
  static bool maybe_create_worker(struct global_cwq *gcwq)
06bd6ebff   Namhyung Kim   workqueue: annota...
1472
1473
  __releases(&gcwq->lock)
  __acquires(&gcwq->lock)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1474
  {
e22bee782   Tejun Heo   workqueue: implem...
1475
1476
1477
  	if (!need_to_create_worker(gcwq))
  		return false;
  restart:
9f9c23644   Tejun Heo   workqueue: fix lo...
1478
  	spin_unlock_irq(&gcwq->lock);
e22bee782   Tejun Heo   workqueue: implem...
1479
1480
1481
1482
1483
  	/* if we don't make progress in MAYDAY_INITIAL_TIMEOUT, call for help */
  	mod_timer(&gcwq->mayday_timer, jiffies + MAYDAY_INITIAL_TIMEOUT);
  
  	while (true) {
  		struct worker *worker;
e22bee782   Tejun Heo   workqueue: implem...
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
  		worker = create_worker(gcwq, true);
  		if (worker) {
  			del_timer_sync(&gcwq->mayday_timer);
  			spin_lock_irq(&gcwq->lock);
  			start_worker(worker);
  			BUG_ON(need_to_create_worker(gcwq));
  			return true;
  		}
  
  		if (!need_to_create_worker(gcwq))
  			break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1495

e22bee782   Tejun Heo   workqueue: implem...
1496
1497
  		__set_current_state(TASK_INTERRUPTIBLE);
  		schedule_timeout(CREATE_COOLDOWN);
9f9c23644   Tejun Heo   workqueue: fix lo...
1498

e22bee782   Tejun Heo   workqueue: implem...
1499
1500
1501
  		if (!need_to_create_worker(gcwq))
  			break;
  	}
e22bee782   Tejun Heo   workqueue: implem...
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
  	del_timer_sync(&gcwq->mayday_timer);
  	spin_lock_irq(&gcwq->lock);
  	if (need_to_create_worker(gcwq))
  		goto restart;
  	return true;
  }
  
  /**
   * maybe_destroy_worker - destroy workers which have been idle for a while
   * @gcwq: gcwq to destroy workers for
   *
   * Destroy @gcwq workers which have been idle for longer than
   * IDLE_WORKER_TIMEOUT.
   *
   * LOCKING:
   * spin_lock_irq(gcwq->lock) which may be released and regrabbed
   * multiple times.  Called only from manager.
   *
   * RETURNS:
   * false if no action was taken and gcwq->lock stayed locked, true
   * otherwise.
   */
  static bool maybe_destroy_workers(struct global_cwq *gcwq)
  {
  	bool ret = false;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1527

e22bee782   Tejun Heo   workqueue: implem...
1528
1529
1530
  	while (too_many_workers(gcwq)) {
  		struct worker *worker;
  		unsigned long expires;
3af24433e   Oleg Nesterov   workqueue: don't ...
1531

e22bee782   Tejun Heo   workqueue: implem...
1532
1533
  		worker = list_entry(gcwq->idle_list.prev, struct worker, entry);
  		expires = worker->last_active + IDLE_WORKER_TIMEOUT;
85f4186af   Oleg Nesterov   worker_thread: fi...
1534

e22bee782   Tejun Heo   workqueue: implem...
1535
1536
  		if (time_before(jiffies, expires)) {
  			mod_timer(&gcwq->idle_timer, expires);
3af24433e   Oleg Nesterov   workqueue: don't ...
1537
  			break;
e22bee782   Tejun Heo   workqueue: implem...
1538
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1539

e22bee782   Tejun Heo   workqueue: implem...
1540
1541
  		destroy_worker(worker);
  		ret = true;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1542
  	}
3af24433e   Oleg Nesterov   workqueue: don't ...
1543

e22bee782   Tejun Heo   workqueue: implem...
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
  	return ret;
  }
  
  /**
   * manage_workers - manage worker pool
   * @worker: self
   *
   * Assume the manager role and manage gcwq worker pool @worker belongs
   * to.  At any given time, there can be only zero or one manager per
   * gcwq.  The exclusion is handled automatically by this function.
   *
   * The caller can safely start processing works on false return.  On
   * true return, it's guaranteed that need_to_create_worker() is false
   * and may_start_working() is true.
   *
   * CONTEXT:
   * spin_lock_irq(gcwq->lock) which may be released and regrabbed
   * multiple times.  Does GFP_KERNEL allocations.
   *
   * RETURNS:
   * false if no action was taken and gcwq->lock stayed locked, true if
   * some action was taken.
   */
  static bool manage_workers(struct worker *worker)
  {
  	struct global_cwq *gcwq = worker->gcwq;
  	bool ret = false;
  
  	if (gcwq->flags & GCWQ_MANAGING_WORKERS)
  		return ret;
  
  	gcwq->flags &= ~GCWQ_MANAGE_WORKERS;
  	gcwq->flags |= GCWQ_MANAGING_WORKERS;
  
  	/*
  	 * Destroy and then create so that may_start_working() is true
  	 * on return.
  	 */
  	ret |= maybe_destroy_workers(gcwq);
  	ret |= maybe_create_worker(gcwq);
  
  	gcwq->flags &= ~GCWQ_MANAGING_WORKERS;
  
  	/*
  	 * The trustee might be waiting to take over the manager
  	 * position, tell it we're done.
  	 */
  	if (unlikely(gcwq->trustee))
  		wake_up_all(&gcwq->trustee_wait);
  
  	return ret;
  }
a62428c0a   Tejun Heo   workqueue: separa...
1596
  /**
affee4b29   Tejun Heo   workqueue: reimpl...
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
   * move_linked_works - move linked works to a list
   * @work: start of series of works to be scheduled
   * @head: target list to append @work to
   * @nextp: out paramter for nested worklist walking
   *
   * Schedule linked works starting from @work to @head.  Work series to
   * be scheduled starts at @work and includes any consecutive work with
   * WORK_STRUCT_LINKED set in its predecessor.
   *
   * If @nextp is not NULL, it's updated to point to the next work of
   * the last scheduled work.  This allows move_linked_works() to be
   * nested inside outer list_for_each_entry_safe().
   *
   * CONTEXT:
8b03ae3cd   Tejun Heo   workqueue: introd...
1611
   * spin_lock_irq(gcwq->lock).
affee4b29   Tejun Heo   workqueue: reimpl...
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
   */
  static void move_linked_works(struct work_struct *work, struct list_head *head,
  			      struct work_struct **nextp)
  {
  	struct work_struct *n;
  
  	/*
  	 * Linked worklist will always end before the end of the list,
  	 * use NULL for list head.
  	 */
  	list_for_each_entry_safe_from(work, n, NULL, entry) {
  		list_move_tail(&work->entry, head);
  		if (!(*work_data_bits(work) & WORK_STRUCT_LINKED))
  			break;
  	}
  
  	/*
  	 * If we're already inside safe list traversal and have moved
  	 * multiple works to the scheduled queue, the next position
  	 * needs to be updated.
  	 */
  	if (nextp)
  		*nextp = n;
  }
1e19ffc63   Tejun Heo   workqueue: implem...
1636
1637
1638
1639
  static void cwq_activate_first_delayed(struct cpu_workqueue_struct *cwq)
  {
  	struct work_struct *work = list_first_entry(&cwq->delayed_works,
  						    struct work_struct, entry);
649027d73   Tejun Heo   workqueue: implem...
1640
  	struct list_head *pos = gcwq_determine_ins_pos(cwq->gcwq, cwq);
1e19ffc63   Tejun Heo   workqueue: implem...
1641

cdadf0097   Tejun Heo   workqueue: add qu...
1642
  	trace_workqueue_activate_work(work);
649027d73   Tejun Heo   workqueue: implem...
1643
  	move_linked_works(work, pos, NULL);
8a2e8e5de   Tejun Heo   workqueue: fix cw...
1644
  	__clear_bit(WORK_STRUCT_DELAYED_BIT, work_data_bits(work));
1e19ffc63   Tejun Heo   workqueue: implem...
1645
1646
  	cwq->nr_active++;
  }
affee4b29   Tejun Heo   workqueue: reimpl...
1647
  /**
73f53c4aa   Tejun Heo   workqueue: reimpl...
1648
1649
1650
   * cwq_dec_nr_in_flight - decrement cwq's nr_in_flight
   * @cwq: cwq of interest
   * @color: color of work which left the queue
8a2e8e5de   Tejun Heo   workqueue: fix cw...
1651
   * @delayed: for a delayed work
73f53c4aa   Tejun Heo   workqueue: reimpl...
1652
1653
1654
1655
1656
   *
   * A work either has completed or is removed from pending queue,
   * decrement nr_in_flight of its cwq and handle workqueue flushing.
   *
   * CONTEXT:
8b03ae3cd   Tejun Heo   workqueue: introd...
1657
   * spin_lock_irq(gcwq->lock).
73f53c4aa   Tejun Heo   workqueue: reimpl...
1658
   */
8a2e8e5de   Tejun Heo   workqueue: fix cw...
1659
1660
  static void cwq_dec_nr_in_flight(struct cpu_workqueue_struct *cwq, int color,
  				 bool delayed)
73f53c4aa   Tejun Heo   workqueue: reimpl...
1661
1662
1663
1664
1665
1666
  {
  	/* ignore uncolored works */
  	if (color == WORK_NO_COLOR)
  		return;
  
  	cwq->nr_in_flight[color]--;
1e19ffc63   Tejun Heo   workqueue: implem...
1667

8a2e8e5de   Tejun Heo   workqueue: fix cw...
1668
1669
1670
1671
1672
1673
1674
  	if (!delayed) {
  		cwq->nr_active--;
  		if (!list_empty(&cwq->delayed_works)) {
  			/* one down, submit a delayed one */
  			if (cwq->nr_active < cwq->max_active)
  				cwq_activate_first_delayed(cwq);
  		}
502ca9d81   Tejun Heo   workqueue: make s...
1675
  	}
73f53c4aa   Tejun Heo   workqueue: reimpl...
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
  
  	/* is flush in progress and are we at the flushing tip? */
  	if (likely(cwq->flush_color != color))
  		return;
  
  	/* are there still in-flight works? */
  	if (cwq->nr_in_flight[color])
  		return;
  
  	/* this cwq is done, clear flush_color */
  	cwq->flush_color = -1;
  
  	/*
  	 * If this was the last cwq, wake up the first flusher.  It
  	 * will handle the rest.
  	 */
  	if (atomic_dec_and_test(&cwq->wq->nr_cwqs_to_flush))
  		complete(&cwq->wq->first_flusher->done);
  }
  
  /**
a62428c0a   Tejun Heo   workqueue: separa...
1697
   * process_one_work - process single work
c34056a3f   Tejun Heo   workqueue: introd...
1698
   * @worker: self
a62428c0a   Tejun Heo   workqueue: separa...
1699
1700
1701
1702
1703
1704
1705
1706
1707
   * @work: work to process
   *
   * Process @work.  This function contains all the logics necessary to
   * process a single work including synchronization against and
   * interaction with other workers on the same cpu, queueing and
   * flushing.  As long as context requirement is met, any worker can
   * call this function to process a work.
   *
   * CONTEXT:
8b03ae3cd   Tejun Heo   workqueue: introd...
1708
   * spin_lock_irq(gcwq->lock) which is released and regrabbed.
a62428c0a   Tejun Heo   workqueue: separa...
1709
   */
c34056a3f   Tejun Heo   workqueue: introd...
1710
  static void process_one_work(struct worker *worker, struct work_struct *work)
06bd6ebff   Namhyung Kim   workqueue: annota...
1711
1712
  __releases(&gcwq->lock)
  __acquires(&gcwq->lock)
a62428c0a   Tejun Heo   workqueue: separa...
1713
  {
7e11629d0   Tejun Heo   workqueue: use sh...
1714
  	struct cpu_workqueue_struct *cwq = get_work_cwq(work);
8b03ae3cd   Tejun Heo   workqueue: introd...
1715
  	struct global_cwq *gcwq = cwq->gcwq;
c8e55f360   Tejun Heo   workqueue: implem...
1716
  	struct hlist_head *bwh = busy_worker_head(gcwq, work);
fb0e7beb5   Tejun Heo   workqueue: implem...
1717
  	bool cpu_intensive = cwq->wq->flags & WQ_CPU_INTENSIVE;
a62428c0a   Tejun Heo   workqueue: separa...
1718
  	work_func_t f = work->func;
73f53c4aa   Tejun Heo   workqueue: reimpl...
1719
  	int work_color;
7e11629d0   Tejun Heo   workqueue: use sh...
1720
  	struct worker *collision;
a62428c0a   Tejun Heo   workqueue: separa...
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
  #ifdef CONFIG_LOCKDEP
  	/*
  	 * It is permissible to free the struct work_struct from
  	 * inside the function that is called from it, this we need to
  	 * take into account for lockdep too.  To avoid bogus "held
  	 * lock freed" warnings as well as problems when looking into
  	 * work->lockdep_map, make a copy and use that here.
  	 */
  	struct lockdep_map lockdep_map = work->lockdep_map;
  #endif
7e11629d0   Tejun Heo   workqueue: use sh...
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
  	/*
  	 * A single work shouldn't be executed concurrently by
  	 * multiple workers on a single cpu.  Check whether anyone is
  	 * already processing the work.  If so, defer the work to the
  	 * currently executing one.
  	 */
  	collision = __find_worker_executing_work(gcwq, bwh, work);
  	if (unlikely(collision)) {
  		move_linked_works(work, &collision->scheduled, NULL);
  		return;
  	}
a62428c0a   Tejun Heo   workqueue: separa...
1742
  	/* claim and process */
a62428c0a   Tejun Heo   workqueue: separa...
1743
  	debug_work_deactivate(work);
c8e55f360   Tejun Heo   workqueue: implem...
1744
  	hlist_add_head(&worker->hentry, bwh);
c34056a3f   Tejun Heo   workqueue: introd...
1745
  	worker->current_work = work;
8cca0eea3   Tejun Heo   workqueue: add fi...
1746
  	worker->current_cwq = cwq;
73f53c4aa   Tejun Heo   workqueue: reimpl...
1747
  	work_color = get_work_color(work);
7a22ad757   Tejun Heo   workqueue: carry ...
1748

7a22ad757   Tejun Heo   workqueue: carry ...
1749
1750
  	/* record the current cpu number in the work data and dequeue */
  	set_work_cpu(work, gcwq->cpu);
a62428c0a   Tejun Heo   workqueue: separa...
1751
  	list_del_init(&work->entry);
649027d73   Tejun Heo   workqueue: implem...
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
  	/*
  	 * If HIGHPRI_PENDING, check the next work, and, if HIGHPRI,
  	 * wake up another worker; otherwise, clear HIGHPRI_PENDING.
  	 */
  	if (unlikely(gcwq->flags & GCWQ_HIGHPRI_PENDING)) {
  		struct work_struct *nwork = list_first_entry(&gcwq->worklist,
  						struct work_struct, entry);
  
  		if (!list_empty(&gcwq->worklist) &&
  		    get_work_cwq(nwork)->wq->flags & WQ_HIGHPRI)
  			wake_up_worker(gcwq);
  		else
  			gcwq->flags &= ~GCWQ_HIGHPRI_PENDING;
  	}
fb0e7beb5   Tejun Heo   workqueue: implem...
1766
1767
1768
1769
1770
1771
  	/*
  	 * CPU intensive works don't participate in concurrency
  	 * management.  They're the scheduler's responsibility.
  	 */
  	if (unlikely(cpu_intensive))
  		worker_set_flags(worker, WORKER_CPU_INTENSIVE, true);
8b03ae3cd   Tejun Heo   workqueue: introd...
1772
  	spin_unlock_irq(&gcwq->lock);
a62428c0a   Tejun Heo   workqueue: separa...
1773

a62428c0a   Tejun Heo   workqueue: separa...
1774
  	work_clear_pending(work);
e159489ba   Tejun Heo   workqueue: relax ...
1775
  	lock_map_acquire_read(&cwq->wq->lockdep_map);
a62428c0a   Tejun Heo   workqueue: separa...
1776
  	lock_map_acquire(&lockdep_map);
e36c886a0   Arjan van de Ven   workqueue: Add ba...
1777
  	trace_workqueue_execute_start(work);
a62428c0a   Tejun Heo   workqueue: separa...
1778
  	f(work);
e36c886a0   Arjan van de Ven   workqueue: Add ba...
1779
1780
1781
1782
1783
  	/*
  	 * While we must be careful to not use "work" after this, the trace
  	 * point will only record its address.
  	 */
  	trace_workqueue_execute_end(work);
a62428c0a   Tejun Heo   workqueue: separa...
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
  	lock_map_release(&lockdep_map);
  	lock_map_release(&cwq->wq->lockdep_map);
  
  	if (unlikely(in_atomic() || lockdep_depth(current) > 0)) {
  		printk(KERN_ERR "BUG: workqueue leaked lock or atomic: "
  		       "%s/0x%08x/%d
  ",
  		       current->comm, preempt_count(), task_pid_nr(current));
  		printk(KERN_ERR "    last function: ");
  		print_symbol("%s
  ", (unsigned long)f);
  		debug_show_held_locks(current);
  		dump_stack();
  	}
8b03ae3cd   Tejun Heo   workqueue: introd...
1798
  	spin_lock_irq(&gcwq->lock);
a62428c0a   Tejun Heo   workqueue: separa...
1799

fb0e7beb5   Tejun Heo   workqueue: implem...
1800
1801
1802
  	/* clear cpu intensive status */
  	if (unlikely(cpu_intensive))
  		worker_clr_flags(worker, WORKER_CPU_INTENSIVE);
a62428c0a   Tejun Heo   workqueue: separa...
1803
  	/* we're done with it, release */
c8e55f360   Tejun Heo   workqueue: implem...
1804
  	hlist_del_init(&worker->hentry);
c34056a3f   Tejun Heo   workqueue: introd...
1805
  	worker->current_work = NULL;
8cca0eea3   Tejun Heo   workqueue: add fi...
1806
  	worker->current_cwq = NULL;
8a2e8e5de   Tejun Heo   workqueue: fix cw...
1807
  	cwq_dec_nr_in_flight(cwq, work_color, false);
a62428c0a   Tejun Heo   workqueue: separa...
1808
  }
affee4b29   Tejun Heo   workqueue: reimpl...
1809
1810
1811
1812
1813
1814
1815
1816
1817
  /**
   * process_scheduled_works - process scheduled works
   * @worker: self
   *
   * Process all scheduled works.  Please note that the scheduled list
   * may change while processing a work, so this function repeatedly
   * fetches a work from the top and executes it.
   *
   * CONTEXT:
8b03ae3cd   Tejun Heo   workqueue: introd...
1818
   * spin_lock_irq(gcwq->lock) which may be released and regrabbed
affee4b29   Tejun Heo   workqueue: reimpl...
1819
1820
1821
   * multiple times.
   */
  static void process_scheduled_works(struct worker *worker)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1822
  {
affee4b29   Tejun Heo   workqueue: reimpl...
1823
1824
  	while (!list_empty(&worker->scheduled)) {
  		struct work_struct *work = list_first_entry(&worker->scheduled,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1825
  						struct work_struct, entry);
c34056a3f   Tejun Heo   workqueue: introd...
1826
  		process_one_work(worker, work);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1827
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1828
  }
4690c4ab5   Tejun Heo   workqueue: misc/c...
1829
1830
  /**
   * worker_thread - the worker thread function
c34056a3f   Tejun Heo   workqueue: introd...
1831
   * @__worker: self
4690c4ab5   Tejun Heo   workqueue: misc/c...
1832
   *
e22bee782   Tejun Heo   workqueue: implem...
1833
1834
1835
1836
1837
   * The gcwq worker thread function.  There's a single dynamic pool of
   * these per each cpu.  These workers process all works regardless of
   * their specific target workqueue.  The only exception is works which
   * belong to workqueues with a rescuer which will be explained in
   * rescuer_thread().
4690c4ab5   Tejun Heo   workqueue: misc/c...
1838
   */
c34056a3f   Tejun Heo   workqueue: introd...
1839
  static int worker_thread(void *__worker)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1840
  {
c34056a3f   Tejun Heo   workqueue: introd...
1841
  	struct worker *worker = __worker;
8b03ae3cd   Tejun Heo   workqueue: introd...
1842
  	struct global_cwq *gcwq = worker->gcwq;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1843

e22bee782   Tejun Heo   workqueue: implem...
1844
1845
  	/* tell the scheduler that this is a workqueue worker */
  	worker->task->flags |= PF_WQ_WORKER;
c8e55f360   Tejun Heo   workqueue: implem...
1846
  woke_up:
c8e55f360   Tejun Heo   workqueue: implem...
1847
  	spin_lock_irq(&gcwq->lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1848

c8e55f360   Tejun Heo   workqueue: implem...
1849
1850
1851
  	/* DIE can be set only while we're idle, checking here is enough */
  	if (worker->flags & WORKER_DIE) {
  		spin_unlock_irq(&gcwq->lock);
e22bee782   Tejun Heo   workqueue: implem...
1852
  		worker->task->flags &= ~PF_WQ_WORKER;
c8e55f360   Tejun Heo   workqueue: implem...
1853
1854
  		return 0;
  	}
affee4b29   Tejun Heo   workqueue: reimpl...
1855

c8e55f360   Tejun Heo   workqueue: implem...
1856
  	worker_leave_idle(worker);
db7bccf45   Tejun Heo   workqueue: reimpl...
1857
  recheck:
e22bee782   Tejun Heo   workqueue: implem...
1858
1859
1860
1861
1862
1863
1864
  	/* no more worker necessary? */
  	if (!need_more_worker(gcwq))
  		goto sleep;
  
  	/* do we need to manage? */
  	if (unlikely(!may_start_working(gcwq)) && manage_workers(worker))
  		goto recheck;
c8e55f360   Tejun Heo   workqueue: implem...
1865
1866
1867
1868
1869
1870
  	/*
  	 * ->scheduled list can only be filled while a worker is
  	 * preparing to process a work or actually processing it.
  	 * Make sure nobody diddled with it while I was sleeping.
  	 */
  	BUG_ON(!list_empty(&worker->scheduled));
e22bee782   Tejun Heo   workqueue: implem...
1871
1872
1873
1874
1875
1876
1877
1878
  	/*
  	 * When control reaches this point, we're guaranteed to have
  	 * at least one idle worker or that someone else has already
  	 * assumed the manager role.
  	 */
  	worker_clr_flags(worker, WORKER_PREP);
  
  	do {
c8e55f360   Tejun Heo   workqueue: implem...
1879
  		struct work_struct *work =
7e11629d0   Tejun Heo   workqueue: use sh...
1880
  			list_first_entry(&gcwq->worklist,
c8e55f360   Tejun Heo   workqueue: implem...
1881
1882
1883
1884
1885
1886
  					 struct work_struct, entry);
  
  		if (likely(!(*work_data_bits(work) & WORK_STRUCT_LINKED))) {
  			/* optimization path, not strictly necessary */
  			process_one_work(worker, work);
  			if (unlikely(!list_empty(&worker->scheduled)))
affee4b29   Tejun Heo   workqueue: reimpl...
1887
  				process_scheduled_works(worker);
c8e55f360   Tejun Heo   workqueue: implem...
1888
1889
1890
  		} else {
  			move_linked_works(work, &worker->scheduled, NULL);
  			process_scheduled_works(worker);
affee4b29   Tejun Heo   workqueue: reimpl...
1891
  		}
e22bee782   Tejun Heo   workqueue: implem...
1892
1893
1894
  	} while (keep_working(gcwq));
  
  	worker_set_flags(worker, WORKER_PREP, false);
d313dd85a   Tejun Heo   workqueue: fix wo...
1895
  sleep:
e22bee782   Tejun Heo   workqueue: implem...
1896
1897
  	if (unlikely(need_to_manage_workers(gcwq)) && manage_workers(worker))
  		goto recheck;
d313dd85a   Tejun Heo   workqueue: fix wo...
1898

c8e55f360   Tejun Heo   workqueue: implem...
1899
  	/*
e22bee782   Tejun Heo   workqueue: implem...
1900
1901
1902
1903
1904
  	 * gcwq->lock is held and there's no work to process and no
  	 * need to manage, sleep.  Workers are woken up only while
  	 * holding gcwq->lock or from local cpu, so setting the
  	 * current state before releasing gcwq->lock is enough to
  	 * prevent losing any event.
c8e55f360   Tejun Heo   workqueue: implem...
1905
1906
1907
1908
1909
1910
  	 */
  	worker_enter_idle(worker);
  	__set_current_state(TASK_INTERRUPTIBLE);
  	spin_unlock_irq(&gcwq->lock);
  	schedule();
  	goto woke_up;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1911
  }
e22bee782   Tejun Heo   workqueue: implem...
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
  /**
   * rescuer_thread - the rescuer thread function
   * @__wq: the associated workqueue
   *
   * Workqueue rescuer thread function.  There's one rescuer for each
   * workqueue which has WQ_RESCUER set.
   *
   * Regular work processing on a gcwq may block trying to create a new
   * worker which uses GFP_KERNEL allocation which has slight chance of
   * developing into deadlock if some works currently on the same queue
   * need to be processed to satisfy the GFP_KERNEL allocation.  This is
   * the problem rescuer solves.
   *
   * When such condition is possible, the gcwq summons rescuers of all
   * workqueues which have works queued on the gcwq and let them process
   * those works so that forward progress can be guaranteed.
   *
   * This should happen rarely.
   */
  static int rescuer_thread(void *__wq)
  {
  	struct workqueue_struct *wq = __wq;
  	struct worker *rescuer = wq->rescuer;
  	struct list_head *scheduled = &rescuer->scheduled;
f34217977   Tejun Heo   workqueue: implem...
1936
  	bool is_unbound = wq->flags & WQ_UNBOUND;
e22bee782   Tejun Heo   workqueue: implem...
1937
1938
1939
1940
1941
1942
1943
1944
  	unsigned int cpu;
  
  	set_user_nice(current, RESCUER_NICE_LEVEL);
  repeat:
  	set_current_state(TASK_INTERRUPTIBLE);
  
  	if (kthread_should_stop())
  		return 0;
f34217977   Tejun Heo   workqueue: implem...
1945
1946
1947
1948
  	/*
  	 * See whether any cpu is asking for help.  Unbounded
  	 * workqueues use cpu 0 in mayday_mask for CPU_UNBOUND.
  	 */
f2e005aaf   Tejun Heo   workqueue: fix ma...
1949
  	for_each_mayday_cpu(cpu, wq->mayday_mask) {
f34217977   Tejun Heo   workqueue: implem...
1950
1951
  		unsigned int tcpu = is_unbound ? WORK_CPU_UNBOUND : cpu;
  		struct cpu_workqueue_struct *cwq = get_cwq(tcpu, wq);
e22bee782   Tejun Heo   workqueue: implem...
1952
1953
1954
1955
  		struct global_cwq *gcwq = cwq->gcwq;
  		struct work_struct *work, *n;
  
  		__set_current_state(TASK_RUNNING);
f2e005aaf   Tejun Heo   workqueue: fix ma...
1956
  		mayday_clear_cpu(cpu, wq->mayday_mask);
e22bee782   Tejun Heo   workqueue: implem...
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
  
  		/* migrate to the target cpu if possible */
  		rescuer->gcwq = gcwq;
  		worker_maybe_bind_and_lock(rescuer);
  
  		/*
  		 * Slurp in all works issued via this workqueue and
  		 * process'em.
  		 */
  		BUG_ON(!list_empty(&rescuer->scheduled));
  		list_for_each_entry_safe(work, n, &gcwq->worklist, entry)
  			if (get_work_cwq(work) == cwq)
  				move_linked_works(work, scheduled, &n);
  
  		process_scheduled_works(rescuer);
  		spin_unlock_irq(&gcwq->lock);
  	}
  
  	schedule();
  	goto repeat;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1977
  }
fc2e4d704   Oleg Nesterov   reimplement flush...
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
  struct wq_barrier {
  	struct work_struct	work;
  	struct completion	done;
  };
  
  static void wq_barrier_func(struct work_struct *work)
  {
  	struct wq_barrier *barr = container_of(work, struct wq_barrier, work);
  	complete(&barr->done);
  }
4690c4ab5   Tejun Heo   workqueue: misc/c...
1988
1989
1990
1991
  /**
   * insert_wq_barrier - insert a barrier work
   * @cwq: cwq to insert barrier into
   * @barr: wq_barrier to insert
affee4b29   Tejun Heo   workqueue: reimpl...
1992
1993
   * @target: target work to attach @barr to
   * @worker: worker currently executing @target, NULL if @target is not executing
4690c4ab5   Tejun Heo   workqueue: misc/c...
1994
   *
affee4b29   Tejun Heo   workqueue: reimpl...
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
   * @barr is linked to @target such that @barr is completed only after
   * @target finishes execution.  Please note that the ordering
   * guarantee is observed only with respect to @target and on the local
   * cpu.
   *
   * Currently, a queued barrier can't be canceled.  This is because
   * try_to_grab_pending() can't determine whether the work to be
   * grabbed is at the head of the queue and thus can't clear LINKED
   * flag of the previous work while there must be a valid next work
   * after a work with LINKED flag set.
   *
   * Note that when @worker is non-NULL, @target may be modified
   * underneath us, so we can't reliably determine cwq from @target.
4690c4ab5   Tejun Heo   workqueue: misc/c...
2008
2009
   *
   * CONTEXT:
8b03ae3cd   Tejun Heo   workqueue: introd...
2010
   * spin_lock_irq(gcwq->lock).
4690c4ab5   Tejun Heo   workqueue: misc/c...
2011
   */
83c22520c   Oleg Nesterov   flush_cpu_workque...
2012
  static void insert_wq_barrier(struct cpu_workqueue_struct *cwq,
affee4b29   Tejun Heo   workqueue: reimpl...
2013
2014
  			      struct wq_barrier *barr,
  			      struct work_struct *target, struct worker *worker)
fc2e4d704   Oleg Nesterov   reimplement flush...
2015
  {
affee4b29   Tejun Heo   workqueue: reimpl...
2016
2017
  	struct list_head *head;
  	unsigned int linked = 0;
dc186ad74   Thomas Gleixner   workqueue: Add de...
2018
  	/*
8b03ae3cd   Tejun Heo   workqueue: introd...
2019
  	 * debugobject calls are safe here even with gcwq->lock locked
dc186ad74   Thomas Gleixner   workqueue: Add de...
2020
2021
2022
2023
  	 * as we know for sure that this will not trigger any of the
  	 * checks and call back into the fixup functions where we
  	 * might deadlock.
  	 */
ca1cab37d   Andrew Morton   workqueues: s/ON_...
2024
  	INIT_WORK_ONSTACK(&barr->work, wq_barrier_func);
22df02bb3   Tejun Heo   workqueue: define...
2025
  	__set_bit(WORK_STRUCT_PENDING_BIT, work_data_bits(&barr->work));
fc2e4d704   Oleg Nesterov   reimplement flush...
2026
  	init_completion(&barr->done);
83c22520c   Oleg Nesterov   flush_cpu_workque...
2027

affee4b29   Tejun Heo   workqueue: reimpl...
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
  	/*
  	 * If @target is currently being executed, schedule the
  	 * barrier to the worker; otherwise, put it after @target.
  	 */
  	if (worker)
  		head = worker->scheduled.next;
  	else {
  		unsigned long *bits = work_data_bits(target);
  
  		head = target->entry.next;
  		/* there can already be other linked works, inherit and set */
  		linked = *bits & WORK_STRUCT_LINKED;
  		__set_bit(WORK_STRUCT_LINKED_BIT, bits);
  	}
dc186ad74   Thomas Gleixner   workqueue: Add de...
2042
  	debug_work_activate(&barr->work);
affee4b29   Tejun Heo   workqueue: reimpl...
2043
2044
  	insert_work(cwq, &barr->work, head,
  		    work_color_to_flags(WORK_NO_COLOR) | linked);
fc2e4d704   Oleg Nesterov   reimplement flush...
2045
  }
73f53c4aa   Tejun Heo   workqueue: reimpl...
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
  /**
   * flush_workqueue_prep_cwqs - prepare cwqs for workqueue flushing
   * @wq: workqueue being flushed
   * @flush_color: new flush color, < 0 for no-op
   * @work_color: new work color, < 0 for no-op
   *
   * Prepare cwqs for workqueue flushing.
   *
   * If @flush_color is non-negative, flush_color on all cwqs should be
   * -1.  If no cwq has in-flight commands at the specified color, all
   * cwq->flush_color's stay at -1 and %false is returned.  If any cwq
   * has in flight commands, its cwq->flush_color is set to
   * @flush_color, @wq->nr_cwqs_to_flush is updated accordingly, cwq
   * wakeup logic is armed and %true is returned.
   *
   * The caller should have initialized @wq->first_flusher prior to
   * calling this function with non-negative @flush_color.  If
   * @flush_color is negative, no flush color update is done and %false
   * is returned.
   *
   * If @work_color is non-negative, all cwqs should have the same
   * work_color which is previous to @work_color and all will be
   * advanced to @work_color.
   *
   * CONTEXT:
   * mutex_lock(wq->flush_mutex).
   *
   * RETURNS:
   * %true if @flush_color >= 0 and there's something to flush.  %false
   * otherwise.
   */
  static bool flush_workqueue_prep_cwqs(struct workqueue_struct *wq,
  				      int flush_color, int work_color)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2079
  {
73f53c4aa   Tejun Heo   workqueue: reimpl...
2080
2081
  	bool wait = false;
  	unsigned int cpu;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2082

73f53c4aa   Tejun Heo   workqueue: reimpl...
2083
2084
2085
  	if (flush_color >= 0) {
  		BUG_ON(atomic_read(&wq->nr_cwqs_to_flush));
  		atomic_set(&wq->nr_cwqs_to_flush, 1);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2086
  	}
2355b70fd   Lai Jiangshan   workqueue: avoid ...
2087

f34217977   Tejun Heo   workqueue: implem...
2088
  	for_each_cwq_cpu(cpu, wq) {
73f53c4aa   Tejun Heo   workqueue: reimpl...
2089
  		struct cpu_workqueue_struct *cwq = get_cwq(cpu, wq);
8b03ae3cd   Tejun Heo   workqueue: introd...
2090
  		struct global_cwq *gcwq = cwq->gcwq;
fc2e4d704   Oleg Nesterov   reimplement flush...
2091

8b03ae3cd   Tejun Heo   workqueue: introd...
2092
  		spin_lock_irq(&gcwq->lock);
83c22520c   Oleg Nesterov   flush_cpu_workque...
2093

73f53c4aa   Tejun Heo   workqueue: reimpl...
2094
2095
  		if (flush_color >= 0) {
  			BUG_ON(cwq->flush_color != -1);
fc2e4d704   Oleg Nesterov   reimplement flush...
2096

73f53c4aa   Tejun Heo   workqueue: reimpl...
2097
2098
2099
2100
2101
2102
  			if (cwq->nr_in_flight[flush_color]) {
  				cwq->flush_color = flush_color;
  				atomic_inc(&wq->nr_cwqs_to_flush);
  				wait = true;
  			}
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2103

73f53c4aa   Tejun Heo   workqueue: reimpl...
2104
2105
2106
2107
  		if (work_color >= 0) {
  			BUG_ON(work_color != work_next_color(cwq->work_color));
  			cwq->work_color = work_color;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2108

8b03ae3cd   Tejun Heo   workqueue: introd...
2109
  		spin_unlock_irq(&gcwq->lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2110
  	}
2355b70fd   Lai Jiangshan   workqueue: avoid ...
2111

73f53c4aa   Tejun Heo   workqueue: reimpl...
2112
2113
  	if (flush_color >= 0 && atomic_dec_and_test(&wq->nr_cwqs_to_flush))
  		complete(&wq->first_flusher->done);
14441960e   Oleg Nesterov   simplify cleanup_...
2114

73f53c4aa   Tejun Heo   workqueue: reimpl...
2115
  	return wait;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2116
  }
0fcb78c22   Rolf Eike Beer   [PATCH] Add DocBo...
2117
  /**
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2118
   * flush_workqueue - ensure that any scheduled work has run to completion.
0fcb78c22   Rolf Eike Beer   [PATCH] Add DocBo...
2119
   * @wq: workqueue to flush
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2120
2121
2122
2123
   *
   * Forces execution of the workqueue and blocks until its completion.
   * This is typically used in driver shutdown handlers.
   *
fc2e4d704   Oleg Nesterov   reimplement flush...
2124
2125
   * We sleep until all works which were queued on entry have been handled,
   * but we are not livelocked by new incoming ones.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2126
   */
7ad5b3a50   Harvey Harrison   kernel: remove fa...
2127
  void flush_workqueue(struct workqueue_struct *wq)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2128
  {
73f53c4aa   Tejun Heo   workqueue: reimpl...
2129
2130
2131
2132
2133
2134
  	struct wq_flusher this_flusher = {
  		.list = LIST_HEAD_INIT(this_flusher.list),
  		.flush_color = -1,
  		.done = COMPLETION_INITIALIZER_ONSTACK(this_flusher.done),
  	};
  	int next_color;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2135

3295f0ef9   Ingo Molnar   lockdep: rename m...
2136
2137
  	lock_map_acquire(&wq->lockdep_map);
  	lock_map_release(&wq->lockdep_map);
73f53c4aa   Tejun Heo   workqueue: reimpl...
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
  
  	mutex_lock(&wq->flush_mutex);
  
  	/*
  	 * Start-to-wait phase
  	 */
  	next_color = work_next_color(wq->work_color);
  
  	if (next_color != wq->flush_color) {
  		/*
  		 * Color space is not full.  The current work_color
  		 * becomes our flush_color and work_color is advanced
  		 * by one.
  		 */
  		BUG_ON(!list_empty(&wq->flusher_overflow));
  		this_flusher.flush_color = wq->work_color;
  		wq->work_color = next_color;
  
  		if (!wq->first_flusher) {
  			/* no flush in progress, become the first flusher */
  			BUG_ON(wq->flush_color != this_flusher.flush_color);
  
  			wq->first_flusher = &this_flusher;
  
  			if (!flush_workqueue_prep_cwqs(wq, wq->flush_color,
  						       wq->work_color)) {
  				/* nothing to flush, done */
  				wq->flush_color = next_color;
  				wq->first_flusher = NULL;
  				goto out_unlock;
  			}
  		} else {
  			/* wait in queue */
  			BUG_ON(wq->flush_color == this_flusher.flush_color);
  			list_add_tail(&this_flusher.list, &wq->flusher_queue);
  			flush_workqueue_prep_cwqs(wq, -1, wq->work_color);
  		}
  	} else {
  		/*
  		 * Oops, color space is full, wait on overflow queue.
  		 * The next flush completion will assign us
  		 * flush_color and transfer to flusher_queue.
  		 */
  		list_add_tail(&this_flusher.list, &wq->flusher_overflow);
  	}
  
  	mutex_unlock(&wq->flush_mutex);
  
  	wait_for_completion(&this_flusher.done);
  
  	/*
  	 * Wake-up-and-cascade phase
  	 *
  	 * First flushers are responsible for cascading flushes and
  	 * handling overflow.  Non-first flushers can simply return.
  	 */
  	if (wq->first_flusher != &this_flusher)
  		return;
  
  	mutex_lock(&wq->flush_mutex);
4ce48b37b   Tejun Heo   workqueue: fix ra...
2198
2199
2200
  	/* we might have raced, check again with mutex held */
  	if (wq->first_flusher != &this_flusher)
  		goto out_unlock;
73f53c4aa   Tejun Heo   workqueue: reimpl...
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
  	wq->first_flusher = NULL;
  
  	BUG_ON(!list_empty(&this_flusher.list));
  	BUG_ON(wq->flush_color != this_flusher.flush_color);
  
  	while (true) {
  		struct wq_flusher *next, *tmp;
  
  		/* complete all the flushers sharing the current flush color */
  		list_for_each_entry_safe(next, tmp, &wq->flusher_queue, list) {
  			if (next->flush_color != wq->flush_color)
  				break;
  			list_del_init(&next->list);
  			complete(&next->done);
  		}
  
  		BUG_ON(!list_empty(&wq->flusher_overflow) &&
  		       wq->flush_color != work_next_color(wq->work_color));
  
  		/* this flush_color is finished, advance by one */
  		wq->flush_color = work_next_color(wq->flush_color);
  
  		/* one color has been freed, handle overflow queue */
  		if (!list_empty(&wq->flusher_overflow)) {
  			/*
  			 * Assign the same color to all overflowed
  			 * flushers, advance work_color and append to
  			 * flusher_queue.  This is the start-to-wait
  			 * phase for these overflowed flushers.
  			 */
  			list_for_each_entry(tmp, &wq->flusher_overflow, list)
  				tmp->flush_color = wq->work_color;
  
  			wq->work_color = work_next_color(wq->work_color);
  
  			list_splice_tail_init(&wq->flusher_overflow,
  					      &wq->flusher_queue);
  			flush_workqueue_prep_cwqs(wq, -1, wq->work_color);
  		}
  
  		if (list_empty(&wq->flusher_queue)) {
  			BUG_ON(wq->flush_color != wq->work_color);
  			break;
  		}
  
  		/*
  		 * Need to flush more colors.  Make the next flusher
  		 * the new first flusher and arm cwqs.
  		 */
  		BUG_ON(wq->flush_color == wq->work_color);
  		BUG_ON(wq->flush_color != next->flush_color);
  
  		list_del_init(&next->list);
  		wq->first_flusher = next;
  
  		if (flush_workqueue_prep_cwqs(wq, wq->flush_color, -1))
  			break;
  
  		/*
  		 * Meh... this color is already done, clear first
  		 * flusher and repeat cascading.
  		 */
  		wq->first_flusher = NULL;
  	}
  
  out_unlock:
  	mutex_unlock(&wq->flush_mutex);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2268
  }
ae90dd5db   Dave Jones   Move workqueue ex...
2269
  EXPORT_SYMBOL_GPL(flush_workqueue);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2270

baf59022c   Tejun Heo   workqueue: factor...
2271
2272
  static bool start_flush_work(struct work_struct *work, struct wq_barrier *barr,
  			     bool wait_executing)
db7008972   Oleg Nesterov   workqueues: imple...
2273
  {
affee4b29   Tejun Heo   workqueue: reimpl...
2274
  	struct worker *worker = NULL;
8b03ae3cd   Tejun Heo   workqueue: introd...
2275
  	struct global_cwq *gcwq;
db7008972   Oleg Nesterov   workqueues: imple...
2276
  	struct cpu_workqueue_struct *cwq;
db7008972   Oleg Nesterov   workqueues: imple...
2277
2278
  
  	might_sleep();
7a22ad757   Tejun Heo   workqueue: carry ...
2279
2280
  	gcwq = get_work_gcwq(work);
  	if (!gcwq)
baf59022c   Tejun Heo   workqueue: factor...
2281
  		return false;
db7008972   Oleg Nesterov   workqueues: imple...
2282

8b03ae3cd   Tejun Heo   workqueue: introd...
2283
  	spin_lock_irq(&gcwq->lock);
db7008972   Oleg Nesterov   workqueues: imple...
2284
2285
2286
  	if (!list_empty(&work->entry)) {
  		/*
  		 * See the comment near try_to_grab_pending()->smp_rmb().
7a22ad757   Tejun Heo   workqueue: carry ...
2287
2288
  		 * If it was re-queued to a different gcwq under us, we
  		 * are not going to wait.
db7008972   Oleg Nesterov   workqueues: imple...
2289
2290
  		 */
  		smp_rmb();
7a22ad757   Tejun Heo   workqueue: carry ...
2291
2292
  		cwq = get_work_cwq(work);
  		if (unlikely(!cwq || gcwq != cwq->gcwq))
4690c4ab5   Tejun Heo   workqueue: misc/c...
2293
  			goto already_gone;
baf59022c   Tejun Heo   workqueue: factor...
2294
  	} else if (wait_executing) {
7a22ad757   Tejun Heo   workqueue: carry ...
2295
  		worker = find_worker_executing_work(gcwq, work);
affee4b29   Tejun Heo   workqueue: reimpl...
2296
  		if (!worker)
4690c4ab5   Tejun Heo   workqueue: misc/c...
2297
  			goto already_gone;
7a22ad757   Tejun Heo   workqueue: carry ...
2298
  		cwq = worker->current_cwq;
baf59022c   Tejun Heo   workqueue: factor...
2299
2300
  	} else
  		goto already_gone;
db7008972   Oleg Nesterov   workqueues: imple...
2301

baf59022c   Tejun Heo   workqueue: factor...
2302
  	insert_wq_barrier(cwq, barr, work, worker);
8b03ae3cd   Tejun Heo   workqueue: introd...
2303
  	spin_unlock_irq(&gcwq->lock);
7a22ad757   Tejun Heo   workqueue: carry ...
2304

e159489ba   Tejun Heo   workqueue: relax ...
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
  	/*
  	 * If @max_active is 1 or rescuer is in use, flushing another work
  	 * item on the same workqueue may lead to deadlock.  Make sure the
  	 * flusher is not running on the same workqueue by verifying write
  	 * access.
  	 */
  	if (cwq->wq->saved_max_active == 1 || cwq->wq->flags & WQ_RESCUER)
  		lock_map_acquire(&cwq->wq->lockdep_map);
  	else
  		lock_map_acquire_read(&cwq->wq->lockdep_map);
7a22ad757   Tejun Heo   workqueue: carry ...
2315
  	lock_map_release(&cwq->wq->lockdep_map);
e159489ba   Tejun Heo   workqueue: relax ...
2316

401a8d048   Tejun Heo   workqueue: cleanu...
2317
  	return true;
4690c4ab5   Tejun Heo   workqueue: misc/c...
2318
  already_gone:
8b03ae3cd   Tejun Heo   workqueue: introd...
2319
  	spin_unlock_irq(&gcwq->lock);
401a8d048   Tejun Heo   workqueue: cleanu...
2320
  	return false;
db7008972   Oleg Nesterov   workqueues: imple...
2321
  }
baf59022c   Tejun Heo   workqueue: factor...
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
  
  /**
   * flush_work - wait for a work to finish executing the last queueing instance
   * @work: the work to flush
   *
   * Wait until @work has finished execution.  This function considers
   * only the last queueing instance of @work.  If @work has been
   * enqueued across different CPUs on a non-reentrant workqueue or on
   * multiple workqueues, @work might still be executing on return on
   * some of the CPUs from earlier queueing.
   *
   * If @work was queued only on a non-reentrant, ordered or unbound
   * workqueue, @work is guaranteed to be idle on return if it hasn't
   * been requeued since flush started.
   *
   * RETURNS:
   * %true if flush_work() waited for the work to finish execution,
   * %false if it was already idle.
   */
  bool flush_work(struct work_struct *work)
  {
  	struct wq_barrier barr;
  
  	if (start_flush_work(work, &barr, true)) {
  		wait_for_completion(&barr.done);
  		destroy_work_on_stack(&barr.work);
  		return true;
  	} else
  		return false;
  }
db7008972   Oleg Nesterov   workqueues: imple...
2352
  EXPORT_SYMBOL_GPL(flush_work);
401a8d048   Tejun Heo   workqueue: cleanu...
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
  static bool wait_on_cpu_work(struct global_cwq *gcwq, struct work_struct *work)
  {
  	struct wq_barrier barr;
  	struct worker *worker;
  
  	spin_lock_irq(&gcwq->lock);
  
  	worker = find_worker_executing_work(gcwq, work);
  	if (unlikely(worker))
  		insert_wq_barrier(worker->current_cwq, &barr, work, worker);
  
  	spin_unlock_irq(&gcwq->lock);
  
  	if (unlikely(worker)) {
  		wait_for_completion(&barr.done);
  		destroy_work_on_stack(&barr.work);
  		return true;
  	} else
  		return false;
  }
  
  static bool wait_on_work(struct work_struct *work)
  {
  	bool ret = false;
  	int cpu;
  
  	might_sleep();
  
  	lock_map_acquire(&work->lockdep_map);
  	lock_map_release(&work->lockdep_map);
  
  	for_each_gcwq_cpu(cpu)
  		ret |= wait_on_cpu_work(get_gcwq(cpu), work);
  	return ret;
  }
09383498c   Tejun Heo   workqueue: implem...
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
  /**
   * flush_work_sync - wait until a work has finished execution
   * @work: the work to flush
   *
   * Wait until @work has finished execution.  On return, it's
   * guaranteed that all queueing instances of @work which happened
   * before this function is called are finished.  In other words, if
   * @work hasn't been requeued since this function was called, @work is
   * guaranteed to be idle on return.
   *
   * RETURNS:
   * %true if flush_work_sync() waited for the work to finish execution,
   * %false if it was already idle.
   */
  bool flush_work_sync(struct work_struct *work)
  {
  	struct wq_barrier barr;
  	bool pending, waited;
  
  	/* we'll wait for executions separately, queue barr only if pending */
  	pending = start_flush_work(work, &barr, false);
  
  	/* wait for executions to finish */
  	waited = wait_on_work(work);
  
  	/* wait for the pending one */
  	if (pending) {
  		wait_for_completion(&barr.done);
  		destroy_work_on_stack(&barr.work);
  	}
  
  	return pending || waited;
  }
  EXPORT_SYMBOL_GPL(flush_work_sync);
6e84d644b   Oleg Nesterov   make cancel_rearm...
2422
  /*
1f1f642e2   Oleg Nesterov   make cancel_xxx_w...
2423
   * Upon a successful return (>= 0), the caller "owns" WORK_STRUCT_PENDING bit,
6e84d644b   Oleg Nesterov   make cancel_rearm...
2424
2425
2426
2427
   * so this work can't be re-armed in any way.
   */
  static int try_to_grab_pending(struct work_struct *work)
  {
8b03ae3cd   Tejun Heo   workqueue: introd...
2428
  	struct global_cwq *gcwq;
1f1f642e2   Oleg Nesterov   make cancel_xxx_w...
2429
  	int ret = -1;
6e84d644b   Oleg Nesterov   make cancel_rearm...
2430

22df02bb3   Tejun Heo   workqueue: define...
2431
  	if (!test_and_set_bit(WORK_STRUCT_PENDING_BIT, work_data_bits(work)))
1f1f642e2   Oleg Nesterov   make cancel_xxx_w...
2432
  		return 0;
6e84d644b   Oleg Nesterov   make cancel_rearm...
2433
2434
2435
2436
2437
  
  	/*
  	 * The queueing is in progress, or it is already queued. Try to
  	 * steal it from ->worklist without clearing WORK_STRUCT_PENDING.
  	 */
7a22ad757   Tejun Heo   workqueue: carry ...
2438
2439
  	gcwq = get_work_gcwq(work);
  	if (!gcwq)
6e84d644b   Oleg Nesterov   make cancel_rearm...
2440
  		return ret;
8b03ae3cd   Tejun Heo   workqueue: introd...
2441
  	spin_lock_irq(&gcwq->lock);
6e84d644b   Oleg Nesterov   make cancel_rearm...
2442
2443
  	if (!list_empty(&work->entry)) {
  		/*
7a22ad757   Tejun Heo   workqueue: carry ...
2444
  		 * This work is queued, but perhaps we locked the wrong gcwq.
6e84d644b   Oleg Nesterov   make cancel_rearm...
2445
2446
2447
2448
  		 * In that case we must see the new value after rmb(), see
  		 * insert_work()->wmb().
  		 */
  		smp_rmb();
7a22ad757   Tejun Heo   workqueue: carry ...
2449
  		if (gcwq == get_work_gcwq(work)) {
dc186ad74   Thomas Gleixner   workqueue: Add de...
2450
  			debug_work_deactivate(work);
6e84d644b   Oleg Nesterov   make cancel_rearm...
2451
  			list_del_init(&work->entry);
7a22ad757   Tejun Heo   workqueue: carry ...
2452
  			cwq_dec_nr_in_flight(get_work_cwq(work),
8a2e8e5de   Tejun Heo   workqueue: fix cw...
2453
2454
  				get_work_color(work),
  				*work_data_bits(work) & WORK_STRUCT_DELAYED);
6e84d644b   Oleg Nesterov   make cancel_rearm...
2455
2456
2457
  			ret = 1;
  		}
  	}
8b03ae3cd   Tejun Heo   workqueue: introd...
2458
  	spin_unlock_irq(&gcwq->lock);
6e84d644b   Oleg Nesterov   make cancel_rearm...
2459
2460
2461
  
  	return ret;
  }
401a8d048   Tejun Heo   workqueue: cleanu...
2462
  static bool __cancel_work_timer(struct work_struct *work,
1f1f642e2   Oleg Nesterov   make cancel_xxx_w...
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
  				struct timer_list* timer)
  {
  	int ret;
  
  	do {
  		ret = (timer && likely(del_timer(timer)));
  		if (!ret)
  			ret = try_to_grab_pending(work);
  		wait_on_work(work);
  	} while (unlikely(ret < 0));
7a22ad757   Tejun Heo   workqueue: carry ...
2473
  	clear_work_data(work);
1f1f642e2   Oleg Nesterov   make cancel_xxx_w...
2474
2475
  	return ret;
  }
6e84d644b   Oleg Nesterov   make cancel_rearm...
2476
  /**
401a8d048   Tejun Heo   workqueue: cleanu...
2477
2478
   * cancel_work_sync - cancel a work and wait for it to finish
   * @work: the work to cancel
6e84d644b   Oleg Nesterov   make cancel_rearm...
2479
   *
401a8d048   Tejun Heo   workqueue: cleanu...
2480
2481
2482
2483
   * Cancel @work and wait for its execution to finish.  This function
   * can be used even if the work re-queues itself or migrates to
   * another workqueue.  On return from this function, @work is
   * guaranteed to be not pending or executing on any CPU.
1f1f642e2   Oleg Nesterov   make cancel_xxx_w...
2484
   *
401a8d048   Tejun Heo   workqueue: cleanu...
2485
2486
   * cancel_work_sync(&delayed_work->work) must not be used for
   * delayed_work's.  Use cancel_delayed_work_sync() instead.
6e84d644b   Oleg Nesterov   make cancel_rearm...
2487
   *
401a8d048   Tejun Heo   workqueue: cleanu...
2488
   * The caller must ensure that the workqueue on which @work was last
6e84d644b   Oleg Nesterov   make cancel_rearm...
2489
   * queued can't be destroyed before this function returns.
401a8d048   Tejun Heo   workqueue: cleanu...
2490
2491
2492
   *
   * RETURNS:
   * %true if @work was pending, %false otherwise.
6e84d644b   Oleg Nesterov   make cancel_rearm...
2493
   */
401a8d048   Tejun Heo   workqueue: cleanu...
2494
  bool cancel_work_sync(struct work_struct *work)
6e84d644b   Oleg Nesterov   make cancel_rearm...
2495
  {
1f1f642e2   Oleg Nesterov   make cancel_xxx_w...
2496
  	return __cancel_work_timer(work, NULL);
b89deed32   Oleg Nesterov   implement flush_w...
2497
  }
28e53bddf   Oleg Nesterov   unify flush_work/...
2498
  EXPORT_SYMBOL_GPL(cancel_work_sync);
b89deed32   Oleg Nesterov   implement flush_w...
2499

6e84d644b   Oleg Nesterov   make cancel_rearm...
2500
  /**
401a8d048   Tejun Heo   workqueue: cleanu...
2501
2502
   * flush_delayed_work - wait for a dwork to finish executing the last queueing
   * @dwork: the delayed work to flush
6e84d644b   Oleg Nesterov   make cancel_rearm...
2503
   *
401a8d048   Tejun Heo   workqueue: cleanu...
2504
2505
2506
   * Delayed timer is cancelled and the pending work is queued for
   * immediate execution.  Like flush_work(), this function only
   * considers the last queueing instance of @dwork.
1f1f642e2   Oleg Nesterov   make cancel_xxx_w...
2507
   *
401a8d048   Tejun Heo   workqueue: cleanu...
2508
2509
2510
   * RETURNS:
   * %true if flush_work() waited for the work to finish execution,
   * %false if it was already idle.
6e84d644b   Oleg Nesterov   make cancel_rearm...
2511
   */
401a8d048   Tejun Heo   workqueue: cleanu...
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
  bool flush_delayed_work(struct delayed_work *dwork)
  {
  	if (del_timer_sync(&dwork->timer))
  		__queue_work(raw_smp_processor_id(),
  			     get_work_cwq(&dwork->work)->wq, &dwork->work);
  	return flush_work(&dwork->work);
  }
  EXPORT_SYMBOL(flush_delayed_work);
  
  /**
09383498c   Tejun Heo   workqueue: implem...
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
   * flush_delayed_work_sync - wait for a dwork to finish
   * @dwork: the delayed work to flush
   *
   * Delayed timer is cancelled and the pending work is queued for
   * execution immediately.  Other than timer handling, its behavior
   * is identical to flush_work_sync().
   *
   * RETURNS:
   * %true if flush_work_sync() waited for the work to finish execution,
   * %false if it was already idle.
   */
  bool flush_delayed_work_sync(struct delayed_work *dwork)
  {
  	if (del_timer_sync(&dwork->timer))
  		__queue_work(raw_smp_processor_id(),
  			     get_work_cwq(&dwork->work)->wq, &dwork->work);
  	return flush_work_sync(&dwork->work);
  }
  EXPORT_SYMBOL(flush_delayed_work_sync);
  
  /**
401a8d048   Tejun Heo   workqueue: cleanu...
2543
2544
2545
2546
2547
2548
2549
2550
2551
   * cancel_delayed_work_sync - cancel a delayed work and wait for it to finish
   * @dwork: the delayed work cancel
   *
   * This is cancel_work_sync() for delayed works.
   *
   * RETURNS:
   * %true if @dwork was pending, %false otherwise.
   */
  bool cancel_delayed_work_sync(struct delayed_work *dwork)
6e84d644b   Oleg Nesterov   make cancel_rearm...
2552
  {
1f1f642e2   Oleg Nesterov   make cancel_xxx_w...
2553
  	return __cancel_work_timer(&dwork->work, &dwork->timer);
6e84d644b   Oleg Nesterov   make cancel_rearm...
2554
  }
f5a421a45   Oleg Nesterov   rename cancel_rea...
2555
  EXPORT_SYMBOL(cancel_delayed_work_sync);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2556

0fcb78c22   Rolf Eike Beer   [PATCH] Add DocBo...
2557
2558
2559
2560
  /**
   * schedule_work - put work task in global workqueue
   * @work: job to be done
   *
5b0f437df   Bart Van Assche   workqueues: Impro...
2561
2562
2563
2564
2565
2566
   * Returns zero if @work was already on the kernel-global workqueue and
   * non-zero otherwise.
   *
   * This puts a job in the kernel-global workqueue if it was not already
   * queued and leaves it in the same position on the kernel-global
   * workqueue otherwise.
0fcb78c22   Rolf Eike Beer   [PATCH] Add DocBo...
2567
   */
7ad5b3a50   Harvey Harrison   kernel: remove fa...
2568
  int schedule_work(struct work_struct *work)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2569
  {
d320c0383   Tejun Heo   workqueue: s/__cr...
2570
  	return queue_work(system_wq, work);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2571
  }
ae90dd5db   Dave Jones   Move workqueue ex...
2572
  EXPORT_SYMBOL(schedule_work);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2573

c1a220e7a   Zhang Rui   pm: introduce new...
2574
2575
2576
2577
2578
2579
2580
2581
2582
  /*
   * schedule_work_on - put work task on a specific cpu
   * @cpu: cpu to put the work task on
   * @work: job to be done
   *
   * This puts a job on a specific cpu
   */
  int schedule_work_on(int cpu, struct work_struct *work)
  {
d320c0383   Tejun Heo   workqueue: s/__cr...
2583
  	return queue_work_on(cpu, system_wq, work);
c1a220e7a   Zhang Rui   pm: introduce new...
2584
2585
  }
  EXPORT_SYMBOL(schedule_work_on);
0fcb78c22   Rolf Eike Beer   [PATCH] Add DocBo...
2586
2587
  /**
   * schedule_delayed_work - put work task in global workqueue after delay
52bad64d9   David Howells   WorkStruct: Separ...
2588
2589
   * @dwork: job to be done
   * @delay: number of jiffies to wait or 0 for immediate execution
0fcb78c22   Rolf Eike Beer   [PATCH] Add DocBo...
2590
2591
2592
2593
   *
   * After waiting for a given time this puts a job in the kernel-global
   * workqueue.
   */
7ad5b3a50   Harvey Harrison   kernel: remove fa...
2594
  int schedule_delayed_work(struct delayed_work *dwork,
82f67cd9f   Ingo Molnar   [PATCH] Add debug...
2595
  					unsigned long delay)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2596
  {
d320c0383   Tejun Heo   workqueue: s/__cr...
2597
  	return queue_delayed_work(system_wq, dwork, delay);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2598
  }
ae90dd5db   Dave Jones   Move workqueue ex...
2599
  EXPORT_SYMBOL(schedule_delayed_work);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2600

0fcb78c22   Rolf Eike Beer   [PATCH] Add DocBo...
2601
2602
2603
  /**
   * schedule_delayed_work_on - queue work in global workqueue on CPU after delay
   * @cpu: cpu to use
52bad64d9   David Howells   WorkStruct: Separ...
2604
   * @dwork: job to be done
0fcb78c22   Rolf Eike Beer   [PATCH] Add DocBo...
2605
2606
2607
2608
2609
   * @delay: number of jiffies to wait
   *
   * After waiting for a given time this puts a job in the kernel-global
   * workqueue on the specified CPU.
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2610
  int schedule_delayed_work_on(int cpu,
52bad64d9   David Howells   WorkStruct: Separ...
2611
  			struct delayed_work *dwork, unsigned long delay)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2612
  {
d320c0383   Tejun Heo   workqueue: s/__cr...
2613
  	return queue_delayed_work_on(cpu, system_wq, dwork, delay);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2614
  }
ae90dd5db   Dave Jones   Move workqueue ex...
2615
  EXPORT_SYMBOL(schedule_delayed_work_on);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2616

b61367732   Andrew Morton   [PATCH] schedule_...
2617
  /**
31ddd871f   Tejun Heo   workqueue: Clarif...
2618
   * schedule_on_each_cpu - execute a function synchronously on each online CPU
b61367732   Andrew Morton   [PATCH] schedule_...
2619
   * @func: the function to call
b61367732   Andrew Morton   [PATCH] schedule_...
2620
   *
31ddd871f   Tejun Heo   workqueue: Clarif...
2621
2622
   * schedule_on_each_cpu() executes @func on each online CPU using the
   * system workqueue and blocks until all CPUs have completed.
b61367732   Andrew Morton   [PATCH] schedule_...
2623
   * schedule_on_each_cpu() is very slow.
31ddd871f   Tejun Heo   workqueue: Clarif...
2624
2625
2626
   *
   * RETURNS:
   * 0 on success, -errno on failure.
b61367732   Andrew Morton   [PATCH] schedule_...
2627
   */
65f27f384   David Howells   WorkStruct: Pass ...
2628
  int schedule_on_each_cpu(work_func_t func)
15316ba81   Christoph Lameter   [PATCH] add sched...
2629
2630
  {
  	int cpu;
38f515680   Namhyung Kim   workqueue: add mi...
2631
  	struct work_struct __percpu *works;
15316ba81   Christoph Lameter   [PATCH] add sched...
2632

b61367732   Andrew Morton   [PATCH] schedule_...
2633
2634
  	works = alloc_percpu(struct work_struct);
  	if (!works)
15316ba81   Christoph Lameter   [PATCH] add sched...
2635
  		return -ENOMEM;
b61367732   Andrew Morton   [PATCH] schedule_...
2636

939818009   Tejun Heo   workqueue: fix ra...
2637
  	get_online_cpus();
15316ba81   Christoph Lameter   [PATCH] add sched...
2638
  	for_each_online_cpu(cpu) {
9bfb18392   Ingo Molnar   [PATCH] workqueue...
2639
2640
2641
  		struct work_struct *work = per_cpu_ptr(works, cpu);
  
  		INIT_WORK(work, func);
b71ab8c20   Tejun Heo   workqueue: increa...
2642
  		schedule_work_on(cpu, work);
65a644643   Andi Kleen   HWPOISON: Allow s...
2643
  	}
939818009   Tejun Heo   workqueue: fix ra...
2644
2645
2646
  
  	for_each_online_cpu(cpu)
  		flush_work(per_cpu_ptr(works, cpu));
95402b382   Gautham R Shenoy   cpu-hotplug: repl...
2647
  	put_online_cpus();
b61367732   Andrew Morton   [PATCH] schedule_...
2648
  	free_percpu(works);
15316ba81   Christoph Lameter   [PATCH] add sched...
2649
2650
  	return 0;
  }
eef6a7d5c   Alan Stern   workqueue: warn a...
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
  /**
   * flush_scheduled_work - ensure that any scheduled work has run to completion.
   *
   * Forces execution of the kernel-global workqueue and blocks until its
   * completion.
   *
   * Think twice before calling this function!  It's very easy to get into
   * trouble if you don't take great care.  Either of the following situations
   * will lead to deadlock:
   *
   *	One of the work items currently on the workqueue needs to acquire
   *	a lock held by your code or its caller.
   *
   *	Your code is running in the context of a work routine.
   *
   * They will be detected by lockdep when they occur, but the first might not
   * occur very often.  It depends on what work items are on the workqueue and
   * what locks they need, which you have no control over.
   *
   * In most situations flushing the entire workqueue is overkill; you merely
   * need to know that a particular work item isn't queued and isn't running.
   * In such cases you should use cancel_delayed_work_sync() or
   * cancel_work_sync() instead.
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2675
2676
  void flush_scheduled_work(void)
  {
d320c0383   Tejun Heo   workqueue: s/__cr...
2677
  	flush_workqueue(system_wq);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2678
  }
ae90dd5db   Dave Jones   Move workqueue ex...
2679
  EXPORT_SYMBOL(flush_scheduled_work);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2680
2681
  
  /**
1fa44ecad   James Bottomley   [SCSI] add execut...
2682
2683
   * execute_in_process_context - reliably execute the routine with user context
   * @fn:		the function to execute
1fa44ecad   James Bottomley   [SCSI] add execut...
2684
2685
2686
2687
2688
2689
2690
2691
2692
   * @ew:		guaranteed storage for the execute work structure (must
   *		be available when the work executes)
   *
   * Executes the function immediately if process context is available,
   * otherwise schedules the function for delayed execution.
   *
   * Returns:	0 - function was executed
   *		1 - function was scheduled for execution
   */
65f27f384   David Howells   WorkStruct: Pass ...
2693
  int execute_in_process_context(work_func_t fn, struct execute_work *ew)
1fa44ecad   James Bottomley   [SCSI] add execut...
2694
2695
  {
  	if (!in_interrupt()) {
65f27f384   David Howells   WorkStruct: Pass ...
2696
  		fn(&ew->work);
1fa44ecad   James Bottomley   [SCSI] add execut...
2697
2698
  		return 0;
  	}
65f27f384   David Howells   WorkStruct: Pass ...
2699
  	INIT_WORK(&ew->work, fn);
1fa44ecad   James Bottomley   [SCSI] add execut...
2700
2701
2702
2703
2704
  	schedule_work(&ew->work);
  
  	return 1;
  }
  EXPORT_SYMBOL_GPL(execute_in_process_context);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2705
2706
  int keventd_up(void)
  {
d320c0383   Tejun Heo   workqueue: s/__cr...
2707
  	return system_wq != NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2708
  }
bdbc5dd7d   Tejun Heo   workqueue: prepar...
2709
  static int alloc_cwqs(struct workqueue_struct *wq)
0f900049c   Tejun Heo   workqueue: update...
2710
  {
65a644643   Andi Kleen   HWPOISON: Allow s...
2711
  	/*
0f900049c   Tejun Heo   workqueue: update...
2712
2713
2714
  	 * cwqs are forced aligned according to WORK_STRUCT_FLAG_BITS.
  	 * Make sure that the alignment isn't lower than that of
  	 * unsigned long long.
65a644643   Andi Kleen   HWPOISON: Allow s...
2715
  	 */
0f900049c   Tejun Heo   workqueue: update...
2716
2717
2718
  	const size_t size = sizeof(struct cpu_workqueue_struct);
  	const size_t align = max_t(size_t, 1 << WORK_STRUCT_FLAG_BITS,
  				   __alignof__(unsigned long long));
931ac77ef   Tejun Heo   workqueue: fix bu...
2719
2720
2721
2722
2723
  #ifdef CONFIG_SMP
  	bool percpu = !(wq->flags & WQ_UNBOUND);
  #else
  	bool percpu = false;
  #endif
65a644643   Andi Kleen   HWPOISON: Allow s...
2724

931ac77ef   Tejun Heo   workqueue: fix bu...
2725
  	if (percpu)
f34217977   Tejun Heo   workqueue: implem...
2726
  		wq->cpu_wq.pcpu = __alloc_percpu(size, align);
931ac77ef   Tejun Heo   workqueue: fix bu...
2727
  	else {
f34217977   Tejun Heo   workqueue: implem...
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
  		void *ptr;
  
  		/*
  		 * Allocate enough room to align cwq and put an extra
  		 * pointer at the end pointing back to the originally
  		 * allocated pointer which will be used for free.
  		 */
  		ptr = kzalloc(size + align + sizeof(void *), GFP_KERNEL);
  		if (ptr) {
  			wq->cpu_wq.single = PTR_ALIGN(ptr, align);
  			*(void **)(wq->cpu_wq.single + 1) = ptr;
  		}
bdbc5dd7d   Tejun Heo   workqueue: prepar...
2740
  	}
f34217977   Tejun Heo   workqueue: implem...
2741

526056275   David Howells   MN10300: Fix the ...
2742
2743
2744
  	/* just in case, make sure it's actually aligned
  	 * - this is affected by PERCPU() alignment in vmlinux.lds.S
  	 */
bdbc5dd7d   Tejun Heo   workqueue: prepar...
2745
2746
  	BUG_ON(!IS_ALIGNED(wq->cpu_wq.v, align));
  	return wq->cpu_wq.v ? 0 : -ENOMEM;
0f900049c   Tejun Heo   workqueue: update...
2747
  }
bdbc5dd7d   Tejun Heo   workqueue: prepar...
2748
  static void free_cwqs(struct workqueue_struct *wq)
0f900049c   Tejun Heo   workqueue: update...
2749
  {
931ac77ef   Tejun Heo   workqueue: fix bu...
2750
2751
2752
2753
2754
2755
2756
  #ifdef CONFIG_SMP
  	bool percpu = !(wq->flags & WQ_UNBOUND);
  #else
  	bool percpu = false;
  #endif
  
  	if (percpu)
f34217977   Tejun Heo   workqueue: implem...
2757
2758
2759
  		free_percpu(wq->cpu_wq.pcpu);
  	else if (wq->cpu_wq.single) {
  		/* the pointer to free is stored right after the cwq */
bdbc5dd7d   Tejun Heo   workqueue: prepar...
2760
  		kfree(*(void **)(wq->cpu_wq.single + 1));
f34217977   Tejun Heo   workqueue: implem...
2761
  	}
0f900049c   Tejun Heo   workqueue: update...
2762
  }
f34217977   Tejun Heo   workqueue: implem...
2763
2764
  static int wq_clamp_max_active(int max_active, unsigned int flags,
  			       const char *name)
b71ab8c20   Tejun Heo   workqueue: increa...
2765
  {
f34217977   Tejun Heo   workqueue: implem...
2766
2767
2768
  	int lim = flags & WQ_UNBOUND ? WQ_UNBOUND_MAX_ACTIVE : WQ_MAX_ACTIVE;
  
  	if (max_active < 1 || max_active > lim)
b71ab8c20   Tejun Heo   workqueue: increa...
2769
2770
2771
  		printk(KERN_WARNING "workqueue: max_active %d requested for %s "
  		       "is out of range, clamping between %d and %d
  ",
f34217977   Tejun Heo   workqueue: implem...
2772
  		       max_active, name, 1, lim);
b71ab8c20   Tejun Heo   workqueue: increa...
2773

f34217977   Tejun Heo   workqueue: implem...
2774
  	return clamp_val(max_active, 1, lim);
b71ab8c20   Tejun Heo   workqueue: increa...
2775
  }
d320c0383   Tejun Heo   workqueue: s/__cr...
2776
2777
2778
2779
2780
  struct workqueue_struct *__alloc_workqueue_key(const char *name,
  					       unsigned int flags,
  					       int max_active,
  					       struct lock_class_key *key,
  					       const char *lock_name)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2781
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2782
  	struct workqueue_struct *wq;
c34056a3f   Tejun Heo   workqueue: introd...
2783
  	unsigned int cpu;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2784

f34217977   Tejun Heo   workqueue: implem...
2785
  	/*
6370a6ad3   Tejun Heo   workqueue: add an...
2786
2787
2788
2789
2790
2791
2792
  	 * Workqueues which may be used during memory reclaim should
  	 * have a rescuer to guarantee forward progress.
  	 */
  	if (flags & WQ_MEM_RECLAIM)
  		flags |= WQ_RESCUER;
  
  	/*
f34217977   Tejun Heo   workqueue: implem...
2793
2794
2795
2796
2797
  	 * Unbound workqueues aren't concurrency managed and should be
  	 * dispatched to workers immediately.
  	 */
  	if (flags & WQ_UNBOUND)
  		flags |= WQ_HIGHPRI;
d320c0383   Tejun Heo   workqueue: s/__cr...
2798
  	max_active = max_active ?: WQ_DFL_ACTIVE;
f34217977   Tejun Heo   workqueue: implem...
2799
  	max_active = wq_clamp_max_active(max_active, flags, name);
1e19ffc63   Tejun Heo   workqueue: implem...
2800

3af24433e   Oleg Nesterov   workqueue: don't ...
2801
2802
  	wq = kzalloc(sizeof(*wq), GFP_KERNEL);
  	if (!wq)
4690c4ab5   Tejun Heo   workqueue: misc/c...
2803
  		goto err;
3af24433e   Oleg Nesterov   workqueue: don't ...
2804

97e37d7b9   Tejun Heo   workqueue: merge ...
2805
  	wq->flags = flags;
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
2806
  	wq->saved_max_active = max_active;
73f53c4aa   Tejun Heo   workqueue: reimpl...
2807
2808
2809
2810
  	mutex_init(&wq->flush_mutex);
  	atomic_set(&wq->nr_cwqs_to_flush, 0);
  	INIT_LIST_HEAD(&wq->flusher_queue);
  	INIT_LIST_HEAD(&wq->flusher_overflow);
502ca9d81   Tejun Heo   workqueue: make s...
2811

3af24433e   Oleg Nesterov   workqueue: don't ...
2812
  	wq->name = name;
eb13ba873   Johannes Berg   lockdep: fix work...
2813
  	lockdep_init_map(&wq->lockdep_map, lock_name, key, 0);
cce1a1656   Oleg Nesterov   workqueue: introd...
2814
  	INIT_LIST_HEAD(&wq->list);
3af24433e   Oleg Nesterov   workqueue: don't ...
2815

bdbc5dd7d   Tejun Heo   workqueue: prepar...
2816
2817
  	if (alloc_cwqs(wq) < 0)
  		goto err;
f34217977   Tejun Heo   workqueue: implem...
2818
  	for_each_cwq_cpu(cpu, wq) {
1537663f5   Tejun Heo   workqueue: kill c...
2819
  		struct cpu_workqueue_struct *cwq = get_cwq(cpu, wq);
8b03ae3cd   Tejun Heo   workqueue: introd...
2820
  		struct global_cwq *gcwq = get_gcwq(cpu);
1537663f5   Tejun Heo   workqueue: kill c...
2821

0f900049c   Tejun Heo   workqueue: update...
2822
  		BUG_ON((unsigned long)cwq & WORK_STRUCT_FLAG_MASK);
8b03ae3cd   Tejun Heo   workqueue: introd...
2823
  		cwq->gcwq = gcwq;
c34056a3f   Tejun Heo   workqueue: introd...
2824
  		cwq->wq = wq;
73f53c4aa   Tejun Heo   workqueue: reimpl...
2825
  		cwq->flush_color = -1;
1e19ffc63   Tejun Heo   workqueue: implem...
2826
  		cwq->max_active = max_active;
1e19ffc63   Tejun Heo   workqueue: implem...
2827
  		INIT_LIST_HEAD(&cwq->delayed_works);
e22bee782   Tejun Heo   workqueue: implem...
2828
  	}
1537663f5   Tejun Heo   workqueue: kill c...
2829

e22bee782   Tejun Heo   workqueue: implem...
2830
2831
  	if (flags & WQ_RESCUER) {
  		struct worker *rescuer;
f2e005aaf   Tejun Heo   workqueue: fix ma...
2832
  		if (!alloc_mayday_mask(&wq->mayday_mask, GFP_KERNEL))
e22bee782   Tejun Heo   workqueue: implem...
2833
2834
2835
2836
2837
2838
2839
2840
2841
  			goto err;
  
  		wq->rescuer = rescuer = alloc_worker();
  		if (!rescuer)
  			goto err;
  
  		rescuer->task = kthread_create(rescuer_thread, wq, "%s", name);
  		if (IS_ERR(rescuer->task))
  			goto err;
e22bee782   Tejun Heo   workqueue: implem...
2842
2843
  		rescuer->task->flags |= PF_THREAD_BOUND;
  		wake_up_process(rescuer->task);
3af24433e   Oleg Nesterov   workqueue: don't ...
2844
  	}
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
2845
2846
2847
2848
2849
  	/*
  	 * workqueue_lock protects global freeze state and workqueues
  	 * list.  Grab it, set max_active accordingly and add the new
  	 * workqueue to workqueues list.
  	 */
1537663f5   Tejun Heo   workqueue: kill c...
2850
  	spin_lock(&workqueue_lock);
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
2851
2852
  
  	if (workqueue_freezing && wq->flags & WQ_FREEZEABLE)
f34217977   Tejun Heo   workqueue: implem...
2853
  		for_each_cwq_cpu(cpu, wq)
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
2854
  			get_cwq(cpu, wq)->max_active = 0;
1537663f5   Tejun Heo   workqueue: kill c...
2855
  	list_add(&wq->list, &workqueues);
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
2856

1537663f5   Tejun Heo   workqueue: kill c...
2857
  	spin_unlock(&workqueue_lock);
3af24433e   Oleg Nesterov   workqueue: don't ...
2858
  	return wq;
4690c4ab5   Tejun Heo   workqueue: misc/c...
2859
2860
  err:
  	if (wq) {
bdbc5dd7d   Tejun Heo   workqueue: prepar...
2861
  		free_cwqs(wq);
f2e005aaf   Tejun Heo   workqueue: fix ma...
2862
  		free_mayday_mask(wq->mayday_mask);
e22bee782   Tejun Heo   workqueue: implem...
2863
  		kfree(wq->rescuer);
4690c4ab5   Tejun Heo   workqueue: misc/c...
2864
2865
2866
  		kfree(wq);
  	}
  	return NULL;
3af24433e   Oleg Nesterov   workqueue: don't ...
2867
  }
d320c0383   Tejun Heo   workqueue: s/__cr...
2868
  EXPORT_SYMBOL_GPL(__alloc_workqueue_key);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2869

3af24433e   Oleg Nesterov   workqueue: don't ...
2870
2871
2872
2873
2874
2875
2876
2877
  /**
   * destroy_workqueue - safely terminate a workqueue
   * @wq: target workqueue
   *
   * Safely destroy a workqueue. All work currently pending will be done first.
   */
  void destroy_workqueue(struct workqueue_struct *wq)
  {
c8efcc258   Tejun Heo   workqueue: allow ...
2878
  	unsigned int flush_cnt = 0;
c8e55f360   Tejun Heo   workqueue: implem...
2879
  	unsigned int cpu;
3af24433e   Oleg Nesterov   workqueue: don't ...
2880

c8efcc258   Tejun Heo   workqueue: allow ...
2881
2882
2883
2884
2885
2886
2887
2888
  	/*
  	 * Mark @wq dying and drain all pending works.  Once WQ_DYING is
  	 * set, only chain queueing is allowed.  IOW, only currently
  	 * pending or running work items on @wq can queue further work
  	 * items on it.  @wq is flushed repeatedly until it becomes empty.
  	 * The number of flushing is detemined by the depth of chaining and
  	 * should be relatively short.  Whine if it takes too long.
  	 */
e41e704bc   Tejun Heo   workqueue: improv...
2889
  	wq->flags |= WQ_DYING;
c8efcc258   Tejun Heo   workqueue: allow ...
2890
  reflush:
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
2891
  	flush_workqueue(wq);
c8efcc258   Tejun Heo   workqueue: allow ...
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
  	for_each_cwq_cpu(cpu, wq) {
  		struct cpu_workqueue_struct *cwq = get_cwq(cpu, wq);
  
  		if (!cwq->nr_active && list_empty(&cwq->delayed_works))
  			continue;
  
  		if (++flush_cnt == 10 ||
  		    (flush_cnt % 100 == 0 && flush_cnt <= 1000))
  			printk(KERN_WARNING "workqueue %s: flush on "
  			       "destruction isn't complete after %u tries
  ",
  			       wq->name, flush_cnt);
  		goto reflush;
  	}
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
2906
2907
2908
2909
  	/*
  	 * wq list is used to freeze wq, remove from list after
  	 * flushing is complete in case freeze races us.
  	 */
95402b382   Gautham R Shenoy   cpu-hotplug: repl...
2910
  	spin_lock(&workqueue_lock);
b1f4ec172   Oleg Nesterov   workqueue: introd...
2911
  	list_del(&wq->list);
95402b382   Gautham R Shenoy   cpu-hotplug: repl...
2912
  	spin_unlock(&workqueue_lock);
3af24433e   Oleg Nesterov   workqueue: don't ...
2913

e22bee782   Tejun Heo   workqueue: implem...
2914
  	/* sanity check */
f34217977   Tejun Heo   workqueue: implem...
2915
  	for_each_cwq_cpu(cpu, wq) {
73f53c4aa   Tejun Heo   workqueue: reimpl...
2916
2917
  		struct cpu_workqueue_struct *cwq = get_cwq(cpu, wq);
  		int i;
73f53c4aa   Tejun Heo   workqueue: reimpl...
2918
2919
  		for (i = 0; i < WORK_NR_COLORS; i++)
  			BUG_ON(cwq->nr_in_flight[i]);
1e19ffc63   Tejun Heo   workqueue: implem...
2920
2921
  		BUG_ON(cwq->nr_active);
  		BUG_ON(!list_empty(&cwq->delayed_works));
73f53c4aa   Tejun Heo   workqueue: reimpl...
2922
  	}
9b41ea728   Andrew Morton   [PATCH] workqueue...
2923

e22bee782   Tejun Heo   workqueue: implem...
2924
2925
  	if (wq->flags & WQ_RESCUER) {
  		kthread_stop(wq->rescuer->task);
f2e005aaf   Tejun Heo   workqueue: fix ma...
2926
  		free_mayday_mask(wq->mayday_mask);
8d9df9f08   Xiaotian Feng   workqueue: free r...
2927
  		kfree(wq->rescuer);
e22bee782   Tejun Heo   workqueue: implem...
2928
  	}
bdbc5dd7d   Tejun Heo   workqueue: prepar...
2929
  	free_cwqs(wq);
3af24433e   Oleg Nesterov   workqueue: don't ...
2930
2931
2932
  	kfree(wq);
  }
  EXPORT_SYMBOL_GPL(destroy_workqueue);
dcd989cb7   Tejun Heo   workqueue: implem...
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
  /**
   * workqueue_set_max_active - adjust max_active of a workqueue
   * @wq: target workqueue
   * @max_active: new max_active value.
   *
   * Set max_active of @wq to @max_active.
   *
   * CONTEXT:
   * Don't call from IRQ context.
   */
  void workqueue_set_max_active(struct workqueue_struct *wq, int max_active)
  {
  	unsigned int cpu;
f34217977   Tejun Heo   workqueue: implem...
2946
  	max_active = wq_clamp_max_active(max_active, wq->flags, wq->name);
dcd989cb7   Tejun Heo   workqueue: implem...
2947
2948
2949
2950
  
  	spin_lock(&workqueue_lock);
  
  	wq->saved_max_active = max_active;
f34217977   Tejun Heo   workqueue: implem...
2951
  	for_each_cwq_cpu(cpu, wq) {
dcd989cb7   Tejun Heo   workqueue: implem...
2952
2953
2954
2955
2956
2957
2958
  		struct global_cwq *gcwq = get_gcwq(cpu);
  
  		spin_lock_irq(&gcwq->lock);
  
  		if (!(wq->flags & WQ_FREEZEABLE) ||
  		    !(gcwq->flags & GCWQ_FREEZING))
  			get_cwq(gcwq->cpu, wq)->max_active = max_active;
9bfb18392   Ingo Molnar   [PATCH] workqueue...
2959

dcd989cb7   Tejun Heo   workqueue: implem...
2960
  		spin_unlock_irq(&gcwq->lock);
65a644643   Andi Kleen   HWPOISON: Allow s...
2961
  	}
939818009   Tejun Heo   workqueue: fix ra...
2962

dcd989cb7   Tejun Heo   workqueue: implem...
2963
  	spin_unlock(&workqueue_lock);
15316ba81   Christoph Lameter   [PATCH] add sched...
2964
  }
dcd989cb7   Tejun Heo   workqueue: implem...
2965
  EXPORT_SYMBOL_GPL(workqueue_set_max_active);
15316ba81   Christoph Lameter   [PATCH] add sched...
2966

eef6a7d5c   Alan Stern   workqueue: warn a...
2967
  /**
dcd989cb7   Tejun Heo   workqueue: implem...
2968
2969
2970
   * workqueue_congested - test whether a workqueue is congested
   * @cpu: CPU in question
   * @wq: target workqueue
eef6a7d5c   Alan Stern   workqueue: warn a...
2971
   *
dcd989cb7   Tejun Heo   workqueue: implem...
2972
2973
2974
   * Test whether @wq's cpu workqueue for @cpu is congested.  There is
   * no synchronization around this function and the test result is
   * unreliable and only useful as advisory hints or for debugging.
eef6a7d5c   Alan Stern   workqueue: warn a...
2975
   *
dcd989cb7   Tejun Heo   workqueue: implem...
2976
2977
   * RETURNS:
   * %true if congested, %false otherwise.
eef6a7d5c   Alan Stern   workqueue: warn a...
2978
   */
dcd989cb7   Tejun Heo   workqueue: implem...
2979
  bool workqueue_congested(unsigned int cpu, struct workqueue_struct *wq)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2980
  {
dcd989cb7   Tejun Heo   workqueue: implem...
2981
2982
2983
  	struct cpu_workqueue_struct *cwq = get_cwq(cpu, wq);
  
  	return !list_empty(&cwq->delayed_works);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2984
  }
dcd989cb7   Tejun Heo   workqueue: implem...
2985
  EXPORT_SYMBOL_GPL(workqueue_congested);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2986
2987
  
  /**
dcd989cb7   Tejun Heo   workqueue: implem...
2988
2989
   * work_cpu - return the last known associated cpu for @work
   * @work: the work of interest
1fa44ecad   James Bottomley   [SCSI] add execut...
2990
   *
dcd989cb7   Tejun Heo   workqueue: implem...
2991
   * RETURNS:
bdbc5dd7d   Tejun Heo   workqueue: prepar...
2992
   * CPU number if @work was ever queued.  WORK_CPU_NONE otherwise.
1fa44ecad   James Bottomley   [SCSI] add execut...
2993
   */
dcd989cb7   Tejun Heo   workqueue: implem...
2994
  unsigned int work_cpu(struct work_struct *work)
1fa44ecad   James Bottomley   [SCSI] add execut...
2995
  {
dcd989cb7   Tejun Heo   workqueue: implem...
2996
  	struct global_cwq *gcwq = get_work_gcwq(work);
1fa44ecad   James Bottomley   [SCSI] add execut...
2997

bdbc5dd7d   Tejun Heo   workqueue: prepar...
2998
  	return gcwq ? gcwq->cpu : WORK_CPU_NONE;
1fa44ecad   James Bottomley   [SCSI] add execut...
2999
  }
dcd989cb7   Tejun Heo   workqueue: implem...
3000
  EXPORT_SYMBOL_GPL(work_cpu);
1fa44ecad   James Bottomley   [SCSI] add execut...
3001

dcd989cb7   Tejun Heo   workqueue: implem...
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
  /**
   * work_busy - test whether a work is currently pending or running
   * @work: the work to be tested
   *
   * Test whether @work is currently pending or running.  There is no
   * synchronization around this function and the test result is
   * unreliable and only useful as advisory hints or for debugging.
   * Especially for reentrant wqs, the pending state might hide the
   * running state.
   *
   * RETURNS:
   * OR'd bitmask of WORK_BUSY_* bits.
   */
  unsigned int work_busy(struct work_struct *work)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3016
  {
dcd989cb7   Tejun Heo   workqueue: implem...
3017
3018
3019
  	struct global_cwq *gcwq = get_work_gcwq(work);
  	unsigned long flags;
  	unsigned int ret = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3020

dcd989cb7   Tejun Heo   workqueue: implem...
3021
3022
  	if (!gcwq)
  		return false;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3023

dcd989cb7   Tejun Heo   workqueue: implem...
3024
  	spin_lock_irqsave(&gcwq->lock, flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3025

dcd989cb7   Tejun Heo   workqueue: implem...
3026
3027
3028
3029
  	if (work_pending(work))
  		ret |= WORK_BUSY_PENDING;
  	if (find_worker_executing_work(gcwq, work))
  		ret |= WORK_BUSY_RUNNING;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3030

dcd989cb7   Tejun Heo   workqueue: implem...
3031
  	spin_unlock_irqrestore(&gcwq->lock, flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3032

dcd989cb7   Tejun Heo   workqueue: implem...
3033
  	return ret;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3034
  }
dcd989cb7   Tejun Heo   workqueue: implem...
3035
  EXPORT_SYMBOL_GPL(work_busy);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3036

db7bccf45   Tejun Heo   workqueue: reimpl...
3037
3038
3039
  /*
   * CPU hotplug.
   *
e22bee782   Tejun Heo   workqueue: implem...
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
   * There are two challenges in supporting CPU hotplug.  Firstly, there
   * are a lot of assumptions on strong associations among work, cwq and
   * gcwq which make migrating pending and scheduled works very
   * difficult to implement without impacting hot paths.  Secondly,
   * gcwqs serve mix of short, long and very long running works making
   * blocked draining impractical.
   *
   * This is solved by allowing a gcwq to be detached from CPU, running
   * it with unbound (rogue) workers and allowing it to be reattached
   * later if the cpu comes back online.  A separate thread is created
   * to govern a gcwq in such state and is called the trustee of the
   * gcwq.
db7bccf45   Tejun Heo   workqueue: reimpl...
3052
3053
3054
3055
3056
3057
3058
   *
   * Trustee states and their descriptions.
   *
   * START	Command state used on startup.  On CPU_DOWN_PREPARE, a
   *		new trustee is started with this state.
   *
   * IN_CHARGE	Once started, trustee will enter this state after
e22bee782   Tejun Heo   workqueue: implem...
3059
3060
3061
3062
3063
3064
   *		assuming the manager role and making all existing
   *		workers rogue.  DOWN_PREPARE waits for trustee to
   *		enter this state.  After reaching IN_CHARGE, trustee
   *		tries to execute the pending worklist until it's empty
   *		and the state is set to BUTCHER, or the state is set
   *		to RELEASE.
db7bccf45   Tejun Heo   workqueue: reimpl...
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
   *
   * BUTCHER	Command state which is set by the cpu callback after
   *		the cpu has went down.  Once this state is set trustee
   *		knows that there will be no new works on the worklist
   *		and once the worklist is empty it can proceed to
   *		killing idle workers.
   *
   * RELEASE	Command state which is set by the cpu callback if the
   *		cpu down has been canceled or it has come online
   *		again.  After recognizing this state, trustee stops
e22bee782   Tejun Heo   workqueue: implem...
3075
3076
3077
   *		trying to drain or butcher and clears ROGUE, rebinds
   *		all remaining workers back to the cpu and releases
   *		manager role.
db7bccf45   Tejun Heo   workqueue: reimpl...
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
   *
   * DONE		Trustee will enter this state after BUTCHER or RELEASE
   *		is complete.
   *
   *          trustee                 CPU                draining
   *         took over                down               complete
   * START -----------> IN_CHARGE -----------> BUTCHER -----------> DONE
   *                        |                     |                  ^
   *                        | CPU is back online  v   return workers |
   *                         ----------------> RELEASE --------------
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3089

db7bccf45   Tejun Heo   workqueue: reimpl...
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
  /**
   * trustee_wait_event_timeout - timed event wait for trustee
   * @cond: condition to wait for
   * @timeout: timeout in jiffies
   *
   * wait_event_timeout() for trustee to use.  Handles locking and
   * checks for RELEASE request.
   *
   * CONTEXT:
   * spin_lock_irq(gcwq->lock) which may be released and regrabbed
   * multiple times.  To be used by trustee.
   *
   * RETURNS:
   * Positive indicating left time if @cond is satisfied, 0 if timed
   * out, -1 if canceled.
   */
  #define trustee_wait_event_timeout(cond, timeout) ({			\
  	long __ret = (timeout);						\
  	while (!((cond) || (gcwq->trustee_state == TRUSTEE_RELEASE)) &&	\
  	       __ret) {							\
  		spin_unlock_irq(&gcwq->lock);				\
  		__wait_event_timeout(gcwq->trustee_wait, (cond) ||	\
  			(gcwq->trustee_state == TRUSTEE_RELEASE),	\
  			__ret);						\
  		spin_lock_irq(&gcwq->lock);				\
  	}								\
  	gcwq->trustee_state == TRUSTEE_RELEASE ? -1 : (__ret);		\
  })
3af24433e   Oleg Nesterov   workqueue: don't ...
3118

db7bccf45   Tejun Heo   workqueue: reimpl...
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
  /**
   * trustee_wait_event - event wait for trustee
   * @cond: condition to wait for
   *
   * wait_event() for trustee to use.  Automatically handles locking and
   * checks for CANCEL request.
   *
   * CONTEXT:
   * spin_lock_irq(gcwq->lock) which may be released and regrabbed
   * multiple times.  To be used by trustee.
   *
   * RETURNS:
   * 0 if @cond is satisfied, -1 if canceled.
   */
  #define trustee_wait_event(cond) ({					\
  	long __ret1;							\
  	__ret1 = trustee_wait_event_timeout(cond, MAX_SCHEDULE_TIMEOUT);\
  	__ret1 < 0 ? -1 : 0;						\
  })
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3138

db7bccf45   Tejun Heo   workqueue: reimpl...
3139
  static int __cpuinit trustee_thread(void *__gcwq)
3af24433e   Oleg Nesterov   workqueue: don't ...
3140
  {
db7bccf45   Tejun Heo   workqueue: reimpl...
3141
3142
  	struct global_cwq *gcwq = __gcwq;
  	struct worker *worker;
e22bee782   Tejun Heo   workqueue: implem...
3143
  	struct work_struct *work;
db7bccf45   Tejun Heo   workqueue: reimpl...
3144
  	struct hlist_node *pos;
e22bee782   Tejun Heo   workqueue: implem...
3145
  	long rc;
db7bccf45   Tejun Heo   workqueue: reimpl...
3146
  	int i;
3af24433e   Oleg Nesterov   workqueue: don't ...
3147

db7bccf45   Tejun Heo   workqueue: reimpl...
3148
3149
3150
  	BUG_ON(gcwq->cpu != smp_processor_id());
  
  	spin_lock_irq(&gcwq->lock);
3af24433e   Oleg Nesterov   workqueue: don't ...
3151
  	/*
e22bee782   Tejun Heo   workqueue: implem...
3152
3153
3154
  	 * Claim the manager position and make all workers rogue.
  	 * Trustee must be bound to the target cpu and can't be
  	 * cancelled.
3af24433e   Oleg Nesterov   workqueue: don't ...
3155
  	 */
db7bccf45   Tejun Heo   workqueue: reimpl...
3156
  	BUG_ON(gcwq->cpu != smp_processor_id());
e22bee782   Tejun Heo   workqueue: implem...
3157
3158
  	rc = trustee_wait_event(!(gcwq->flags & GCWQ_MANAGING_WORKERS));
  	BUG_ON(rc < 0);
3af24433e   Oleg Nesterov   workqueue: don't ...
3159

e22bee782   Tejun Heo   workqueue: implem...
3160
  	gcwq->flags |= GCWQ_MANAGING_WORKERS;
e1d8aa9f1   Frederic Weisbecker   tracing: add a ne...
3161

db7bccf45   Tejun Heo   workqueue: reimpl...
3162
  	list_for_each_entry(worker, &gcwq->idle_list, entry)
cb4447669   Tejun Heo   workqueue: use wo...
3163
  		worker->flags |= WORKER_ROGUE;
3af24433e   Oleg Nesterov   workqueue: don't ...
3164

db7bccf45   Tejun Heo   workqueue: reimpl...
3165
  	for_each_busy_worker(worker, i, pos, gcwq)
cb4447669   Tejun Heo   workqueue: use wo...
3166
  		worker->flags |= WORKER_ROGUE;
06ba38a9a   Oleg Nesterov   workqueues: shift...
3167

db7bccf45   Tejun Heo   workqueue: reimpl...
3168
  	/*
e22bee782   Tejun Heo   workqueue: implem...
3169
3170
3171
3172
3173
3174
3175
3176
  	 * Call schedule() so that we cross rq->lock and thus can
  	 * guarantee sched callbacks see the rogue flag.  This is
  	 * necessary as scheduler callbacks may be invoked from other
  	 * cpus.
  	 */
  	spin_unlock_irq(&gcwq->lock);
  	schedule();
  	spin_lock_irq(&gcwq->lock);
06ba38a9a   Oleg Nesterov   workqueues: shift...
3177

e22bee782   Tejun Heo   workqueue: implem...
3178
  	/*
cb4447669   Tejun Heo   workqueue: use wo...
3179
3180
3181
3182
  	 * Sched callbacks are disabled now.  Zap nr_running.  After
  	 * this, nr_running stays zero and need_more_worker() and
  	 * keep_working() are always true as long as the worklist is
  	 * not empty.
e22bee782   Tejun Heo   workqueue: implem...
3183
  	 */
cb4447669   Tejun Heo   workqueue: use wo...
3184
  	atomic_set(get_gcwq_nr_running(gcwq->cpu), 0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3185

e22bee782   Tejun Heo   workqueue: implem...
3186
3187
3188
  	spin_unlock_irq(&gcwq->lock);
  	del_timer_sync(&gcwq->idle_timer);
  	spin_lock_irq(&gcwq->lock);
3af24433e   Oleg Nesterov   workqueue: don't ...
3189

e22bee782   Tejun Heo   workqueue: implem...
3190
  	/*
db7bccf45   Tejun Heo   workqueue: reimpl...
3191
3192
3193
3194
3195
3196
3197
  	 * We're now in charge.  Notify and proceed to drain.  We need
  	 * to keep the gcwq running during the whole CPU down
  	 * procedure as other cpu hotunplug callbacks may need to
  	 * flush currently running tasks.
  	 */
  	gcwq->trustee_state = TRUSTEE_IN_CHARGE;
  	wake_up_all(&gcwq->trustee_wait);
3af24433e   Oleg Nesterov   workqueue: don't ...
3198

db7bccf45   Tejun Heo   workqueue: reimpl...
3199
3200
3201
  	/*
  	 * The original cpu is in the process of dying and may go away
  	 * anytime now.  When that happens, we and all workers would
e22bee782   Tejun Heo   workqueue: implem...
3202
3203
3204
3205
3206
3207
  	 * be migrated to other cpus.  Try draining any left work.  We
  	 * want to get it over with ASAP - spam rescuers, wake up as
  	 * many idlers as necessary and create new ones till the
  	 * worklist is empty.  Note that if the gcwq is frozen, there
  	 * may be frozen works in freezeable cwqs.  Don't declare
  	 * completion while frozen.
db7bccf45   Tejun Heo   workqueue: reimpl...
3208
3209
3210
3211
  	 */
  	while (gcwq->nr_workers != gcwq->nr_idle ||
  	       gcwq->flags & GCWQ_FREEZING ||
  	       gcwq->trustee_state == TRUSTEE_IN_CHARGE) {
e22bee782   Tejun Heo   workqueue: implem...
3212
3213
3214
3215
3216
3217
  		int nr_works = 0;
  
  		list_for_each_entry(work, &gcwq->worklist, entry) {
  			send_mayday(work);
  			nr_works++;
  		}
3af24433e   Oleg Nesterov   workqueue: don't ...
3218

e22bee782   Tejun Heo   workqueue: implem...
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
  		list_for_each_entry(worker, &gcwq->idle_list, entry) {
  			if (!nr_works--)
  				break;
  			wake_up_process(worker->task);
  		}
  
  		if (need_to_create_worker(gcwq)) {
  			spin_unlock_irq(&gcwq->lock);
  			worker = create_worker(gcwq, false);
  			spin_lock_irq(&gcwq->lock);
  			if (worker) {
cb4447669   Tejun Heo   workqueue: use wo...
3230
  				worker->flags |= WORKER_ROGUE;
e22bee782   Tejun Heo   workqueue: implem...
3231
3232
  				start_worker(worker);
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3233
  		}
3af24433e   Oleg Nesterov   workqueue: don't ...
3234

db7bccf45   Tejun Heo   workqueue: reimpl...
3235
3236
3237
  		/* give a breather */
  		if (trustee_wait_event_timeout(false, TRUSTEE_COOLDOWN) < 0)
  			break;
3af24433e   Oleg Nesterov   workqueue: don't ...
3238
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3239

14441960e   Oleg Nesterov   simplify cleanup_...
3240
  	/*
e22bee782   Tejun Heo   workqueue: implem...
3241
3242
3243
  	 * Either all works have been scheduled and cpu is down, or
  	 * cpu down has already been canceled.  Wait for and butcher
  	 * all workers till we're canceled.
14441960e   Oleg Nesterov   simplify cleanup_...
3244
  	 */
e22bee782   Tejun Heo   workqueue: implem...
3245
3246
3247
3248
3249
3250
  	do {
  		rc = trustee_wait_event(!list_empty(&gcwq->idle_list));
  		while (!list_empty(&gcwq->idle_list))
  			destroy_worker(list_first_entry(&gcwq->idle_list,
  							struct worker, entry));
  	} while (gcwq->nr_workers && rc >= 0);
4e6045f13   Johannes Berg   workqueue: debug ...
3251

14441960e   Oleg Nesterov   simplify cleanup_...
3252
  	/*
e22bee782   Tejun Heo   workqueue: implem...
3253
3254
3255
3256
3257
  	 * At this point, either draining has completed and no worker
  	 * is left, or cpu down has been canceled or the cpu is being
  	 * brought back up.  There shouldn't be any idle one left.
  	 * Tell the remaining busy ones to rebind once it finishes the
  	 * currently scheduled works by scheduling the rebind_work.
14441960e   Oleg Nesterov   simplify cleanup_...
3258
  	 */
e22bee782   Tejun Heo   workqueue: implem...
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
  	WARN_ON(!list_empty(&gcwq->idle_list));
  
  	for_each_busy_worker(worker, i, pos, gcwq) {
  		struct work_struct *rebind_work = &worker->rebind_work;
  
  		/*
  		 * Rebind_work may race with future cpu hotplug
  		 * operations.  Use a separate flag to mark that
  		 * rebinding is scheduled.
  		 */
cb4447669   Tejun Heo   workqueue: use wo...
3269
3270
  		worker->flags |= WORKER_REBIND;
  		worker->flags &= ~WORKER_ROGUE;
e22bee782   Tejun Heo   workqueue: implem...
3271
3272
3273
3274
3275
3276
3277
  
  		/* queue rebind_work, wq doesn't matter, use the default one */
  		if (test_and_set_bit(WORK_STRUCT_PENDING_BIT,
  				     work_data_bits(rebind_work)))
  			continue;
  
  		debug_work_activate(rebind_work);
d320c0383   Tejun Heo   workqueue: s/__cr...
3278
  		insert_work(get_cwq(gcwq->cpu, system_wq), rebind_work,
e22bee782   Tejun Heo   workqueue: implem...
3279
3280
3281
3282
3283
3284
  			    worker->scheduled.next,
  			    work_color_to_flags(WORK_NO_COLOR));
  	}
  
  	/* relinquish manager role */
  	gcwq->flags &= ~GCWQ_MANAGING_WORKERS;
db7bccf45   Tejun Heo   workqueue: reimpl...
3285
3286
3287
3288
3289
3290
  	/* notify completion */
  	gcwq->trustee = NULL;
  	gcwq->trustee_state = TRUSTEE_DONE;
  	wake_up_all(&gcwq->trustee_wait);
  	spin_unlock_irq(&gcwq->lock);
  	return 0;
3af24433e   Oleg Nesterov   workqueue: don't ...
3291
3292
3293
  }
  
  /**
db7bccf45   Tejun Heo   workqueue: reimpl...
3294
3295
3296
   * wait_trustee_state - wait for trustee to enter the specified state
   * @gcwq: gcwq the trustee of interest belongs to
   * @state: target state to wait for
3af24433e   Oleg Nesterov   workqueue: don't ...
3297
   *
db7bccf45   Tejun Heo   workqueue: reimpl...
3298
3299
3300
3301
3302
   * Wait for the trustee to reach @state.  DONE is already matched.
   *
   * CONTEXT:
   * spin_lock_irq(gcwq->lock) which may be released and regrabbed
   * multiple times.  To be used by cpu_callback.
3af24433e   Oleg Nesterov   workqueue: don't ...
3303
   */
db7bccf45   Tejun Heo   workqueue: reimpl...
3304
  static void __cpuinit wait_trustee_state(struct global_cwq *gcwq, int state)
06bd6ebff   Namhyung Kim   workqueue: annota...
3305
3306
  __releases(&gcwq->lock)
  __acquires(&gcwq->lock)
3af24433e   Oleg Nesterov   workqueue: don't ...
3307
  {
db7bccf45   Tejun Heo   workqueue: reimpl...
3308
3309
3310
3311
3312
3313
3314
3315
  	if (!(gcwq->trustee_state == state ||
  	      gcwq->trustee_state == TRUSTEE_DONE)) {
  		spin_unlock_irq(&gcwq->lock);
  		__wait_event(gcwq->trustee_wait,
  			     gcwq->trustee_state == state ||
  			     gcwq->trustee_state == TRUSTEE_DONE);
  		spin_lock_irq(&gcwq->lock);
  	}
3af24433e   Oleg Nesterov   workqueue: don't ...
3316
  }
3af24433e   Oleg Nesterov   workqueue: don't ...
3317
3318
3319
3320
3321
3322
  
  static int __devinit workqueue_cpu_callback(struct notifier_block *nfb,
  						unsigned long action,
  						void *hcpu)
  {
  	unsigned int cpu = (unsigned long)hcpu;
db7bccf45   Tejun Heo   workqueue: reimpl...
3323
3324
  	struct global_cwq *gcwq = get_gcwq(cpu);
  	struct task_struct *new_trustee = NULL;
e22bee782   Tejun Heo   workqueue: implem...
3325
  	struct worker *uninitialized_var(new_worker);
db7bccf45   Tejun Heo   workqueue: reimpl...
3326
  	unsigned long flags;
3af24433e   Oleg Nesterov   workqueue: don't ...
3327

8bb784428   Rafael J. Wysocki   Add suspend-relat...
3328
  	action &= ~CPU_TASKS_FROZEN;
3af24433e   Oleg Nesterov   workqueue: don't ...
3329
  	switch (action) {
db7bccf45   Tejun Heo   workqueue: reimpl...
3330
3331
3332
3333
3334
3335
3336
  	case CPU_DOWN_PREPARE:
  		new_trustee = kthread_create(trustee_thread, gcwq,
  					     "workqueue_trustee/%d
  ", cpu);
  		if (IS_ERR(new_trustee))
  			return notifier_from_errno(PTR_ERR(new_trustee));
  		kthread_bind(new_trustee, cpu);
e22bee782   Tejun Heo   workqueue: implem...
3337
  		/* fall through */
3af24433e   Oleg Nesterov   workqueue: don't ...
3338
  	case CPU_UP_PREPARE:
e22bee782   Tejun Heo   workqueue: implem...
3339
3340
3341
3342
3343
3344
  		BUG_ON(gcwq->first_idle);
  		new_worker = create_worker(gcwq, false);
  		if (!new_worker) {
  			if (new_trustee)
  				kthread_stop(new_trustee);
  			return NOTIFY_BAD;
3af24433e   Oleg Nesterov   workqueue: don't ...
3345
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3346
  	}
db7bccf45   Tejun Heo   workqueue: reimpl...
3347
3348
  	/* some are called w/ irq disabled, don't disturb irq status */
  	spin_lock_irqsave(&gcwq->lock, flags);
3af24433e   Oleg Nesterov   workqueue: don't ...
3349

00dfcaf74   Oleg Nesterov   workqueues: shrin...
3350
  	switch (action) {
db7bccf45   Tejun Heo   workqueue: reimpl...
3351
3352
3353
3354
3355
3356
3357
  	case CPU_DOWN_PREPARE:
  		/* initialize trustee and tell it to acquire the gcwq */
  		BUG_ON(gcwq->trustee || gcwq->trustee_state != TRUSTEE_DONE);
  		gcwq->trustee = new_trustee;
  		gcwq->trustee_state = TRUSTEE_START;
  		wake_up_process(gcwq->trustee);
  		wait_trustee_state(gcwq, TRUSTEE_IN_CHARGE);
e22bee782   Tejun Heo   workqueue: implem...
3358
3359
3360
3361
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
  		/* fall through */
  	case CPU_UP_PREPARE:
  		BUG_ON(gcwq->first_idle);
  		gcwq->first_idle = new_worker;
  		break;
  
  	case CPU_DYING:
  		/*
  		 * Before this, the trustee and all workers except for
  		 * the ones which are still executing works from
  		 * before the last CPU down must be on the cpu.  After
  		 * this, they'll all be diasporas.
  		 */
  		gcwq->flags |= GCWQ_DISASSOCIATED;
db7bccf45   Tejun Heo   workqueue: reimpl...
3372
  		break;
3da1c84c0   Oleg Nesterov   workqueues: make ...
3373
  	case CPU_POST_DEAD:
db7bccf45   Tejun Heo   workqueue: reimpl...
3374
  		gcwq->trustee_state = TRUSTEE_BUTCHER;
e22bee782   Tejun Heo   workqueue: implem...
3375
3376
3377
3378
  		/* fall through */
  	case CPU_UP_CANCELED:
  		destroy_worker(gcwq->first_idle);
  		gcwq->first_idle = NULL;
db7bccf45   Tejun Heo   workqueue: reimpl...
3379
3380
3381
3382
  		break;
  
  	case CPU_DOWN_FAILED:
  	case CPU_ONLINE:
e22bee782   Tejun Heo   workqueue: implem...
3383
  		gcwq->flags &= ~GCWQ_DISASSOCIATED;
db7bccf45   Tejun Heo   workqueue: reimpl...
3384
3385
3386
3387
  		if (gcwq->trustee_state != TRUSTEE_DONE) {
  			gcwq->trustee_state = TRUSTEE_RELEASE;
  			wake_up_process(gcwq->trustee);
  			wait_trustee_state(gcwq, TRUSTEE_DONE);
3af24433e   Oleg Nesterov   workqueue: don't ...
3388
  		}
db7bccf45   Tejun Heo   workqueue: reimpl...
3389

e22bee782   Tejun Heo   workqueue: implem...
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
  		/*
  		 * Trustee is done and there might be no worker left.
  		 * Put the first_idle in and request a real manager to
  		 * take a look.
  		 */
  		spin_unlock_irq(&gcwq->lock);
  		kthread_bind(gcwq->first_idle->task, cpu);
  		spin_lock_irq(&gcwq->lock);
  		gcwq->flags |= GCWQ_MANAGE_WORKERS;
  		start_worker(gcwq->first_idle);
  		gcwq->first_idle = NULL;
db7bccf45   Tejun Heo   workqueue: reimpl...
3401
  		break;
00dfcaf74   Oleg Nesterov   workqueues: shrin...
3402
  	}
db7bccf45   Tejun Heo   workqueue: reimpl...
3403
  	spin_unlock_irqrestore(&gcwq->lock, flags);
1537663f5   Tejun Heo   workqueue: kill c...
3404
  	return notifier_from_errno(0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3405
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3406

2d3854a37   Rusty Russell   cpumask: introduc...
3407
  #ifdef CONFIG_SMP
8ccad40df   Rusty Russell   work_on_cpu: Use ...
3408

2d3854a37   Rusty Russell   cpumask: introduc...
3409
  struct work_for_cpu {
6b44003e5   Andrew Morton   work_on_cpu(): re...
3410
  	struct completion completion;
2d3854a37   Rusty Russell   cpumask: introduc...
3411
3412
3413
3414
  	long (*fn)(void *);
  	void *arg;
  	long ret;
  };
6b44003e5   Andrew Morton   work_on_cpu(): re...
3415
  static int do_work_for_cpu(void *_wfc)
2d3854a37   Rusty Russell   cpumask: introduc...
3416
  {
6b44003e5   Andrew Morton   work_on_cpu(): re...
3417
  	struct work_for_cpu *wfc = _wfc;
2d3854a37   Rusty Russell   cpumask: introduc...
3418
  	wfc->ret = wfc->fn(wfc->arg);
6b44003e5   Andrew Morton   work_on_cpu(): re...
3419
3420
  	complete(&wfc->completion);
  	return 0;
2d3854a37   Rusty Russell   cpumask: introduc...
3421
3422
3423
3424
3425
3426
3427
3428
  }
  
  /**
   * work_on_cpu - run a function in user context on a particular cpu
   * @cpu: the cpu to run on
   * @fn: the function to run
   * @arg: the function arg
   *
31ad90812   Rusty Russell   work_on_cpu: don'...
3429
3430
   * This will return the value @fn returns.
   * It is up to the caller to ensure that the cpu doesn't go offline.
6b44003e5   Andrew Morton   work_on_cpu(): re...
3431
   * The caller must not hold any locks which would prevent @fn from completing.
2d3854a37   Rusty Russell   cpumask: introduc...
3432
3433
3434
   */
  long work_on_cpu(unsigned int cpu, long (*fn)(void *), void *arg)
  {
6b44003e5   Andrew Morton   work_on_cpu(): re...
3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
3445
3446
3447
  	struct task_struct *sub_thread;
  	struct work_for_cpu wfc = {
  		.completion = COMPLETION_INITIALIZER_ONSTACK(wfc.completion),
  		.fn = fn,
  		.arg = arg,
  	};
  
  	sub_thread = kthread_create(do_work_for_cpu, &wfc, "work_for_cpu");
  	if (IS_ERR(sub_thread))
  		return PTR_ERR(sub_thread);
  	kthread_bind(sub_thread, cpu);
  	wake_up_process(sub_thread);
  	wait_for_completion(&wfc.completion);
2d3854a37   Rusty Russell   cpumask: introduc...
3448
3449
3450
3451
  	return wfc.ret;
  }
  EXPORT_SYMBOL_GPL(work_on_cpu);
  #endif /* CONFIG_SMP */
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
3452
3453
3454
3455
3456
3457
3458
  #ifdef CONFIG_FREEZER
  
  /**
   * freeze_workqueues_begin - begin freezing workqueues
   *
   * Start freezing workqueues.  After this function returns, all
   * freezeable workqueues will queue new works to their frozen_works
7e11629d0   Tejun Heo   workqueue: use sh...
3459
   * list instead of gcwq->worklist.
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
3460
3461
   *
   * CONTEXT:
8b03ae3cd   Tejun Heo   workqueue: introd...
3462
   * Grabs and releases workqueue_lock and gcwq->lock's.
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
3463
3464
3465
   */
  void freeze_workqueues_begin(void)
  {
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
3466
3467
3468
3469
3470
3471
  	unsigned int cpu;
  
  	spin_lock(&workqueue_lock);
  
  	BUG_ON(workqueue_freezing);
  	workqueue_freezing = true;
f34217977   Tejun Heo   workqueue: implem...
3472
  	for_each_gcwq_cpu(cpu) {
8b03ae3cd   Tejun Heo   workqueue: introd...
3473
  		struct global_cwq *gcwq = get_gcwq(cpu);
bdbc5dd7d   Tejun Heo   workqueue: prepar...
3474
  		struct workqueue_struct *wq;
8b03ae3cd   Tejun Heo   workqueue: introd...
3475
3476
  
  		spin_lock_irq(&gcwq->lock);
db7bccf45   Tejun Heo   workqueue: reimpl...
3477
3478
  		BUG_ON(gcwq->flags & GCWQ_FREEZING);
  		gcwq->flags |= GCWQ_FREEZING;
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
3479
3480
  		list_for_each_entry(wq, &workqueues, list) {
  			struct cpu_workqueue_struct *cwq = get_cwq(cpu, wq);
f34217977   Tejun Heo   workqueue: implem...
3481
  			if (cwq && wq->flags & WQ_FREEZEABLE)
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
3482
  				cwq->max_active = 0;
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
3483
  		}
8b03ae3cd   Tejun Heo   workqueue: introd...
3484
3485
  
  		spin_unlock_irq(&gcwq->lock);
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
3486
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504
3505
  	}
  
  	spin_unlock(&workqueue_lock);
  }
  
  /**
   * freeze_workqueues_busy - are freezeable workqueues still busy?
   *
   * Check whether freezing is complete.  This function must be called
   * between freeze_workqueues_begin() and thaw_workqueues().
   *
   * CONTEXT:
   * Grabs and releases workqueue_lock.
   *
   * RETURNS:
   * %true if some freezeable workqueues are still busy.  %false if
   * freezing is complete.
   */
  bool freeze_workqueues_busy(void)
  {
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
3506
3507
3508
3509
3510
3511
  	unsigned int cpu;
  	bool busy = false;
  
  	spin_lock(&workqueue_lock);
  
  	BUG_ON(!workqueue_freezing);
f34217977   Tejun Heo   workqueue: implem...
3512
  	for_each_gcwq_cpu(cpu) {
bdbc5dd7d   Tejun Heo   workqueue: prepar...
3513
  		struct workqueue_struct *wq;
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
3514
3515
3516
3517
3518
3519
  		/*
  		 * nr_active is monotonically decreasing.  It's safe
  		 * to peek without lock.
  		 */
  		list_for_each_entry(wq, &workqueues, list) {
  			struct cpu_workqueue_struct *cwq = get_cwq(cpu, wq);
f34217977   Tejun Heo   workqueue: implem...
3520
  			if (!cwq || !(wq->flags & WQ_FREEZEABLE))
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
3534
3535
3536
3537
3538
  				continue;
  
  			BUG_ON(cwq->nr_active < 0);
  			if (cwq->nr_active) {
  				busy = true;
  				goto out_unlock;
  			}
  		}
  	}
  out_unlock:
  	spin_unlock(&workqueue_lock);
  	return busy;
  }
  
  /**
   * thaw_workqueues - thaw workqueues
   *
   * Thaw workqueues.  Normal queueing is restored and all collected
7e11629d0   Tejun Heo   workqueue: use sh...
3539
   * frozen works are transferred to their respective gcwq worklists.
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
3540
3541
   *
   * CONTEXT:
8b03ae3cd   Tejun Heo   workqueue: introd...
3542
   * Grabs and releases workqueue_lock and gcwq->lock's.
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
3543
3544
3545
   */
  void thaw_workqueues(void)
  {
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
3546
3547
3548
3549
3550
3551
  	unsigned int cpu;
  
  	spin_lock(&workqueue_lock);
  
  	if (!workqueue_freezing)
  		goto out_unlock;
f34217977   Tejun Heo   workqueue: implem...
3552
  	for_each_gcwq_cpu(cpu) {
8b03ae3cd   Tejun Heo   workqueue: introd...
3553
  		struct global_cwq *gcwq = get_gcwq(cpu);
bdbc5dd7d   Tejun Heo   workqueue: prepar...
3554
  		struct workqueue_struct *wq;
8b03ae3cd   Tejun Heo   workqueue: introd...
3555
3556
  
  		spin_lock_irq(&gcwq->lock);
db7bccf45   Tejun Heo   workqueue: reimpl...
3557
3558
  		BUG_ON(!(gcwq->flags & GCWQ_FREEZING));
  		gcwq->flags &= ~GCWQ_FREEZING;
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
3559
3560
  		list_for_each_entry(wq, &workqueues, list) {
  			struct cpu_workqueue_struct *cwq = get_cwq(cpu, wq);
f34217977   Tejun Heo   workqueue: implem...
3561
  			if (!cwq || !(wq->flags & WQ_FREEZEABLE))
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
3562
  				continue;
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
3563
3564
3565
3566
3567
3568
  			/* restore max_active and repopulate worklist */
  			cwq->max_active = wq->saved_max_active;
  
  			while (!list_empty(&cwq->delayed_works) &&
  			       cwq->nr_active < cwq->max_active)
  				cwq_activate_first_delayed(cwq);
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
3569
  		}
8b03ae3cd   Tejun Heo   workqueue: introd...
3570

e22bee782   Tejun Heo   workqueue: implem...
3571
  		wake_up_worker(gcwq);
8b03ae3cd   Tejun Heo   workqueue: introd...
3572
  		spin_unlock_irq(&gcwq->lock);
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
3573
3574
3575
3576
3577
3578
3579
  	}
  
  	workqueue_freezing = false;
  out_unlock:
  	spin_unlock(&workqueue_lock);
  }
  #endif /* CONFIG_FREEZER */
6ee0578b4   Suresh Siddha   workqueue: mark i...
3580
  static int __init init_workqueues(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3581
  {
c34056a3f   Tejun Heo   workqueue: introd...
3582
  	unsigned int cpu;
c8e55f360   Tejun Heo   workqueue: implem...
3583
  	int i;
c34056a3f   Tejun Heo   workqueue: introd...
3584

f6500947a   Tejun Heo   workqueue: workqu...
3585
  	cpu_notifier(workqueue_cpu_callback, CPU_PRI_WORKQUEUE);
8b03ae3cd   Tejun Heo   workqueue: introd...
3586
3587
  
  	/* initialize gcwqs */
f34217977   Tejun Heo   workqueue: implem...
3588
  	for_each_gcwq_cpu(cpu) {
8b03ae3cd   Tejun Heo   workqueue: introd...
3589
3590
3591
  		struct global_cwq *gcwq = get_gcwq(cpu);
  
  		spin_lock_init(&gcwq->lock);
7e11629d0   Tejun Heo   workqueue: use sh...
3592
  		INIT_LIST_HEAD(&gcwq->worklist);
8b03ae3cd   Tejun Heo   workqueue: introd...
3593
  		gcwq->cpu = cpu;
477a3c33d   Tejun Heo   workqueue: fix GC...
3594
  		gcwq->flags |= GCWQ_DISASSOCIATED;
8b03ae3cd   Tejun Heo   workqueue: introd...
3595

c8e55f360   Tejun Heo   workqueue: implem...
3596
3597
3598
  		INIT_LIST_HEAD(&gcwq->idle_list);
  		for (i = 0; i < BUSY_WORKER_HASH_SIZE; i++)
  			INIT_HLIST_HEAD(&gcwq->busy_hash[i]);
e22bee782   Tejun Heo   workqueue: implem...
3599
3600
3601
  		init_timer_deferrable(&gcwq->idle_timer);
  		gcwq->idle_timer.function = idle_worker_timeout;
  		gcwq->idle_timer.data = (unsigned long)gcwq;
e7577c50f   Rusty Russell   cpumask: convert ...
3602

e22bee782   Tejun Heo   workqueue: implem...
3603
3604
  		setup_timer(&gcwq->mayday_timer, gcwq_mayday_timeout,
  			    (unsigned long)gcwq);
8b03ae3cd   Tejun Heo   workqueue: introd...
3605
  		ida_init(&gcwq->worker_ida);
db7bccf45   Tejun Heo   workqueue: reimpl...
3606
3607
3608
  
  		gcwq->trustee_state = TRUSTEE_DONE;
  		init_waitqueue_head(&gcwq->trustee_wait);
8b03ae3cd   Tejun Heo   workqueue: introd...
3609
  	}
e22bee782   Tejun Heo   workqueue: implem...
3610
  	/* create the initial worker */
f34217977   Tejun Heo   workqueue: implem...
3611
  	for_each_online_gcwq_cpu(cpu) {
e22bee782   Tejun Heo   workqueue: implem...
3612
3613
  		struct global_cwq *gcwq = get_gcwq(cpu);
  		struct worker *worker;
477a3c33d   Tejun Heo   workqueue: fix GC...
3614
3615
  		if (cpu != WORK_CPU_UNBOUND)
  			gcwq->flags &= ~GCWQ_DISASSOCIATED;
e22bee782   Tejun Heo   workqueue: implem...
3616
3617
3618
3619
3620
3621
  		worker = create_worker(gcwq, true);
  		BUG_ON(!worker);
  		spin_lock_irq(&gcwq->lock);
  		start_worker(worker);
  		spin_unlock_irq(&gcwq->lock);
  	}
d320c0383   Tejun Heo   workqueue: s/__cr...
3622
3623
3624
  	system_wq = alloc_workqueue("events", 0, 0);
  	system_long_wq = alloc_workqueue("events_long", 0, 0);
  	system_nrt_wq = alloc_workqueue("events_nrt", WQ_NON_REENTRANT, 0);
f34217977   Tejun Heo   workqueue: implem...
3625
3626
  	system_unbound_wq = alloc_workqueue("events_unbound", WQ_UNBOUND,
  					    WQ_UNBOUND_MAX_ACTIVE);
e5cba24e3   Hitoshi Mitake   workqueue: check ...
3627
3628
  	BUG_ON(!system_wq || !system_long_wq || !system_nrt_wq ||
  	       !system_unbound_wq);
6ee0578b4   Suresh Siddha   workqueue: mark i...
3629
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3630
  }
6ee0578b4   Suresh Siddha   workqueue: mark i...
3631
  early_initcall(init_workqueues);