Blame view

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

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

e22bee782   Tejun Heo   workqueue: implem...
118
119
120
121
  /*
   * 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...
122
  struct worker {
c8e55f360   Tejun Heo   workqueue: implem...
123
124
125
126
127
  	/* 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
128

c34056a3f   Tejun Heo   workqueue: introd...
129
  	struct work_struct	*current_work;	/* L: work being processed */
8cca0eea3   Tejun Heo   workqueue: add fi...
130
  	struct cpu_workqueue_struct *current_cwq; /* L: current_work's cwq */
affee4b29   Tejun Heo   workqueue: reimpl...
131
  	struct list_head	scheduled;	/* L: scheduled works */
c34056a3f   Tejun Heo   workqueue: introd...
132
  	struct task_struct	*task;		/* I: worker task */
8b03ae3cd   Tejun Heo   workqueue: introd...
133
  	struct global_cwq	*gcwq;		/* I: the associated gcwq */
e22bee782   Tejun Heo   workqueue: implem...
134
135
136
  	/* 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...
137
  	int			id;		/* I: worker id */
e22bee782   Tejun Heo   workqueue: implem...
138
  	struct work_struct	rebind_work;	/* L: rebind worker to cpu */
c34056a3f   Tejun Heo   workqueue: introd...
139
  };
4690c4ab5   Tejun Heo   workqueue: misc/c...
140
  /*
e22bee782   Tejun Heo   workqueue: implem...
141
142
143
   * 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...
144
145
146
   */
  struct global_cwq {
  	spinlock_t		lock;		/* the gcwq lock */
7e11629d0   Tejun Heo   workqueue: use sh...
147
  	struct list_head	worklist;	/* L: list of pending works */
8b03ae3cd   Tejun Heo   workqueue: introd...
148
  	unsigned int		cpu;		/* I: the associated cpu */
db7bccf45   Tejun Heo   workqueue: reimpl...
149
  	unsigned int		flags;		/* L: GCWQ_* flags */
c8e55f360   Tejun Heo   workqueue: implem...
150
151
152
153
154
  
  	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...
155
  	struct list_head	idle_list;	/* X: list of idle workers */
c8e55f360   Tejun Heo   workqueue: implem...
156
157
  	struct hlist_head	busy_hash[BUSY_WORKER_HASH_SIZE];
  						/* L: hash of busy workers */
e22bee782   Tejun Heo   workqueue: implem...
158
159
  	struct timer_list	idle_timer;	/* L: worker idle timeout */
  	struct timer_list	mayday_timer;	/* L: SOS timer for dworkers */
8b03ae3cd   Tejun Heo   workqueue: introd...
160
  	struct ida		worker_ida;	/* L: for worker IDs */
db7bccf45   Tejun Heo   workqueue: reimpl...
161
162
163
164
  
  	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...
165
  	struct worker		*first_idle;	/* L: first idle worker */
8b03ae3cd   Tejun Heo   workqueue: introd...
166
167
168
  } ____cacheline_aligned_in_smp;
  
  /*
502ca9d81   Tejun Heo   workqueue: make s...
169
   * The per-CPU workqueue.  The lower WORK_STRUCT_FLAG_BITS of
0f900049c   Tejun Heo   workqueue: update...
170
171
   * 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
172
173
   */
  struct cpu_workqueue_struct {
8b03ae3cd   Tejun Heo   workqueue: introd...
174
  	struct global_cwq	*gcwq;		/* I: the associated gcwq */
4690c4ab5   Tejun Heo   workqueue: misc/c...
175
  	struct workqueue_struct *wq;		/* I: the owning workqueue */
73f53c4aa   Tejun Heo   workqueue: reimpl...
176
177
178
179
  	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...
180
  	int			nr_active;	/* L: nr of active works */
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
181
  	int			max_active;	/* L: max active works */
1e19ffc63   Tejun Heo   workqueue: implem...
182
  	struct list_head	delayed_works;	/* L: delayed works */
0f900049c   Tejun Heo   workqueue: update...
183
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
184
185
  
  /*
73f53c4aa   Tejun Heo   workqueue: reimpl...
186
187
188
189
190
191
192
193
194
   * 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...
195
196
197
198
199
200
201
202
203
   * 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...
204
  #define alloc_mayday_mask(maskp, gfp)		zalloc_cpumask_var((maskp), (gfp))
f2e005aaf   Tejun Heo   workqueue: fix ma...
205
206
207
208
209
210
211
212
213
  #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
214
215
216
217
218
219
  
  /*
   * The externally visible workqueue abstraction is an array of
   * per-CPU workqueues:
   */
  struct workqueue_struct {
9c5a2ba70   Tejun Heo   workqueue: separa...
220
  	unsigned int		flags;		/* W: WQ_* flags */
bdbc5dd7d   Tejun Heo   workqueue: prepar...
221
222
223
224
225
  	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...
226
  	struct list_head	list;		/* W: list of all workqueues */
73f53c4aa   Tejun Heo   workqueue: reimpl...
227
228
229
230
231
232
233
234
  
  	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...
235
  	mayday_mask_t		mayday_mask;	/* cpus requesting rescue */
e22bee782   Tejun Heo   workqueue: implem...
236
  	struct worker		*rescuer;	/* I: rescue worker */
9c5a2ba70   Tejun Heo   workqueue: separa...
237
  	int			nr_drainers;	/* W: drain in progress */
dcd989cb7   Tejun Heo   workqueue: implem...
238
  	int			saved_max_active; /* W: saved cwq max_active */
4690c4ab5   Tejun Heo   workqueue: misc/c...
239
  	const char		*name;		/* I: workqueue name */
4e6045f13   Johannes Berg   workqueue: debug ...
240
  #ifdef CONFIG_LOCKDEP
4690c4ab5   Tejun Heo   workqueue: misc/c...
241
  	struct lockdep_map	lockdep_map;
4e6045f13   Johannes Berg   workqueue: debug ...
242
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
243
  };
d320c0383   Tejun Heo   workqueue: s/__cr...
244
245
246
  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...
247
  struct workqueue_struct *system_unbound_wq __read_mostly;
24d51add7   Tejun Heo   workqueue: fix bu...
248
  struct workqueue_struct *system_freezable_wq __read_mostly;
d320c0383   Tejun Heo   workqueue: s/__cr...
249
250
251
  EXPORT_SYMBOL_GPL(system_wq);
  EXPORT_SYMBOL_GPL(system_long_wq);
  EXPORT_SYMBOL_GPL(system_nrt_wq);
f34217977   Tejun Heo   workqueue: implem...
252
  EXPORT_SYMBOL_GPL(system_unbound_wq);
24d51add7   Tejun Heo   workqueue: fix bu...
253
  EXPORT_SYMBOL_GPL(system_freezable_wq);
d320c0383   Tejun Heo   workqueue: s/__cr...
254

97bd23470   Tejun Heo   workqueue: prepar...
255
256
  #define CREATE_TRACE_POINTS
  #include <trace/events/workqueue.h>
db7bccf45   Tejun Heo   workqueue: reimpl...
257
258
259
  #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...
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
  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...
280
281
282
283
284
285
286
287
288
289
290
291
292
  /*
   * 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...
293
294
295
296
297
298
299
300
301
302
303
304
305
306
  #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...
307
308
309
  #ifdef CONFIG_DEBUG_OBJECTS_WORK
  
  static struct debug_obj_descr work_debug_descr;
997772884   Stanislaw Gruszka   debugobjects: Add...
310
311
312
313
  static void *work_debug_hint(void *addr)
  {
  	return ((struct work_struct *) addr)->func;
  }
dc186ad74   Thomas Gleixner   workqueue: Add de...
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
342
343
344
345
346
347
348
  /*
   * 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...
349
  		if (test_bit(WORK_STRUCT_STATIC_BIT, work_data_bits(work))) {
dc186ad74   Thomas Gleixner   workqueue: Add de...
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
  			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",
997772884   Stanislaw Gruszka   debugobjects: Add...
385
  	.debug_hint	= work_debug_hint,
dc186ad74   Thomas Gleixner   workqueue: Add de...
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
412
413
414
415
416
417
418
419
  	.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...
420
421
  /* Serializes the accesses to the list of workqueues. */
  static DEFINE_SPINLOCK(workqueue_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
422
  static LIST_HEAD(workqueues);
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
423
  static bool workqueue_freezing;		/* W: have wqs started freezing? */
c34056a3f   Tejun Heo   workqueue: introd...
424

e22bee782   Tejun Heo   workqueue: implem...
425
426
427
428
429
  /*
   * 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...
430
  static DEFINE_PER_CPU(struct global_cwq, global_cwq);
e22bee782   Tejun Heo   workqueue: implem...
431
  static DEFINE_PER_CPU_SHARED_ALIGNED(atomic_t, gcwq_nr_running);
8b03ae3cd   Tejun Heo   workqueue: introd...
432

f34217977   Tejun Heo   workqueue: implem...
433
434
435
436
437
438
439
  /*
   * 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...
440
  static int worker_thread(void *__worker);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
441

8b03ae3cd   Tejun Heo   workqueue: introd...
442
443
  static struct global_cwq *get_gcwq(unsigned int cpu)
  {
f34217977   Tejun Heo   workqueue: implem...
444
445
446
447
  	if (cpu != WORK_CPU_UNBOUND)
  		return &per_cpu(global_cwq, cpu);
  	else
  		return &unbound_global_cwq;
8b03ae3cd   Tejun Heo   workqueue: introd...
448
  }
e22bee782   Tejun Heo   workqueue: implem...
449
450
  static atomic_t *get_gcwq_nr_running(unsigned int cpu)
  {
f34217977   Tejun Heo   workqueue: implem...
451
452
453
454
  	if (cpu != WORK_CPU_UNBOUND)
  		return &per_cpu(gcwq_nr_running, cpu);
  	else
  		return &unbound_gcwq_nr_running;
e22bee782   Tejun Heo   workqueue: implem...
455
  }
1537663f5   Tejun Heo   workqueue: kill c...
456
457
  static struct cpu_workqueue_struct *get_cwq(unsigned int cpu,
  					    struct workqueue_struct *wq)
b1f4ec172   Oleg Nesterov   workqueue: introd...
458
  {
f34217977   Tejun Heo   workqueue: implem...
459
460
461
462
  	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...
463
  #else
f34217977   Tejun Heo   workqueue: implem...
464
  			return wq->cpu_wq.single;
bdbc5dd7d   Tejun Heo   workqueue: prepar...
465
  #endif
f34217977   Tejun Heo   workqueue: implem...
466
467
468
469
  		}
  	} else if (likely(cpu == WORK_CPU_UNBOUND))
  		return wq->cpu_wq.single;
  	return NULL;
b1f4ec172   Oleg Nesterov   workqueue: introd...
470
  }
73f53c4aa   Tejun Heo   workqueue: reimpl...
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
  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
486

14441960e   Oleg Nesterov   simplify cleanup_...
487
  /*
e120153dd   Tejun Heo   workqueue: fix ho...
488
489
490
   * 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 ...
491
492
493
494
495
496
497
498
499
   *
   * 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_...
500
   */
7a22ad757   Tejun Heo   workqueue: carry ...
501
502
  static inline void set_work_data(struct work_struct *work, unsigned long data,
  				 unsigned long flags)
365970a1e   David Howells   WorkStruct: Merge...
503
  {
4594bf159   David Howells   [PATCH] WorkStruc...
504
  	BUG_ON(!work_pending(work));
7a22ad757   Tejun Heo   workqueue: carry ...
505
506
  	atomic_long_set(&work->data, data | flags | work_static(work));
  }
365970a1e   David Howells   WorkStruct: Merge...
507

7a22ad757   Tejun Heo   workqueue: carry ...
508
509
510
511
512
  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...
513
  		      WORK_STRUCT_PENDING | WORK_STRUCT_CWQ | extra_flags);
365970a1e   David Howells   WorkStruct: Merge...
514
  }
7a22ad757   Tejun Heo   workqueue: carry ...
515
516
517
518
  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...
519

7a22ad757   Tejun Heo   workqueue: carry ...
520
  static void clear_work_data(struct work_struct *work)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
521
  {
7a22ad757   Tejun Heo   workqueue: carry ...
522
  	set_work_data(work, WORK_STRUCT_NO_CPU, 0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
523
  }
7a22ad757   Tejun Heo   workqueue: carry ...
524
  static struct cpu_workqueue_struct *get_work_cwq(struct work_struct *work)
b1f4ec172   Oleg Nesterov   workqueue: introd...
525
  {
e120153dd   Tejun Heo   workqueue: fix ho...
526
  	unsigned long data = atomic_long_read(&work->data);
7a22ad757   Tejun Heo   workqueue: carry ...
527

e120153dd   Tejun Heo   workqueue: fix ho...
528
529
530
531
  	if (data & WORK_STRUCT_CWQ)
  		return (void *)(data & WORK_STRUCT_WQ_DATA_MASK);
  	else
  		return NULL;
4d707b9f4   Oleg Nesterov   workqueue: change...
532
  }
7a22ad757   Tejun Heo   workqueue: carry ...
533
  static struct global_cwq *get_work_gcwq(struct work_struct *work)
365970a1e   David Howells   WorkStruct: Merge...
534
  {
e120153dd   Tejun Heo   workqueue: fix ho...
535
  	unsigned long data = atomic_long_read(&work->data);
7a22ad757   Tejun Heo   workqueue: carry ...
536
  	unsigned int cpu;
e120153dd   Tejun Heo   workqueue: fix ho...
537
538
539
  	if (data & WORK_STRUCT_CWQ)
  		return ((struct cpu_workqueue_struct *)
  			(data & WORK_STRUCT_WQ_DATA_MASK))->gcwq;
7a22ad757   Tejun Heo   workqueue: carry ...
540
541
  
  	cpu = data >> WORK_STRUCT_FLAG_BITS;
bdbc5dd7d   Tejun Heo   workqueue: prepar...
542
  	if (cpu == WORK_CPU_NONE)
7a22ad757   Tejun Heo   workqueue: carry ...
543
  		return NULL;
f34217977   Tejun Heo   workqueue: implem...
544
  	BUG_ON(cpu >= nr_cpu_ids && cpu != WORK_CPU_UNBOUND);
7a22ad757   Tejun Heo   workqueue: carry ...
545
  	return get_gcwq(cpu);
b1f4ec172   Oleg Nesterov   workqueue: introd...
546
  }
e22bee782   Tejun Heo   workqueue: implem...
547
548
549
550
551
  /*
   * 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...
552
  static bool __need_more_worker(struct global_cwq *gcwq)
a848e3b67   Oleg Nesterov   workqueue: introd...
553
  {
649027d73   Tejun Heo   workqueue: implem...
554
555
  	return !atomic_read(get_gcwq_nr_running(gcwq->cpu)) ||
  		gcwq->flags & GCWQ_HIGHPRI_PENDING;
a848e3b67   Oleg Nesterov   workqueue: introd...
556
  }
4594bf159   David Howells   [PATCH] WorkStruc...
557
  /*
e22bee782   Tejun Heo   workqueue: implem...
558
559
   * Need to wake up a worker?  Called from anything but currently
   * running workers.
4594bf159   David Howells   [PATCH] WorkStruc...
560
   */
e22bee782   Tejun Heo   workqueue: implem...
561
  static bool need_more_worker(struct global_cwq *gcwq)
365970a1e   David Howells   WorkStruct: Merge...
562
  {
649027d73   Tejun Heo   workqueue: implem...
563
  	return !list_empty(&gcwq->worklist) && __need_more_worker(gcwq);
e22bee782   Tejun Heo   workqueue: implem...
564
  }
4594bf159   David Howells   [PATCH] WorkStruc...
565

e22bee782   Tejun Heo   workqueue: implem...
566
567
568
569
570
571
572
573
574
575
  /* 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...
576
577
578
  	return !list_empty(&gcwq->worklist) &&
  		(atomic_read(nr_running) <= 1 ||
  		 gcwq->flags & GCWQ_HIGHPRI_PENDING);
e22bee782   Tejun Heo   workqueue: implem...
579
580
581
582
583
584
585
  }
  
  /* 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...
586

e22bee782   Tejun Heo   workqueue: implem...
587
588
589
590
591
592
593
594
595
596
597
598
599
600
  /* 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...
601
  }
4d707b9f4   Oleg Nesterov   workqueue: change...
602
  /*
e22bee782   Tejun Heo   workqueue: implem...
603
604
   * Wake up functions.
   */
7e11629d0   Tejun Heo   workqueue: use sh...
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
  /* 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...
630
  /**
e22bee782   Tejun Heo   workqueue: implem...
631
632
633
634
635
636
637
638
639
640
641
642
643
   * 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 ...
644
  	if (!(worker->flags & WORKER_NOT_RUNNING))
e22bee782   Tejun Heo   workqueue: implem...
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
  		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 ...
669
  	if (worker->flags & WORKER_NOT_RUNNING)
e22bee782   Tejun Heo   workqueue: implem...
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
  		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...
693
   * @worker: self
d302f0178   Tejun Heo   workqueue: implem...
694
695
696
   * @flags: flags to set
   * @wakeup: wakeup an idle worker if necessary
   *
e22bee782   Tejun Heo   workqueue: implem...
697
698
699
   * 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...
700
   *
cb4447669   Tejun Heo   workqueue: use wo...
701
702
   * CONTEXT:
   * spin_lock_irq(gcwq->lock)
d302f0178   Tejun Heo   workqueue: implem...
703
704
705
706
   */
  static inline void worker_set_flags(struct worker *worker, unsigned int flags,
  				    bool wakeup)
  {
e22bee782   Tejun Heo   workqueue: implem...
707
  	struct global_cwq *gcwq = worker->gcwq;
cb4447669   Tejun Heo   workqueue: use wo...
708
  	WARN_ON_ONCE(worker->task != current);
e22bee782   Tejun Heo   workqueue: implem...
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
  	/*
  	 * 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...
725
726
727
728
  	worker->flags |= flags;
  }
  
  /**
e22bee782   Tejun Heo   workqueue: implem...
729
   * worker_clr_flags - clear worker flags and adjust nr_running accordingly
cb4447669   Tejun Heo   workqueue: use wo...
730
   * @worker: self
d302f0178   Tejun Heo   workqueue: implem...
731
732
   * @flags: flags to clear
   *
e22bee782   Tejun Heo   workqueue: implem...
733
   * Clear @flags in @worker->flags and adjust nr_running accordingly.
d302f0178   Tejun Heo   workqueue: implem...
734
   *
cb4447669   Tejun Heo   workqueue: use wo...
735
736
   * CONTEXT:
   * spin_lock_irq(gcwq->lock)
d302f0178   Tejun Heo   workqueue: implem...
737
738
739
   */
  static inline void worker_clr_flags(struct worker *worker, unsigned int flags)
  {
e22bee782   Tejun Heo   workqueue: implem...
740
741
  	struct global_cwq *gcwq = worker->gcwq;
  	unsigned int oflags = worker->flags;
cb4447669   Tejun Heo   workqueue: use wo...
742
  	WARN_ON_ONCE(worker->task != current);
d302f0178   Tejun Heo   workqueue: implem...
743
  	worker->flags &= ~flags;
e22bee782   Tejun Heo   workqueue: implem...
744

42c025f3d   Tejun Heo   workqueue: note t...
745
746
747
748
749
  	/*
  	 * 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...
750
751
752
  	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...
753
754
755
  }
  
  /**
c8e55f360   Tejun Heo   workqueue: implem...
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
   * 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...
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
819
820
821
822
823
824
825
826
   * __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...
827
   */
8cca0eea3   Tejun Heo   workqueue: add fi...
828
829
  static struct worker *find_worker_executing_work(struct global_cwq *gcwq,
  						 struct work_struct *work)
4d707b9f4   Oleg Nesterov   workqueue: change...
830
  {
8cca0eea3   Tejun Heo   workqueue: add fi...
831
832
  	return __find_worker_executing_work(gcwq, busy_worker_head(gcwq, work),
  					    work);
4d707b9f4   Oleg Nesterov   workqueue: change...
833
  }
8cca0eea3   Tejun Heo   workqueue: add fi...
834
  /**
649027d73   Tejun Heo   workqueue: implem...
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
   * 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...
854
  {
649027d73   Tejun Heo   workqueue: implem...
855
856
857
858
859
860
861
862
863
864
865
866
867
868
  	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...
869
  }
649027d73   Tejun Heo   workqueue: implem...
870
  /**
7e11629d0   Tejun Heo   workqueue: use sh...
871
   * insert_work - insert a work into gcwq
4690c4ab5   Tejun Heo   workqueue: misc/c...
872
873
874
875
876
   * @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...
877
878
   * 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...
879
880
   *
   * CONTEXT:
8b03ae3cd   Tejun Heo   workqueue: introd...
881
   * spin_lock_irq(gcwq->lock).
4690c4ab5   Tejun Heo   workqueue: misc/c...
882
   */
b89deed32   Oleg Nesterov   implement flush_w...
883
  static void insert_work(struct cpu_workqueue_struct *cwq,
4690c4ab5   Tejun Heo   workqueue: misc/c...
884
885
  			struct work_struct *work, struct list_head *head,
  			unsigned int extra_flags)
b89deed32   Oleg Nesterov   implement flush_w...
886
  {
e22bee782   Tejun Heo   workqueue: implem...
887
  	struct global_cwq *gcwq = cwq->gcwq;
4690c4ab5   Tejun Heo   workqueue: misc/c...
888
  	/* we own @work, set data and link */
7a22ad757   Tejun Heo   workqueue: carry ...
889
  	set_work_cwq(work, cwq, extra_flags);
e1d8aa9f1   Frederic Weisbecker   tracing: add a ne...
890

6e84d644b   Oleg Nesterov   make cancel_rearm...
891
892
893
894
895
  	/*
  	 * 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...
896

1a4d9b0aa   Oleg Nesterov   workqueues: inser...
897
  	list_add_tail(&work->entry, head);
e22bee782   Tejun Heo   workqueue: implem...
898
899
900
901
902
903
904
  
  	/*
  	 * 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...
905
  	if (__need_more_worker(gcwq))
e22bee782   Tejun Heo   workqueue: implem...
906
  		wake_up_worker(gcwq);
b89deed32   Oleg Nesterov   implement flush_w...
907
  }
c8efcc258   Tejun Heo   workqueue: allow ...
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
  /*
   * 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...
939
  static void __queue_work(unsigned int cpu, struct workqueue_struct *wq,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
940
941
  			 struct work_struct *work)
  {
502ca9d81   Tejun Heo   workqueue: make s...
942
943
  	struct global_cwq *gcwq;
  	struct cpu_workqueue_struct *cwq;
1e19ffc63   Tejun Heo   workqueue: implem...
944
  	struct list_head *worklist;
8a2e8e5de   Tejun Heo   workqueue: fix cw...
945
  	unsigned int work_flags;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
946
  	unsigned long flags;
dc186ad74   Thomas Gleixner   workqueue: Add de...
947
  	debug_work_activate(work);
1e19ffc63   Tejun Heo   workqueue: implem...
948

c8efcc258   Tejun Heo   workqueue: allow ...
949
  	/* if dying, only works from the same workqueue are allowed */
9c5a2ba70   Tejun Heo   workqueue: separa...
950
  	if (unlikely(wq->flags & WQ_DRAINING) &&
c8efcc258   Tejun Heo   workqueue: allow ...
951
  	    WARN_ON_ONCE(!is_chained_work(wq)))
e41e704bc   Tejun Heo   workqueue: improv...
952
  		return;
c7fc77f78   Tejun Heo   workqueue: remove...
953
954
  	/* determine gcwq to use */
  	if (!(wq->flags & WQ_UNBOUND)) {
18aa9effa   Tejun Heo   workqueue: implem...
955
  		struct global_cwq *last_gcwq;
c7fc77f78   Tejun Heo   workqueue: remove...
956
957
  		if (unlikely(cpu == WORK_CPU_UNBOUND))
  			cpu = raw_smp_processor_id();
18aa9effa   Tejun Heo   workqueue: implem...
958
959
960
961
962
963
  		/*
  		 * 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...
964
  		gcwq = get_gcwq(cpu);
18aa9effa   Tejun Heo   workqueue: implem...
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
  		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...
982
983
984
  	} else {
  		gcwq = get_gcwq(WORK_CPU_UNBOUND);
  		spin_lock_irqsave(&gcwq->lock, flags);
502ca9d81   Tejun Heo   workqueue: make s...
985
986
987
988
  	}
  
  	/* gcwq determined, get cwq and queue */
  	cwq = get_cwq(gcwq->cpu, wq);
cdadf0097   Tejun Heo   workqueue: add qu...
989
  	trace_workqueue_queue_work(cpu, cwq, work);
502ca9d81   Tejun Heo   workqueue: make s...
990

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

73f53c4aa   Tejun Heo   workqueue: reimpl...
993
  	cwq->nr_in_flight[cwq->work_color]++;
8a2e8e5de   Tejun Heo   workqueue: fix cw...
994
  	work_flags = work_color_to_flags(cwq->work_color);
1e19ffc63   Tejun Heo   workqueue: implem...
995
996
  
  	if (likely(cwq->nr_active < cwq->max_active)) {
cdadf0097   Tejun Heo   workqueue: add qu...
997
  		trace_workqueue_activate_work(work);
1e19ffc63   Tejun Heo   workqueue: implem...
998
  		cwq->nr_active++;
649027d73   Tejun Heo   workqueue: implem...
999
  		worklist = gcwq_determine_ins_pos(gcwq, cwq);
8a2e8e5de   Tejun Heo   workqueue: fix cw...
1000
1001
  	} else {
  		work_flags |= WORK_STRUCT_DELAYED;
1e19ffc63   Tejun Heo   workqueue: implem...
1002
  		worklist = &cwq->delayed_works;
8a2e8e5de   Tejun Heo   workqueue: fix cw...
1003
  	}
1e19ffc63   Tejun Heo   workqueue: implem...
1004

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

8b03ae3cd   Tejun Heo   workqueue: introd...
1007
  	spin_unlock_irqrestore(&gcwq->lock, flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1008
  }
0fcb78c22   Rolf Eike Beer   [PATCH] Add DocBo...
1009
1010
1011
1012
1013
  /**
   * queue_work - queue work on a workqueue
   * @wq: workqueue to use
   * @work: work to queue
   *
057647fc4   Alan Stern   [PATCH] workqueue...
1014
   * Returns 0 if @work was already on a queue, non-zero otherwise.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1015
   *
00dfcaf74   Oleg Nesterov   workqueues: shrin...
1016
1017
   * 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
1018
   */
7ad5b3a50   Harvey Harrison   kernel: remove fa...
1019
  int queue_work(struct workqueue_struct *wq, struct work_struct *work)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1020
  {
ef1ca236b   Oleg Nesterov   workqueues: queue...
1021
1022
1023
1024
  	int ret;
  
  	ret = queue_work_on(get_cpu(), wq, work);
  	put_cpu();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1025
1026
  	return ret;
  }
ae90dd5db   Dave Jones   Move workqueue ex...
1027
  EXPORT_SYMBOL_GPL(queue_work);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1028

c1a220e7a   Zhang Rui   pm: introduce new...
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
  /**
   * 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...
1044
  	if (!test_and_set_bit(WORK_STRUCT_PENDING_BIT, work_data_bits(work))) {
4690c4ab5   Tejun Heo   workqueue: misc/c...
1045
  		__queue_work(cpu, wq, work);
c1a220e7a   Zhang Rui   pm: introduce new...
1046
1047
1048
1049
1050
  		ret = 1;
  	}
  	return ret;
  }
  EXPORT_SYMBOL_GPL(queue_work_on);
6d141c3ff   Li Zefan   workqueue: make d...
1051
  static void delayed_work_timer_fn(unsigned long __data)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1052
  {
52bad64d9   David Howells   WorkStruct: Separ...
1053
  	struct delayed_work *dwork = (struct delayed_work *)__data;
7a22ad757   Tejun Heo   workqueue: carry ...
1054
  	struct cpu_workqueue_struct *cwq = get_work_cwq(&dwork->work);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1055

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

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

0fcb78c22   Rolf Eike Beer   [PATCH] Add DocBo...
1076
1077
1078
1079
  /**
   * 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...
1080
   * @dwork: work to queue
0fcb78c22   Rolf Eike Beer   [PATCH] Add DocBo...
1081
1082
   * @delay: number of jiffies to wait before queueing
   *
057647fc4   Alan Stern   [PATCH] workqueue...
1083
   * Returns 0 if @work was already on a queue, non-zero otherwise.
0fcb78c22   Rolf Eike Beer   [PATCH] Add DocBo...
1084
   */
7a6bc1cdd   Venkatesh Pallipadi   [CPUFREQ] Add que...
1085
  int queue_delayed_work_on(int cpu, struct workqueue_struct *wq,
52bad64d9   David Howells   WorkStruct: Separ...
1086
  			struct delayed_work *dwork, unsigned long delay)
7a6bc1cdd   Venkatesh Pallipadi   [CPUFREQ] Add que...
1087
1088
  {
  	int ret = 0;
52bad64d9   David Howells   WorkStruct: Separ...
1089
1090
  	struct timer_list *timer = &dwork->timer;
  	struct work_struct *work = &dwork->work;
7a6bc1cdd   Venkatesh Pallipadi   [CPUFREQ] Add que...
1091

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

7a6bc1cdd   Venkatesh Pallipadi   [CPUFREQ] Add que...
1095
1096
  		BUG_ON(timer_pending(timer));
  		BUG_ON(!list_empty(&work->entry));
8a3e77cc2   Andrew Liu   workqueue: remove...
1097
  		timer_stats_timer_set_start_info(&dwork->timer);
7a22ad757   Tejun Heo   workqueue: carry ...
1098
1099
1100
1101
1102
  		/*
  		 * 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...
1103
1104
1105
1106
1107
1108
1109
1110
1111
  		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 ...
1112
  		set_work_cwq(work, get_cwq(lcpu, wq), 0);
c7fc77f78   Tejun Heo   workqueue: remove...
1113

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

c8e55f360   Tejun Heo   workqueue: implem...
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
  /**
   * 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
1139
  {
c8e55f360   Tejun Heo   workqueue: implem...
1140
1141
1142
1143
1144
  	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...
1145
1146
  	/* can't use worker_set_flags(), also called from start_worker() */
  	worker->flags |= WORKER_IDLE;
c8e55f360   Tejun Heo   workqueue: implem...
1147
  	gcwq->nr_idle++;
e22bee782   Tejun Heo   workqueue: implem...
1148
  	worker->last_active = jiffies;
c8e55f360   Tejun Heo   workqueue: implem...
1149
1150
1151
  
  	/* idle_list is LIFO */
  	list_add(&worker->entry, &gcwq->idle_list);
db7bccf45   Tejun Heo   workqueue: reimpl...
1152

e22bee782   Tejun Heo   workqueue: implem...
1153
1154
1155
1156
1157
  	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...
1158
  		wake_up_all(&gcwq->trustee_wait);
cb4447669   Tejun Heo   workqueue: use wo...
1159
1160
1161
1162
  
  	/* 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...
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
  }
  
  /**
   * 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...
1179
  	worker_clr_flags(worker, WORKER_IDLE);
c8e55f360   Tejun Heo   workqueue: implem...
1180
1181
1182
  	gcwq->nr_idle--;
  	list_del_init(&worker->entry);
  }
e22bee782   Tejun Heo   workqueue: implem...
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
  /**
   * 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...
1214
  __acquires(&gcwq->lock)
e22bee782   Tejun Heo   workqueue: implem...
1215
1216
1217
1218
1219
  {
  	struct global_cwq *gcwq = worker->gcwq;
  	struct task_struct *task = worker->task;
  
  	while (true) {
4e6045f13   Johannes Berg   workqueue: debug ...
1220
  		/*
e22bee782   Tejun Heo   workqueue: implem...
1221
1222
1223
1224
  		 * 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 ...
1225
  		 */
f34217977   Tejun Heo   workqueue: implem...
1226
1227
  		if (!(gcwq->flags & GCWQ_DISASSOCIATED))
  			set_cpus_allowed_ptr(task, get_cpu_mask(gcwq->cpu));
e22bee782   Tejun Heo   workqueue: implem...
1228
1229
1230
1231
1232
1233
1234
1235
1236
  
  		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);
5035b20fa   Tejun Heo   workqueue: fix de...
1237
1238
1239
1240
1241
1242
  		/*
  		 * We've raced with CPU hot[un]plug.  Give it a breather
  		 * and retry migration.  cond_resched() is required here;
  		 * otherwise, we might deadlock against cpu_stop trying to
  		 * bring down the CPU on non-preemptive kernel.
  		 */
e22bee782   Tejun Heo   workqueue: implem...
1243
  		cpu_relax();
5035b20fa   Tejun Heo   workqueue: fix de...
1244
  		cond_resched();
e22bee782   Tejun Heo   workqueue: implem...
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
  	}
  }
  
  /*
   * 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...
1264
1265
1266
1267
1268
  static struct worker *alloc_worker(void)
  {
  	struct worker *worker;
  
  	worker = kzalloc(sizeof(*worker), GFP_KERNEL);
c8e55f360   Tejun Heo   workqueue: implem...
1269
1270
  	if (worker) {
  		INIT_LIST_HEAD(&worker->entry);
affee4b29   Tejun Heo   workqueue: reimpl...
1271
  		INIT_LIST_HEAD(&worker->scheduled);
e22bee782   Tejun Heo   workqueue: implem...
1272
1273
1274
  		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...
1275
  	}
c34056a3f   Tejun Heo   workqueue: introd...
1276
1277
1278
1279
1280
  	return worker;
  }
  
  /**
   * create_worker - create a new workqueue worker
7e11629d0   Tejun Heo   workqueue: use sh...
1281
   * @gcwq: gcwq the new worker will belong to
c34056a3f   Tejun Heo   workqueue: introd...
1282
1283
   * @bind: whether to set affinity to @cpu or not
   *
7e11629d0   Tejun Heo   workqueue: use sh...
1284
   * Create a new worker which is bound to @gcwq.  The returned worker
c34056a3f   Tejun Heo   workqueue: introd...
1285
1286
1287
1288
1289
1290
1291
1292
1293
   * 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...
1294
  static struct worker *create_worker(struct global_cwq *gcwq, bool bind)
c34056a3f   Tejun Heo   workqueue: introd...
1295
  {
f34217977   Tejun Heo   workqueue: implem...
1296
  	bool on_unbound_cpu = gcwq->cpu == WORK_CPU_UNBOUND;
c34056a3f   Tejun Heo   workqueue: introd...
1297
  	struct worker *worker = NULL;
f34217977   Tejun Heo   workqueue: implem...
1298
  	int id = -1;
c34056a3f   Tejun Heo   workqueue: introd...
1299

8b03ae3cd   Tejun Heo   workqueue: introd...
1300
1301
1302
1303
  	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...
1304
  			goto fail;
8b03ae3cd   Tejun Heo   workqueue: introd...
1305
  		spin_lock_irq(&gcwq->lock);
c34056a3f   Tejun Heo   workqueue: introd...
1306
  	}
8b03ae3cd   Tejun Heo   workqueue: introd...
1307
  	spin_unlock_irq(&gcwq->lock);
c34056a3f   Tejun Heo   workqueue: introd...
1308
1309
1310
1311
  
  	worker = alloc_worker();
  	if (!worker)
  		goto fail;
8b03ae3cd   Tejun Heo   workqueue: introd...
1312
  	worker->gcwq = gcwq;
c34056a3f   Tejun Heo   workqueue: introd...
1313
  	worker->id = id;
f34217977   Tejun Heo   workqueue: implem...
1314
  	if (!on_unbound_cpu)
94dcf29a1   Eric Dumazet   kthread: use kthr...
1315
1316
1317
1318
  		worker->task = kthread_create_on_node(worker_thread,
  						      worker,
  						      cpu_to_node(gcwq->cpu),
  						      "kworker/%u:%d", gcwq->cpu, id);
f34217977   Tejun Heo   workqueue: implem...
1319
1320
1321
  	else
  		worker->task = kthread_create(worker_thread, worker,
  					      "kworker/u:%d", id);
c34056a3f   Tejun Heo   workqueue: introd...
1322
1323
  	if (IS_ERR(worker->task))
  		goto fail;
db7bccf45   Tejun Heo   workqueue: reimpl...
1324
1325
1326
1327
1328
  	/*
  	 * 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...
1329
  	if (bind && !on_unbound_cpu)
8b03ae3cd   Tejun Heo   workqueue: introd...
1330
  		kthread_bind(worker->task, gcwq->cpu);
f34217977   Tejun Heo   workqueue: implem...
1331
  	else {
db7bccf45   Tejun Heo   workqueue: reimpl...
1332
  		worker->task->flags |= PF_THREAD_BOUND;
f34217977   Tejun Heo   workqueue: implem...
1333
1334
1335
  		if (on_unbound_cpu)
  			worker->flags |= WORKER_UNBOUND;
  	}
c34056a3f   Tejun Heo   workqueue: introd...
1336
1337
1338
1339
  
  	return worker;
  fail:
  	if (id >= 0) {
8b03ae3cd   Tejun Heo   workqueue: introd...
1340
1341
1342
  		spin_lock_irq(&gcwq->lock);
  		ida_remove(&gcwq->worker_ida, id);
  		spin_unlock_irq(&gcwq->lock);
c34056a3f   Tejun Heo   workqueue: introd...
1343
1344
1345
1346
1347
1348
1349
1350
1351
  	}
  	kfree(worker);
  	return NULL;
  }
  
  /**
   * start_worker - start a newly created worker
   * @worker: worker to start
   *
c8e55f360   Tejun Heo   workqueue: implem...
1352
   * Make the gcwq aware of @worker and start it.
c34056a3f   Tejun Heo   workqueue: introd...
1353
1354
   *
   * CONTEXT:
8b03ae3cd   Tejun Heo   workqueue: introd...
1355
   * spin_lock_irq(gcwq->lock).
c34056a3f   Tejun Heo   workqueue: introd...
1356
1357
1358
   */
  static void start_worker(struct worker *worker)
  {
cb4447669   Tejun Heo   workqueue: use wo...
1359
  	worker->flags |= WORKER_STARTED;
c8e55f360   Tejun Heo   workqueue: implem...
1360
1361
  	worker->gcwq->nr_workers++;
  	worker_enter_idle(worker);
c34056a3f   Tejun Heo   workqueue: introd...
1362
1363
1364
1365
1366
1367
1368
  	wake_up_process(worker->task);
  }
  
  /**
   * destroy_worker - destroy a workqueue worker
   * @worker: worker to be destroyed
   *
c8e55f360   Tejun Heo   workqueue: implem...
1369
1370
1371
1372
   * Destroy @worker and adjust @gcwq stats accordingly.
   *
   * CONTEXT:
   * spin_lock_irq(gcwq->lock) which is released and regrabbed.
c34056a3f   Tejun Heo   workqueue: introd...
1373
1374
1375
   */
  static void destroy_worker(struct worker *worker)
  {
8b03ae3cd   Tejun Heo   workqueue: introd...
1376
  	struct global_cwq *gcwq = worker->gcwq;
c34056a3f   Tejun Heo   workqueue: introd...
1377
1378
1379
1380
  	int id = worker->id;
  
  	/* sanity check frenzy */
  	BUG_ON(worker->current_work);
affee4b29   Tejun Heo   workqueue: reimpl...
1381
  	BUG_ON(!list_empty(&worker->scheduled));
c34056a3f   Tejun Heo   workqueue: introd...
1382

c8e55f360   Tejun Heo   workqueue: implem...
1383
1384
1385
1386
1387
1388
  	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...
1389
  	worker->flags |= WORKER_DIE;
c8e55f360   Tejun Heo   workqueue: implem...
1390
1391
  
  	spin_unlock_irq(&gcwq->lock);
c34056a3f   Tejun Heo   workqueue: introd...
1392
1393
  	kthread_stop(worker->task);
  	kfree(worker);
8b03ae3cd   Tejun Heo   workqueue: introd...
1394
1395
  	spin_lock_irq(&gcwq->lock);
  	ida_remove(&gcwq->worker_ida, id);
c34056a3f   Tejun Heo   workqueue: introd...
1396
  }
e22bee782   Tejun Heo   workqueue: implem...
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
  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...
1417
  		}
e22bee782   Tejun Heo   workqueue: implem...
1418
1419
1420
1421
  	}
  
  	spin_unlock_irq(&gcwq->lock);
  }
d5abe6691   Peter Zijlstra   [PATCH] debug: wo...
1422

e22bee782   Tejun Heo   workqueue: implem...
1423
1424
1425
1426
  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...
1427
  	unsigned int cpu;
e22bee782   Tejun Heo   workqueue: implem...
1428
1429
1430
1431
1432
  
  	if (!(wq->flags & WQ_RESCUER))
  		return false;
  
  	/* mayday mayday mayday */
f34217977   Tejun Heo   workqueue: implem...
1433
1434
1435
1436
  	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...
1437
  	if (!mayday_test_and_set_cpu(cpu, wq->mayday_mask))
e22bee782   Tejun Heo   workqueue: implem...
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
  		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
1458
  	}
e22bee782   Tejun Heo   workqueue: implem...
1459
1460
1461
1462
  
  	spin_unlock_irq(&gcwq->lock);
  
  	mod_timer(&gcwq->mayday_timer, jiffies + MAYDAY_INTERVAL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1463
  }
e22bee782   Tejun Heo   workqueue: implem...
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
  /**
   * 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...
1487
1488
  __releases(&gcwq->lock)
  __acquires(&gcwq->lock)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1489
  {
e22bee782   Tejun Heo   workqueue: implem...
1490
1491
1492
  	if (!need_to_create_worker(gcwq))
  		return false;
  restart:
9f9c23644   Tejun Heo   workqueue: fix lo...
1493
  	spin_unlock_irq(&gcwq->lock);
e22bee782   Tejun Heo   workqueue: implem...
1494
1495
1496
1497
1498
  	/* 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...
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
  		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
1510

e22bee782   Tejun Heo   workqueue: implem...
1511
1512
  		__set_current_state(TASK_INTERRUPTIBLE);
  		schedule_timeout(CREATE_COOLDOWN);
9f9c23644   Tejun Heo   workqueue: fix lo...
1513

e22bee782   Tejun Heo   workqueue: implem...
1514
1515
1516
  		if (!need_to_create_worker(gcwq))
  			break;
  	}
e22bee782   Tejun Heo   workqueue: implem...
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
  	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
1542

e22bee782   Tejun Heo   workqueue: implem...
1543
1544
1545
  	while (too_many_workers(gcwq)) {
  		struct worker *worker;
  		unsigned long expires;
3af24433e   Oleg Nesterov   workqueue: don't ...
1546

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

e22bee782   Tejun Heo   workqueue: implem...
1550
1551
  		if (time_before(jiffies, expires)) {
  			mod_timer(&gcwq->idle_timer, expires);
3af24433e   Oleg Nesterov   workqueue: don't ...
1552
  			break;
e22bee782   Tejun Heo   workqueue: implem...
1553
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1554

e22bee782   Tejun Heo   workqueue: implem...
1555
1556
  		destroy_worker(worker);
  		ret = true;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1557
  	}
3af24433e   Oleg Nesterov   workqueue: don't ...
1558

e22bee782   Tejun Heo   workqueue: implem...
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
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
  	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...
1611
  /**
affee4b29   Tejun Heo   workqueue: reimpl...
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
   * 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...
1626
   * spin_lock_irq(gcwq->lock).
affee4b29   Tejun Heo   workqueue: reimpl...
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
   */
  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...
1651
1652
1653
1654
  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...
1655
  	struct list_head *pos = gcwq_determine_ins_pos(cwq->gcwq, cwq);
1e19ffc63   Tejun Heo   workqueue: implem...
1656

cdadf0097   Tejun Heo   workqueue: add qu...
1657
  	trace_workqueue_activate_work(work);
649027d73   Tejun Heo   workqueue: implem...
1658
  	move_linked_works(work, pos, NULL);
8a2e8e5de   Tejun Heo   workqueue: fix cw...
1659
  	__clear_bit(WORK_STRUCT_DELAYED_BIT, work_data_bits(work));
1e19ffc63   Tejun Heo   workqueue: implem...
1660
1661
  	cwq->nr_active++;
  }
affee4b29   Tejun Heo   workqueue: reimpl...
1662
  /**
73f53c4aa   Tejun Heo   workqueue: reimpl...
1663
1664
1665
   * 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...
1666
   * @delayed: for a delayed work
73f53c4aa   Tejun Heo   workqueue: reimpl...
1667
1668
1669
1670
1671
   *
   * 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...
1672
   * spin_lock_irq(gcwq->lock).
73f53c4aa   Tejun Heo   workqueue: reimpl...
1673
   */
8a2e8e5de   Tejun Heo   workqueue: fix cw...
1674
1675
  static void cwq_dec_nr_in_flight(struct cpu_workqueue_struct *cwq, int color,
  				 bool delayed)
73f53c4aa   Tejun Heo   workqueue: reimpl...
1676
1677
1678
1679
1680
1681
  {
  	/* ignore uncolored works */
  	if (color == WORK_NO_COLOR)
  		return;
  
  	cwq->nr_in_flight[color]--;
1e19ffc63   Tejun Heo   workqueue: implem...
1682

8a2e8e5de   Tejun Heo   workqueue: fix cw...
1683
1684
1685
1686
1687
1688
1689
  	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...
1690
  	}
73f53c4aa   Tejun Heo   workqueue: reimpl...
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
  
  	/* 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...
1712
   * process_one_work - process single work
c34056a3f   Tejun Heo   workqueue: introd...
1713
   * @worker: self
a62428c0a   Tejun Heo   workqueue: separa...
1714
1715
1716
1717
1718
1719
1720
1721
1722
   * @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...
1723
   * spin_lock_irq(gcwq->lock) which is released and regrabbed.
a62428c0a   Tejun Heo   workqueue: separa...
1724
   */
c34056a3f   Tejun Heo   workqueue: introd...
1725
  static void process_one_work(struct worker *worker, struct work_struct *work)
06bd6ebff   Namhyung Kim   workqueue: annota...
1726
1727
  __releases(&gcwq->lock)
  __acquires(&gcwq->lock)
a62428c0a   Tejun Heo   workqueue: separa...
1728
  {
7e11629d0   Tejun Heo   workqueue: use sh...
1729
  	struct cpu_workqueue_struct *cwq = get_work_cwq(work);
8b03ae3cd   Tejun Heo   workqueue: introd...
1730
  	struct global_cwq *gcwq = cwq->gcwq;
c8e55f360   Tejun Heo   workqueue: implem...
1731
  	struct hlist_head *bwh = busy_worker_head(gcwq, work);
fb0e7beb5   Tejun Heo   workqueue: implem...
1732
  	bool cpu_intensive = cwq->wq->flags & WQ_CPU_INTENSIVE;
a62428c0a   Tejun Heo   workqueue: separa...
1733
  	work_func_t f = work->func;
73f53c4aa   Tejun Heo   workqueue: reimpl...
1734
  	int work_color;
7e11629d0   Tejun Heo   workqueue: use sh...
1735
  	struct worker *collision;
a62428c0a   Tejun Heo   workqueue: separa...
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
  #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...
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
  	/*
  	 * 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...
1757
  	/* claim and process */
a62428c0a   Tejun Heo   workqueue: separa...
1758
  	debug_work_deactivate(work);
c8e55f360   Tejun Heo   workqueue: implem...
1759
  	hlist_add_head(&worker->hentry, bwh);
c34056a3f   Tejun Heo   workqueue: introd...
1760
  	worker->current_work = work;
8cca0eea3   Tejun Heo   workqueue: add fi...
1761
  	worker->current_cwq = cwq;
73f53c4aa   Tejun Heo   workqueue: reimpl...
1762
  	work_color = get_work_color(work);
7a22ad757   Tejun Heo   workqueue: carry ...
1763

7a22ad757   Tejun Heo   workqueue: carry ...
1764
1765
  	/* record the current cpu number in the work data and dequeue */
  	set_work_cpu(work, gcwq->cpu);
a62428c0a   Tejun Heo   workqueue: separa...
1766
  	list_del_init(&work->entry);
649027d73   Tejun Heo   workqueue: implem...
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
  	/*
  	 * 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...
1781
1782
1783
1784
1785
1786
  	/*
  	 * 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...
1787
  	spin_unlock_irq(&gcwq->lock);
a62428c0a   Tejun Heo   workqueue: separa...
1788

a62428c0a   Tejun Heo   workqueue: separa...
1789
  	work_clear_pending(work);
e159489ba   Tejun Heo   workqueue: relax ...
1790
  	lock_map_acquire_read(&cwq->wq->lockdep_map);
a62428c0a   Tejun Heo   workqueue: separa...
1791
  	lock_map_acquire(&lockdep_map);
e36c886a0   Arjan van de Ven   workqueue: Add ba...
1792
  	trace_workqueue_execute_start(work);
a62428c0a   Tejun Heo   workqueue: separa...
1793
  	f(work);
e36c886a0   Arjan van de Ven   workqueue: Add ba...
1794
1795
1796
1797
1798
  	/*
  	 * 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...
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
  	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...
1813
  	spin_lock_irq(&gcwq->lock);
a62428c0a   Tejun Heo   workqueue: separa...
1814

fb0e7beb5   Tejun Heo   workqueue: implem...
1815
1816
1817
  	/* clear cpu intensive status */
  	if (unlikely(cpu_intensive))
  		worker_clr_flags(worker, WORKER_CPU_INTENSIVE);
a62428c0a   Tejun Heo   workqueue: separa...
1818
  	/* we're done with it, release */
c8e55f360   Tejun Heo   workqueue: implem...
1819
  	hlist_del_init(&worker->hentry);
c34056a3f   Tejun Heo   workqueue: introd...
1820
  	worker->current_work = NULL;
8cca0eea3   Tejun Heo   workqueue: add fi...
1821
  	worker->current_cwq = NULL;
8a2e8e5de   Tejun Heo   workqueue: fix cw...
1822
  	cwq_dec_nr_in_flight(cwq, work_color, false);
a62428c0a   Tejun Heo   workqueue: separa...
1823
  }
affee4b29   Tejun Heo   workqueue: reimpl...
1824
1825
1826
1827
1828
1829
1830
1831
1832
  /**
   * 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...
1833
   * spin_lock_irq(gcwq->lock) which may be released and regrabbed
affee4b29   Tejun Heo   workqueue: reimpl...
1834
1835
1836
   * multiple times.
   */
  static void process_scheduled_works(struct worker *worker)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1837
  {
affee4b29   Tejun Heo   workqueue: reimpl...
1838
1839
  	while (!list_empty(&worker->scheduled)) {
  		struct work_struct *work = list_first_entry(&worker->scheduled,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1840
  						struct work_struct, entry);
c34056a3f   Tejun Heo   workqueue: introd...
1841
  		process_one_work(worker, work);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1842
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1843
  }
4690c4ab5   Tejun Heo   workqueue: misc/c...
1844
1845
  /**
   * worker_thread - the worker thread function
c34056a3f   Tejun Heo   workqueue: introd...
1846
   * @__worker: self
4690c4ab5   Tejun Heo   workqueue: misc/c...
1847
   *
e22bee782   Tejun Heo   workqueue: implem...
1848
1849
1850
1851
1852
   * 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...
1853
   */
c34056a3f   Tejun Heo   workqueue: introd...
1854
  static int worker_thread(void *__worker)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1855
  {
c34056a3f   Tejun Heo   workqueue: introd...
1856
  	struct worker *worker = __worker;
8b03ae3cd   Tejun Heo   workqueue: introd...
1857
  	struct global_cwq *gcwq = worker->gcwq;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1858

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

c8e55f360   Tejun Heo   workqueue: implem...
1864
1865
1866
  	/* 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...
1867
  		worker->task->flags &= ~PF_WQ_WORKER;
c8e55f360   Tejun Heo   workqueue: implem...
1868
1869
  		return 0;
  	}
affee4b29   Tejun Heo   workqueue: reimpl...
1870

c8e55f360   Tejun Heo   workqueue: implem...
1871
  	worker_leave_idle(worker);
db7bccf45   Tejun Heo   workqueue: reimpl...
1872
  recheck:
e22bee782   Tejun Heo   workqueue: implem...
1873
1874
1875
1876
1877
1878
1879
  	/* 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...
1880
1881
1882
1883
1884
1885
  	/*
  	 * ->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...
1886
1887
1888
1889
1890
1891
1892
1893
  	/*
  	 * 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...
1894
  		struct work_struct *work =
7e11629d0   Tejun Heo   workqueue: use sh...
1895
  			list_first_entry(&gcwq->worklist,
c8e55f360   Tejun Heo   workqueue: implem...
1896
1897
1898
1899
1900
1901
  					 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...
1902
  				process_scheduled_works(worker);
c8e55f360   Tejun Heo   workqueue: implem...
1903
1904
1905
  		} else {
  			move_linked_works(work, &worker->scheduled, NULL);
  			process_scheduled_works(worker);
affee4b29   Tejun Heo   workqueue: reimpl...
1906
  		}
e22bee782   Tejun Heo   workqueue: implem...
1907
1908
1909
  	} while (keep_working(gcwq));
  
  	worker_set_flags(worker, WORKER_PREP, false);
d313dd85a   Tejun Heo   workqueue: fix wo...
1910
  sleep:
e22bee782   Tejun Heo   workqueue: implem...
1911
1912
  	if (unlikely(need_to_manage_workers(gcwq)) && manage_workers(worker))
  		goto recheck;
d313dd85a   Tejun Heo   workqueue: fix wo...
1913

c8e55f360   Tejun Heo   workqueue: implem...
1914
  	/*
e22bee782   Tejun Heo   workqueue: implem...
1915
1916
1917
1918
1919
  	 * 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...
1920
1921
1922
1923
1924
1925
  	 */
  	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
1926
  }
e22bee782   Tejun Heo   workqueue: implem...
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
  /**
   * 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...
1951
  	bool is_unbound = wq->flags & WQ_UNBOUND;
e22bee782   Tejun Heo   workqueue: implem...
1952
1953
1954
1955
1956
1957
1958
1959
  	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...
1960
1961
1962
1963
  	/*
  	 * 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...
1964
  	for_each_mayday_cpu(cpu, wq->mayday_mask) {
f34217977   Tejun Heo   workqueue: implem...
1965
1966
  		unsigned int tcpu = is_unbound ? WORK_CPU_UNBOUND : cpu;
  		struct cpu_workqueue_struct *cwq = get_cwq(tcpu, wq);
e22bee782   Tejun Heo   workqueue: implem...
1967
1968
1969
1970
  		struct global_cwq *gcwq = cwq->gcwq;
  		struct work_struct *work, *n;
  
  		__set_current_state(TASK_RUNNING);
f2e005aaf   Tejun Heo   workqueue: fix ma...
1971
  		mayday_clear_cpu(cpu, wq->mayday_mask);
e22bee782   Tejun Heo   workqueue: implem...
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
  
  		/* 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);
7576958a9   Tejun Heo   workqueue: wake u...
1987
1988
1989
1990
1991
1992
1993
1994
  
  		/*
  		 * Leave this gcwq.  If keep_working() is %true, notify a
  		 * regular worker; otherwise, we end up with 0 concurrency
  		 * and stalling the execution.
  		 */
  		if (keep_working(gcwq))
  			wake_up_worker(gcwq);
e22bee782   Tejun Heo   workqueue: implem...
1995
1996
1997
1998
1999
  		spin_unlock_irq(&gcwq->lock);
  	}
  
  	schedule();
  	goto repeat;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2000
  }
fc2e4d704   Oleg Nesterov   reimplement flush...
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
  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...
2011
2012
2013
2014
  /**
   * insert_wq_barrier - insert a barrier work
   * @cwq: cwq to insert barrier into
   * @barr: wq_barrier to insert
affee4b29   Tejun Heo   workqueue: reimpl...
2015
2016
   * @target: target work to attach @barr to
   * @worker: worker currently executing @target, NULL if @target is not executing
4690c4ab5   Tejun Heo   workqueue: misc/c...
2017
   *
affee4b29   Tejun Heo   workqueue: reimpl...
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
   * @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...
2031
2032
   *
   * CONTEXT:
8b03ae3cd   Tejun Heo   workqueue: introd...
2033
   * spin_lock_irq(gcwq->lock).
4690c4ab5   Tejun Heo   workqueue: misc/c...
2034
   */
83c22520c   Oleg Nesterov   flush_cpu_workque...
2035
  static void insert_wq_barrier(struct cpu_workqueue_struct *cwq,
affee4b29   Tejun Heo   workqueue: reimpl...
2036
2037
  			      struct wq_barrier *barr,
  			      struct work_struct *target, struct worker *worker)
fc2e4d704   Oleg Nesterov   reimplement flush...
2038
  {
affee4b29   Tejun Heo   workqueue: reimpl...
2039
2040
  	struct list_head *head;
  	unsigned int linked = 0;
dc186ad74   Thomas Gleixner   workqueue: Add de...
2041
  	/*
8b03ae3cd   Tejun Heo   workqueue: introd...
2042
  	 * debugobject calls are safe here even with gcwq->lock locked
dc186ad74   Thomas Gleixner   workqueue: Add de...
2043
2044
2045
2046
  	 * 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_...
2047
  	INIT_WORK_ONSTACK(&barr->work, wq_barrier_func);
22df02bb3   Tejun Heo   workqueue: define...
2048
  	__set_bit(WORK_STRUCT_PENDING_BIT, work_data_bits(&barr->work));
fc2e4d704   Oleg Nesterov   reimplement flush...
2049
  	init_completion(&barr->done);
83c22520c   Oleg Nesterov   flush_cpu_workque...
2050

affee4b29   Tejun Heo   workqueue: reimpl...
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
  	/*
  	 * 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...
2065
  	debug_work_activate(&barr->work);
affee4b29   Tejun Heo   workqueue: reimpl...
2066
2067
  	insert_work(cwq, &barr->work, head,
  		    work_color_to_flags(WORK_NO_COLOR) | linked);
fc2e4d704   Oleg Nesterov   reimplement flush...
2068
  }
73f53c4aa   Tejun Heo   workqueue: reimpl...
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
  /**
   * 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
2102
  {
73f53c4aa   Tejun Heo   workqueue: reimpl...
2103
2104
  	bool wait = false;
  	unsigned int cpu;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2105

73f53c4aa   Tejun Heo   workqueue: reimpl...
2106
2107
2108
  	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
2109
  	}
2355b70fd   Lai Jiangshan   workqueue: avoid ...
2110

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

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

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

73f53c4aa   Tejun Heo   workqueue: reimpl...
2120
2121
2122
2123
2124
2125
  			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
2126

73f53c4aa   Tejun Heo   workqueue: reimpl...
2127
2128
2129
2130
  		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
2131

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

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

73f53c4aa   Tejun Heo   workqueue: reimpl...
2138
  	return wait;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2139
  }
0fcb78c22   Rolf Eike Beer   [PATCH] Add DocBo...
2140
  /**
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2141
   * flush_workqueue - ensure that any scheduled work has run to completion.
0fcb78c22   Rolf Eike Beer   [PATCH] Add DocBo...
2142
   * @wq: workqueue to flush
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2143
2144
2145
2146
   *
   * Forces execution of the workqueue and blocks until its completion.
   * This is typically used in driver shutdown handlers.
   *
fc2e4d704   Oleg Nesterov   reimplement flush...
2147
2148
   * 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
2149
   */
7ad5b3a50   Harvey Harrison   kernel: remove fa...
2150
  void flush_workqueue(struct workqueue_struct *wq)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2151
  {
73f53c4aa   Tejun Heo   workqueue: reimpl...
2152
2153
2154
2155
2156
2157
  	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
2158

3295f0ef9   Ingo Molnar   lockdep: rename m...
2159
2160
  	lock_map_acquire(&wq->lockdep_map);
  	lock_map_release(&wq->lockdep_map);
73f53c4aa   Tejun Heo   workqueue: reimpl...
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
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
  
  	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...
2221
2222
2223
  	/* we might have raced, check again with mutex held */
  	if (wq->first_flusher != &this_flusher)
  		goto out_unlock;
73f53c4aa   Tejun Heo   workqueue: reimpl...
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
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
  	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
2291
  }
ae90dd5db   Dave Jones   Move workqueue ex...
2292
  EXPORT_SYMBOL_GPL(flush_workqueue);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2293

9c5a2ba70   Tejun Heo   workqueue: separa...
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
  /**
   * drain_workqueue - drain a workqueue
   * @wq: workqueue to drain
   *
   * Wait until the workqueue becomes empty.  While draining is in progress,
   * 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.
   */
  void drain_workqueue(struct workqueue_struct *wq)
  {
  	unsigned int flush_cnt = 0;
  	unsigned int cpu;
  
  	/*
  	 * __queue_work() needs to test whether there are drainers, is much
  	 * hotter than drain_workqueue() and already looks at @wq->flags.
  	 * Use WQ_DRAINING so that queue doesn't have to check nr_drainers.
  	 */
  	spin_lock(&workqueue_lock);
  	if (!wq->nr_drainers++)
  		wq->flags |= WQ_DRAINING;
  	spin_unlock(&workqueue_lock);
  reflush:
  	flush_workqueue(wq);
  
  	for_each_cwq_cpu(cpu, wq) {
  		struct cpu_workqueue_struct *cwq = get_cwq(cpu, wq);
fa2563e41   Thomas Tuttle   workqueue: lock c...
2324
  		bool drained;
9c5a2ba70   Tejun Heo   workqueue: separa...
2325

fa2563e41   Thomas Tuttle   workqueue: lock c...
2326
2327
2328
2329
2330
  		spin_lock_irq(&cwq->gcwq->lock);
  		drained = !cwq->nr_active && list_empty(&cwq->delayed_works);
  		spin_unlock_irq(&cwq->gcwq->lock);
  
  		if (drained)
9c5a2ba70   Tejun Heo   workqueue: separa...
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
  			continue;
  
  		if (++flush_cnt == 10 ||
  		    (flush_cnt % 100 == 0 && flush_cnt <= 1000))
  			pr_warning("workqueue %s: flush on destruction isn't complete after %u tries
  ",
  				   wq->name, flush_cnt);
  		goto reflush;
  	}
  
  	spin_lock(&workqueue_lock);
  	if (!--wq->nr_drainers)
  		wq->flags &= ~WQ_DRAINING;
  	spin_unlock(&workqueue_lock);
  }
  EXPORT_SYMBOL_GPL(drain_workqueue);
baf59022c   Tejun Heo   workqueue: factor...
2347
2348
  static bool start_flush_work(struct work_struct *work, struct wq_barrier *barr,
  			     bool wait_executing)
db7008972   Oleg Nesterov   workqueues: imple...
2349
  {
affee4b29   Tejun Heo   workqueue: reimpl...
2350
  	struct worker *worker = NULL;
8b03ae3cd   Tejun Heo   workqueue: introd...
2351
  	struct global_cwq *gcwq;
db7008972   Oleg Nesterov   workqueues: imple...
2352
  	struct cpu_workqueue_struct *cwq;
db7008972   Oleg Nesterov   workqueues: imple...
2353
2354
  
  	might_sleep();
7a22ad757   Tejun Heo   workqueue: carry ...
2355
2356
  	gcwq = get_work_gcwq(work);
  	if (!gcwq)
baf59022c   Tejun Heo   workqueue: factor...
2357
  		return false;
db7008972   Oleg Nesterov   workqueues: imple...
2358

8b03ae3cd   Tejun Heo   workqueue: introd...
2359
  	spin_lock_irq(&gcwq->lock);
db7008972   Oleg Nesterov   workqueues: imple...
2360
2361
2362
  	if (!list_empty(&work->entry)) {
  		/*
  		 * See the comment near try_to_grab_pending()->smp_rmb().
7a22ad757   Tejun Heo   workqueue: carry ...
2363
2364
  		 * If it was re-queued to a different gcwq under us, we
  		 * are not going to wait.
db7008972   Oleg Nesterov   workqueues: imple...
2365
2366
  		 */
  		smp_rmb();
7a22ad757   Tejun Heo   workqueue: carry ...
2367
2368
  		cwq = get_work_cwq(work);
  		if (unlikely(!cwq || gcwq != cwq->gcwq))
4690c4ab5   Tejun Heo   workqueue: misc/c...
2369
  			goto already_gone;
baf59022c   Tejun Heo   workqueue: factor...
2370
  	} else if (wait_executing) {
7a22ad757   Tejun Heo   workqueue: carry ...
2371
  		worker = find_worker_executing_work(gcwq, work);
affee4b29   Tejun Heo   workqueue: reimpl...
2372
  		if (!worker)
4690c4ab5   Tejun Heo   workqueue: misc/c...
2373
  			goto already_gone;
7a22ad757   Tejun Heo   workqueue: carry ...
2374
  		cwq = worker->current_cwq;
baf59022c   Tejun Heo   workqueue: factor...
2375
2376
  	} else
  		goto already_gone;
db7008972   Oleg Nesterov   workqueues: imple...
2377

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

e159489ba   Tejun Heo   workqueue: relax ...
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
  	/*
  	 * 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 ...
2391
  	lock_map_release(&cwq->wq->lockdep_map);
e159489ba   Tejun Heo   workqueue: relax ...
2392

401a8d048   Tejun Heo   workqueue: cleanu...
2393
  	return true;
4690c4ab5   Tejun Heo   workqueue: misc/c...
2394
  already_gone:
8b03ae3cd   Tejun Heo   workqueue: introd...
2395
  	spin_unlock_irq(&gcwq->lock);
401a8d048   Tejun Heo   workqueue: cleanu...
2396
  	return false;
db7008972   Oleg Nesterov   workqueues: imple...
2397
  }
baf59022c   Tejun Heo   workqueue: factor...
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
  
  /**
   * 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...
2428
  EXPORT_SYMBOL_GPL(flush_work);
401a8d048   Tejun Heo   workqueue: cleanu...
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
  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...
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
  /**
   * 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...
2498
  /*
1f1f642e2   Oleg Nesterov   make cancel_xxx_w...
2499
   * Upon a successful return (>= 0), the caller "owns" WORK_STRUCT_PENDING bit,
6e84d644b   Oleg Nesterov   make cancel_rearm...
2500
2501
2502
2503
   * 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...
2504
  	struct global_cwq *gcwq;
1f1f642e2   Oleg Nesterov   make cancel_xxx_w...
2505
  	int ret = -1;
6e84d644b   Oleg Nesterov   make cancel_rearm...
2506

22df02bb3   Tejun Heo   workqueue: define...
2507
  	if (!test_and_set_bit(WORK_STRUCT_PENDING_BIT, work_data_bits(work)))
1f1f642e2   Oleg Nesterov   make cancel_xxx_w...
2508
  		return 0;
6e84d644b   Oleg Nesterov   make cancel_rearm...
2509
2510
2511
2512
2513
  
  	/*
  	 * 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 ...
2514
2515
  	gcwq = get_work_gcwq(work);
  	if (!gcwq)
6e84d644b   Oleg Nesterov   make cancel_rearm...
2516
  		return ret;
8b03ae3cd   Tejun Heo   workqueue: introd...
2517
  	spin_lock_irq(&gcwq->lock);
6e84d644b   Oleg Nesterov   make cancel_rearm...
2518
2519
  	if (!list_empty(&work->entry)) {
  		/*
7a22ad757   Tejun Heo   workqueue: carry ...
2520
  		 * This work is queued, but perhaps we locked the wrong gcwq.
6e84d644b   Oleg Nesterov   make cancel_rearm...
2521
2522
2523
2524
  		 * In that case we must see the new value after rmb(), see
  		 * insert_work()->wmb().
  		 */
  		smp_rmb();
7a22ad757   Tejun Heo   workqueue: carry ...
2525
  		if (gcwq == get_work_gcwq(work)) {
dc186ad74   Thomas Gleixner   workqueue: Add de...
2526
  			debug_work_deactivate(work);
6e84d644b   Oleg Nesterov   make cancel_rearm...
2527
  			list_del_init(&work->entry);
7a22ad757   Tejun Heo   workqueue: carry ...
2528
  			cwq_dec_nr_in_flight(get_work_cwq(work),
8a2e8e5de   Tejun Heo   workqueue: fix cw...
2529
2530
  				get_work_color(work),
  				*work_data_bits(work) & WORK_STRUCT_DELAYED);
6e84d644b   Oleg Nesterov   make cancel_rearm...
2531
2532
2533
  			ret = 1;
  		}
  	}
8b03ae3cd   Tejun Heo   workqueue: introd...
2534
  	spin_unlock_irq(&gcwq->lock);
6e84d644b   Oleg Nesterov   make cancel_rearm...
2535
2536
2537
  
  	return ret;
  }
401a8d048   Tejun Heo   workqueue: cleanu...
2538
  static bool __cancel_work_timer(struct work_struct *work,
1f1f642e2   Oleg Nesterov   make cancel_xxx_w...
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
  				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 ...
2549
  	clear_work_data(work);
1f1f642e2   Oleg Nesterov   make cancel_xxx_w...
2550
2551
  	return ret;
  }
6e84d644b   Oleg Nesterov   make cancel_rearm...
2552
  /**
401a8d048   Tejun Heo   workqueue: cleanu...
2553
2554
   * cancel_work_sync - cancel a work and wait for it to finish
   * @work: the work to cancel
6e84d644b   Oleg Nesterov   make cancel_rearm...
2555
   *
401a8d048   Tejun Heo   workqueue: cleanu...
2556
2557
2558
2559
   * 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...
2560
   *
401a8d048   Tejun Heo   workqueue: cleanu...
2561
2562
   * 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...
2563
   *
401a8d048   Tejun Heo   workqueue: cleanu...
2564
   * The caller must ensure that the workqueue on which @work was last
6e84d644b   Oleg Nesterov   make cancel_rearm...
2565
   * queued can't be destroyed before this function returns.
401a8d048   Tejun Heo   workqueue: cleanu...
2566
2567
2568
   *
   * RETURNS:
   * %true if @work was pending, %false otherwise.
6e84d644b   Oleg Nesterov   make cancel_rearm...
2569
   */
401a8d048   Tejun Heo   workqueue: cleanu...
2570
  bool cancel_work_sync(struct work_struct *work)
6e84d644b   Oleg Nesterov   make cancel_rearm...
2571
  {
1f1f642e2   Oleg Nesterov   make cancel_xxx_w...
2572
  	return __cancel_work_timer(work, NULL);
b89deed32   Oleg Nesterov   implement flush_w...
2573
  }
28e53bddf   Oleg Nesterov   unify flush_work/...
2574
  EXPORT_SYMBOL_GPL(cancel_work_sync);
b89deed32   Oleg Nesterov   implement flush_w...
2575

6e84d644b   Oleg Nesterov   make cancel_rearm...
2576
  /**
401a8d048   Tejun Heo   workqueue: cleanu...
2577
2578
   * 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...
2579
   *
401a8d048   Tejun Heo   workqueue: cleanu...
2580
2581
2582
   * 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...
2583
   *
401a8d048   Tejun Heo   workqueue: cleanu...
2584
2585
2586
   * RETURNS:
   * %true if flush_work() waited for the work to finish execution,
   * %false if it was already idle.
6e84d644b   Oleg Nesterov   make cancel_rearm...
2587
   */
401a8d048   Tejun Heo   workqueue: cleanu...
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
  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...
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
   * 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...
2619
2620
2621
2622
2623
2624
2625
2626
2627
   * 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...
2628
  {
1f1f642e2   Oleg Nesterov   make cancel_xxx_w...
2629
  	return __cancel_work_timer(&dwork->work, &dwork->timer);
6e84d644b   Oleg Nesterov   make cancel_rearm...
2630
  }
f5a421a45   Oleg Nesterov   rename cancel_rea...
2631
  EXPORT_SYMBOL(cancel_delayed_work_sync);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2632

0fcb78c22   Rolf Eike Beer   [PATCH] Add DocBo...
2633
2634
2635
2636
  /**
   * schedule_work - put work task in global workqueue
   * @work: job to be done
   *
5b0f437df   Bart Van Assche   workqueues: Impro...
2637
2638
2639
2640
2641
2642
   * 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...
2643
   */
7ad5b3a50   Harvey Harrison   kernel: remove fa...
2644
  int schedule_work(struct work_struct *work)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2645
  {
d320c0383   Tejun Heo   workqueue: s/__cr...
2646
  	return queue_work(system_wq, work);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2647
  }
ae90dd5db   Dave Jones   Move workqueue ex...
2648
  EXPORT_SYMBOL(schedule_work);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2649

c1a220e7a   Zhang Rui   pm: introduce new...
2650
2651
2652
2653
2654
2655
2656
2657
2658
  /*
   * 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...
2659
  	return queue_work_on(cpu, system_wq, work);
c1a220e7a   Zhang Rui   pm: introduce new...
2660
2661
  }
  EXPORT_SYMBOL(schedule_work_on);
0fcb78c22   Rolf Eike Beer   [PATCH] Add DocBo...
2662
2663
  /**
   * schedule_delayed_work - put work task in global workqueue after delay
52bad64d9   David Howells   WorkStruct: Separ...
2664
2665
   * @dwork: job to be done
   * @delay: number of jiffies to wait or 0 for immediate execution
0fcb78c22   Rolf Eike Beer   [PATCH] Add DocBo...
2666
2667
2668
2669
   *
   * After waiting for a given time this puts a job in the kernel-global
   * workqueue.
   */
7ad5b3a50   Harvey Harrison   kernel: remove fa...
2670
  int schedule_delayed_work(struct delayed_work *dwork,
82f67cd9f   Ingo Molnar   [PATCH] Add debug...
2671
  					unsigned long delay)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2672
  {
d320c0383   Tejun Heo   workqueue: s/__cr...
2673
  	return queue_delayed_work(system_wq, dwork, delay);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2674
  }
ae90dd5db   Dave Jones   Move workqueue ex...
2675
  EXPORT_SYMBOL(schedule_delayed_work);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2676

0fcb78c22   Rolf Eike Beer   [PATCH] Add DocBo...
2677
2678
2679
  /**
   * schedule_delayed_work_on - queue work in global workqueue on CPU after delay
   * @cpu: cpu to use
52bad64d9   David Howells   WorkStruct: Separ...
2680
   * @dwork: job to be done
0fcb78c22   Rolf Eike Beer   [PATCH] Add DocBo...
2681
2682
2683
2684
2685
   * @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
2686
  int schedule_delayed_work_on(int cpu,
52bad64d9   David Howells   WorkStruct: Separ...
2687
  			struct delayed_work *dwork, unsigned long delay)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2688
  {
d320c0383   Tejun Heo   workqueue: s/__cr...
2689
  	return queue_delayed_work_on(cpu, system_wq, dwork, delay);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2690
  }
ae90dd5db   Dave Jones   Move workqueue ex...
2691
  EXPORT_SYMBOL(schedule_delayed_work_on);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2692

b61367732   Andrew Morton   [PATCH] schedule_...
2693
  /**
31ddd871f   Tejun Heo   workqueue: Clarif...
2694
   * schedule_on_each_cpu - execute a function synchronously on each online CPU
b61367732   Andrew Morton   [PATCH] schedule_...
2695
   * @func: the function to call
b61367732   Andrew Morton   [PATCH] schedule_...
2696
   *
31ddd871f   Tejun Heo   workqueue: Clarif...
2697
2698
   * 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_...
2699
   * schedule_on_each_cpu() is very slow.
31ddd871f   Tejun Heo   workqueue: Clarif...
2700
2701
2702
   *
   * RETURNS:
   * 0 on success, -errno on failure.
b61367732   Andrew Morton   [PATCH] schedule_...
2703
   */
65f27f384   David Howells   WorkStruct: Pass ...
2704
  int schedule_on_each_cpu(work_func_t func)
15316ba81   Christoph Lameter   [PATCH] add sched...
2705
2706
  {
  	int cpu;
38f515680   Namhyung Kim   workqueue: add mi...
2707
  	struct work_struct __percpu *works;
15316ba81   Christoph Lameter   [PATCH] add sched...
2708

b61367732   Andrew Morton   [PATCH] schedule_...
2709
2710
  	works = alloc_percpu(struct work_struct);
  	if (!works)
15316ba81   Christoph Lameter   [PATCH] add sched...
2711
  		return -ENOMEM;
b61367732   Andrew Morton   [PATCH] schedule_...
2712

939818009   Tejun Heo   workqueue: fix ra...
2713
  	get_online_cpus();
15316ba81   Christoph Lameter   [PATCH] add sched...
2714
  	for_each_online_cpu(cpu) {
9bfb18392   Ingo Molnar   [PATCH] workqueue...
2715
2716
2717
  		struct work_struct *work = per_cpu_ptr(works, cpu);
  
  		INIT_WORK(work, func);
b71ab8c20   Tejun Heo   workqueue: increa...
2718
  		schedule_work_on(cpu, work);
65a644643   Andi Kleen   HWPOISON: Allow s...
2719
  	}
939818009   Tejun Heo   workqueue: fix ra...
2720
2721
2722
  
  	for_each_online_cpu(cpu)
  		flush_work(per_cpu_ptr(works, cpu));
95402b382   Gautham R Shenoy   cpu-hotplug: repl...
2723
  	put_online_cpus();
b61367732   Andrew Morton   [PATCH] schedule_...
2724
  	free_percpu(works);
15316ba81   Christoph Lameter   [PATCH] add sched...
2725
2726
  	return 0;
  }
eef6a7d5c   Alan Stern   workqueue: warn a...
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
  /**
   * 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
2751
2752
  void flush_scheduled_work(void)
  {
d320c0383   Tejun Heo   workqueue: s/__cr...
2753
  	flush_workqueue(system_wq);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2754
  }
ae90dd5db   Dave Jones   Move workqueue ex...
2755
  EXPORT_SYMBOL(flush_scheduled_work);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2756
2757
  
  /**
1fa44ecad   James Bottomley   [SCSI] add execut...
2758
2759
   * execute_in_process_context - reliably execute the routine with user context
   * @fn:		the function to execute
1fa44ecad   James Bottomley   [SCSI] add execut...
2760
2761
2762
2763
2764
2765
2766
2767
2768
   * @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 ...
2769
  int execute_in_process_context(work_func_t fn, struct execute_work *ew)
1fa44ecad   James Bottomley   [SCSI] add execut...
2770
2771
  {
  	if (!in_interrupt()) {
65f27f384   David Howells   WorkStruct: Pass ...
2772
  		fn(&ew->work);
1fa44ecad   James Bottomley   [SCSI] add execut...
2773
2774
  		return 0;
  	}
65f27f384   David Howells   WorkStruct: Pass ...
2775
  	INIT_WORK(&ew->work, fn);
1fa44ecad   James Bottomley   [SCSI] add execut...
2776
2777
2778
2779
2780
  	schedule_work(&ew->work);
  
  	return 1;
  }
  EXPORT_SYMBOL_GPL(execute_in_process_context);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2781
2782
  int keventd_up(void)
  {
d320c0383   Tejun Heo   workqueue: s/__cr...
2783
  	return system_wq != NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2784
  }
bdbc5dd7d   Tejun Heo   workqueue: prepar...
2785
  static int alloc_cwqs(struct workqueue_struct *wq)
0f900049c   Tejun Heo   workqueue: update...
2786
  {
65a644643   Andi Kleen   HWPOISON: Allow s...
2787
  	/*
0f900049c   Tejun Heo   workqueue: update...
2788
2789
2790
  	 * 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...
2791
  	 */
0f900049c   Tejun Heo   workqueue: update...
2792
2793
2794
  	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...
2795
2796
2797
2798
2799
  #ifdef CONFIG_SMP
  	bool percpu = !(wq->flags & WQ_UNBOUND);
  #else
  	bool percpu = false;
  #endif
65a644643   Andi Kleen   HWPOISON: Allow s...
2800

931ac77ef   Tejun Heo   workqueue: fix bu...
2801
  	if (percpu)
f34217977   Tejun Heo   workqueue: implem...
2802
  		wq->cpu_wq.pcpu = __alloc_percpu(size, align);
931ac77ef   Tejun Heo   workqueue: fix bu...
2803
  	else {
f34217977   Tejun Heo   workqueue: implem...
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
  		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...
2816
  	}
f34217977   Tejun Heo   workqueue: implem...
2817

0415b00d1   Tejun Heo   percpu: Always al...
2818
  	/* just in case, make sure it's actually aligned */
bdbc5dd7d   Tejun Heo   workqueue: prepar...
2819
2820
  	BUG_ON(!IS_ALIGNED(wq->cpu_wq.v, align));
  	return wq->cpu_wq.v ? 0 : -ENOMEM;
0f900049c   Tejun Heo   workqueue: update...
2821
  }
bdbc5dd7d   Tejun Heo   workqueue: prepar...
2822
  static void free_cwqs(struct workqueue_struct *wq)
0f900049c   Tejun Heo   workqueue: update...
2823
  {
931ac77ef   Tejun Heo   workqueue: fix bu...
2824
2825
2826
2827
2828
2829
2830
  #ifdef CONFIG_SMP
  	bool percpu = !(wq->flags & WQ_UNBOUND);
  #else
  	bool percpu = false;
  #endif
  
  	if (percpu)
f34217977   Tejun Heo   workqueue: implem...
2831
2832
2833
  		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...
2834
  		kfree(*(void **)(wq->cpu_wq.single + 1));
f34217977   Tejun Heo   workqueue: implem...
2835
  	}
0f900049c   Tejun Heo   workqueue: update...
2836
  }
f34217977   Tejun Heo   workqueue: implem...
2837
2838
  static int wq_clamp_max_active(int max_active, unsigned int flags,
  			       const char *name)
b71ab8c20   Tejun Heo   workqueue: increa...
2839
  {
f34217977   Tejun Heo   workqueue: implem...
2840
2841
2842
  	int lim = flags & WQ_UNBOUND ? WQ_UNBOUND_MAX_ACTIVE : WQ_MAX_ACTIVE;
  
  	if (max_active < 1 || max_active > lim)
b71ab8c20   Tejun Heo   workqueue: increa...
2843
2844
2845
  		printk(KERN_WARNING "workqueue: max_active %d requested for %s "
  		       "is out of range, clamping between %d and %d
  ",
f34217977   Tejun Heo   workqueue: implem...
2846
  		       max_active, name, 1, lim);
b71ab8c20   Tejun Heo   workqueue: increa...
2847

f34217977   Tejun Heo   workqueue: implem...
2848
  	return clamp_val(max_active, 1, lim);
b71ab8c20   Tejun Heo   workqueue: increa...
2849
  }
d320c0383   Tejun Heo   workqueue: s/__cr...
2850
2851
2852
2853
2854
  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
2855
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2856
  	struct workqueue_struct *wq;
c34056a3f   Tejun Heo   workqueue: introd...
2857
  	unsigned int cpu;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2858

f34217977   Tejun Heo   workqueue: implem...
2859
  	/*
6370a6ad3   Tejun Heo   workqueue: add an...
2860
2861
2862
2863
2864
2865
2866
  	 * 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...
2867
2868
2869
2870
2871
  	 * 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...
2872
  	max_active = max_active ?: WQ_DFL_ACTIVE;
f34217977   Tejun Heo   workqueue: implem...
2873
  	max_active = wq_clamp_max_active(max_active, flags, name);
1e19ffc63   Tejun Heo   workqueue: implem...
2874

3af24433e   Oleg Nesterov   workqueue: don't ...
2875
2876
  	wq = kzalloc(sizeof(*wq), GFP_KERNEL);
  	if (!wq)
4690c4ab5   Tejun Heo   workqueue: misc/c...
2877
  		goto err;
3af24433e   Oleg Nesterov   workqueue: don't ...
2878

97e37d7b9   Tejun Heo   workqueue: merge ...
2879
  	wq->flags = flags;
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
2880
  	wq->saved_max_active = max_active;
73f53c4aa   Tejun Heo   workqueue: reimpl...
2881
2882
2883
2884
  	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...
2885

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

bdbc5dd7d   Tejun Heo   workqueue: prepar...
2890
2891
  	if (alloc_cwqs(wq) < 0)
  		goto err;
f34217977   Tejun Heo   workqueue: implem...
2892
  	for_each_cwq_cpu(cpu, wq) {
1537663f5   Tejun Heo   workqueue: kill c...
2893
  		struct cpu_workqueue_struct *cwq = get_cwq(cpu, wq);
8b03ae3cd   Tejun Heo   workqueue: introd...
2894
  		struct global_cwq *gcwq = get_gcwq(cpu);
1537663f5   Tejun Heo   workqueue: kill c...
2895

0f900049c   Tejun Heo   workqueue: update...
2896
  		BUG_ON((unsigned long)cwq & WORK_STRUCT_FLAG_MASK);
8b03ae3cd   Tejun Heo   workqueue: introd...
2897
  		cwq->gcwq = gcwq;
c34056a3f   Tejun Heo   workqueue: introd...
2898
  		cwq->wq = wq;
73f53c4aa   Tejun Heo   workqueue: reimpl...
2899
  		cwq->flush_color = -1;
1e19ffc63   Tejun Heo   workqueue: implem...
2900
  		cwq->max_active = max_active;
1e19ffc63   Tejun Heo   workqueue: implem...
2901
  		INIT_LIST_HEAD(&cwq->delayed_works);
e22bee782   Tejun Heo   workqueue: implem...
2902
  	}
1537663f5   Tejun Heo   workqueue: kill c...
2903

e22bee782   Tejun Heo   workqueue: implem...
2904
2905
  	if (flags & WQ_RESCUER) {
  		struct worker *rescuer;
f2e005aaf   Tejun Heo   workqueue: fix ma...
2906
  		if (!alloc_mayday_mask(&wq->mayday_mask, GFP_KERNEL))
e22bee782   Tejun Heo   workqueue: implem...
2907
2908
2909
2910
2911
2912
2913
2914
2915
  			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...
2916
2917
  		rescuer->task->flags |= PF_THREAD_BOUND;
  		wake_up_process(rescuer->task);
3af24433e   Oleg Nesterov   workqueue: don't ...
2918
  	}
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
2919
2920
2921
2922
2923
  	/*
  	 * 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...
2924
  	spin_lock(&workqueue_lock);
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
2925

58a69cb47   Tejun Heo   workqueue, freeze...
2926
  	if (workqueue_freezing && wq->flags & WQ_FREEZABLE)
f34217977   Tejun Heo   workqueue: implem...
2927
  		for_each_cwq_cpu(cpu, wq)
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
2928
  			get_cwq(cpu, wq)->max_active = 0;
1537663f5   Tejun Heo   workqueue: kill c...
2929
  	list_add(&wq->list, &workqueues);
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
2930

1537663f5   Tejun Heo   workqueue: kill c...
2931
  	spin_unlock(&workqueue_lock);
3af24433e   Oleg Nesterov   workqueue: don't ...
2932
  	return wq;
4690c4ab5   Tejun Heo   workqueue: misc/c...
2933
2934
  err:
  	if (wq) {
bdbc5dd7d   Tejun Heo   workqueue: prepar...
2935
  		free_cwqs(wq);
f2e005aaf   Tejun Heo   workqueue: fix ma...
2936
  		free_mayday_mask(wq->mayday_mask);
e22bee782   Tejun Heo   workqueue: implem...
2937
  		kfree(wq->rescuer);
4690c4ab5   Tejun Heo   workqueue: misc/c...
2938
2939
2940
  		kfree(wq);
  	}
  	return NULL;
3af24433e   Oleg Nesterov   workqueue: don't ...
2941
  }
d320c0383   Tejun Heo   workqueue: s/__cr...
2942
  EXPORT_SYMBOL_GPL(__alloc_workqueue_key);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2943

3af24433e   Oleg Nesterov   workqueue: don't ...
2944
2945
2946
2947
2948
2949
2950
2951
  /**
   * 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)
  {
c8e55f360   Tejun Heo   workqueue: implem...
2952
  	unsigned int cpu;
3af24433e   Oleg Nesterov   workqueue: don't ...
2953

9c5a2ba70   Tejun Heo   workqueue: separa...
2954
2955
  	/* drain it before proceeding with destruction */
  	drain_workqueue(wq);
c8efcc258   Tejun Heo   workqueue: allow ...
2956

a0a1a5fd4   Tejun Heo   workqueue: reimpl...
2957
2958
2959
2960
  	/*
  	 * 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...
2961
  	spin_lock(&workqueue_lock);
b1f4ec172   Oleg Nesterov   workqueue: introd...
2962
  	list_del(&wq->list);
95402b382   Gautham R Shenoy   cpu-hotplug: repl...
2963
  	spin_unlock(&workqueue_lock);
3af24433e   Oleg Nesterov   workqueue: don't ...
2964

e22bee782   Tejun Heo   workqueue: implem...
2965
  	/* sanity check */
f34217977   Tejun Heo   workqueue: implem...
2966
  	for_each_cwq_cpu(cpu, wq) {
73f53c4aa   Tejun Heo   workqueue: reimpl...
2967
2968
  		struct cpu_workqueue_struct *cwq = get_cwq(cpu, wq);
  		int i;
73f53c4aa   Tejun Heo   workqueue: reimpl...
2969
2970
  		for (i = 0; i < WORK_NR_COLORS; i++)
  			BUG_ON(cwq->nr_in_flight[i]);
1e19ffc63   Tejun Heo   workqueue: implem...
2971
2972
  		BUG_ON(cwq->nr_active);
  		BUG_ON(!list_empty(&cwq->delayed_works));
73f53c4aa   Tejun Heo   workqueue: reimpl...
2973
  	}
9b41ea728   Andrew Morton   [PATCH] workqueue...
2974

e22bee782   Tejun Heo   workqueue: implem...
2975
2976
  	if (wq->flags & WQ_RESCUER) {
  		kthread_stop(wq->rescuer->task);
f2e005aaf   Tejun Heo   workqueue: fix ma...
2977
  		free_mayday_mask(wq->mayday_mask);
8d9df9f08   Xiaotian Feng   workqueue: free r...
2978
  		kfree(wq->rescuer);
e22bee782   Tejun Heo   workqueue: implem...
2979
  	}
bdbc5dd7d   Tejun Heo   workqueue: prepar...
2980
  	free_cwqs(wq);
3af24433e   Oleg Nesterov   workqueue: don't ...
2981
2982
2983
  	kfree(wq);
  }
  EXPORT_SYMBOL_GPL(destroy_workqueue);
dcd989cb7   Tejun Heo   workqueue: implem...
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
  /**
   * 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...
2997
  	max_active = wq_clamp_max_active(max_active, wq->flags, wq->name);
dcd989cb7   Tejun Heo   workqueue: implem...
2998
2999
3000
3001
  
  	spin_lock(&workqueue_lock);
  
  	wq->saved_max_active = max_active;
f34217977   Tejun Heo   workqueue: implem...
3002
  	for_each_cwq_cpu(cpu, wq) {
dcd989cb7   Tejun Heo   workqueue: implem...
3003
3004
3005
  		struct global_cwq *gcwq = get_gcwq(cpu);
  
  		spin_lock_irq(&gcwq->lock);
58a69cb47   Tejun Heo   workqueue, freeze...
3006
  		if (!(wq->flags & WQ_FREEZABLE) ||
dcd989cb7   Tejun Heo   workqueue: implem...
3007
3008
  		    !(gcwq->flags & GCWQ_FREEZING))
  			get_cwq(gcwq->cpu, wq)->max_active = max_active;
9bfb18392   Ingo Molnar   [PATCH] workqueue...
3009

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

dcd989cb7   Tejun Heo   workqueue: implem...
3013
  	spin_unlock(&workqueue_lock);
15316ba81   Christoph Lameter   [PATCH] add sched...
3014
  }
dcd989cb7   Tejun Heo   workqueue: implem...
3015
  EXPORT_SYMBOL_GPL(workqueue_set_max_active);
15316ba81   Christoph Lameter   [PATCH] add sched...
3016

eef6a7d5c   Alan Stern   workqueue: warn a...
3017
  /**
dcd989cb7   Tejun Heo   workqueue: implem...
3018
3019
3020
   * workqueue_congested - test whether a workqueue is congested
   * @cpu: CPU in question
   * @wq: target workqueue
eef6a7d5c   Alan Stern   workqueue: warn a...
3021
   *
dcd989cb7   Tejun Heo   workqueue: implem...
3022
3023
3024
   * 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...
3025
   *
dcd989cb7   Tejun Heo   workqueue: implem...
3026
3027
   * RETURNS:
   * %true if congested, %false otherwise.
eef6a7d5c   Alan Stern   workqueue: warn a...
3028
   */
dcd989cb7   Tejun Heo   workqueue: implem...
3029
  bool workqueue_congested(unsigned int cpu, struct workqueue_struct *wq)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3030
  {
dcd989cb7   Tejun Heo   workqueue: implem...
3031
3032
3033
  	struct cpu_workqueue_struct *cwq = get_cwq(cpu, wq);
  
  	return !list_empty(&cwq->delayed_works);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3034
  }
dcd989cb7   Tejun Heo   workqueue: implem...
3035
  EXPORT_SYMBOL_GPL(workqueue_congested);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3036
3037
  
  /**
dcd989cb7   Tejun Heo   workqueue: implem...
3038
3039
   * work_cpu - return the last known associated cpu for @work
   * @work: the work of interest
1fa44ecad   James Bottomley   [SCSI] add execut...
3040
   *
dcd989cb7   Tejun Heo   workqueue: implem...
3041
   * RETURNS:
bdbc5dd7d   Tejun Heo   workqueue: prepar...
3042
   * CPU number if @work was ever queued.  WORK_CPU_NONE otherwise.
1fa44ecad   James Bottomley   [SCSI] add execut...
3043
   */
dcd989cb7   Tejun Heo   workqueue: implem...
3044
  unsigned int work_cpu(struct work_struct *work)
1fa44ecad   James Bottomley   [SCSI] add execut...
3045
  {
dcd989cb7   Tejun Heo   workqueue: implem...
3046
  	struct global_cwq *gcwq = get_work_gcwq(work);
1fa44ecad   James Bottomley   [SCSI] add execut...
3047

bdbc5dd7d   Tejun Heo   workqueue: prepar...
3048
  	return gcwq ? gcwq->cpu : WORK_CPU_NONE;
1fa44ecad   James Bottomley   [SCSI] add execut...
3049
  }
dcd989cb7   Tejun Heo   workqueue: implem...
3050
  EXPORT_SYMBOL_GPL(work_cpu);
1fa44ecad   James Bottomley   [SCSI] add execut...
3051

dcd989cb7   Tejun Heo   workqueue: implem...
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
  /**
   * 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
3066
  {
dcd989cb7   Tejun Heo   workqueue: implem...
3067
3068
3069
  	struct global_cwq *gcwq = get_work_gcwq(work);
  	unsigned long flags;
  	unsigned int ret = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3070

dcd989cb7   Tejun Heo   workqueue: implem...
3071
3072
  	if (!gcwq)
  		return false;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3073

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

dcd989cb7   Tejun Heo   workqueue: implem...
3076
3077
3078
3079
  	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
3080

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

dcd989cb7   Tejun Heo   workqueue: implem...
3083
  	return ret;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3084
  }
dcd989cb7   Tejun Heo   workqueue: implem...
3085
  EXPORT_SYMBOL_GPL(work_busy);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3086

db7bccf45   Tejun Heo   workqueue: reimpl...
3087
3088
3089
  /*
   * CPU hotplug.
   *
e22bee782   Tejun Heo   workqueue: implem...
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
   * 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...
3102
3103
3104
3105
3106
3107
3108
   *
   * 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...
3109
3110
3111
3112
3113
3114
   *		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...
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
   *
   * 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...
3125
3126
3127
   *		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...
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
   *
   * 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
3139

db7bccf45   Tejun Heo   workqueue: reimpl...
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
  /**
   * 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 ...
3168

db7bccf45   Tejun Heo   workqueue: reimpl...
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
  /**
   * 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
3188

db7bccf45   Tejun Heo   workqueue: reimpl...
3189
  static int __cpuinit trustee_thread(void *__gcwq)
3af24433e   Oleg Nesterov   workqueue: don't ...
3190
  {
db7bccf45   Tejun Heo   workqueue: reimpl...
3191
3192
  	struct global_cwq *gcwq = __gcwq;
  	struct worker *worker;
e22bee782   Tejun Heo   workqueue: implem...
3193
  	struct work_struct *work;
db7bccf45   Tejun Heo   workqueue: reimpl...
3194
  	struct hlist_node *pos;
e22bee782   Tejun Heo   workqueue: implem...
3195
  	long rc;
db7bccf45   Tejun Heo   workqueue: reimpl...
3196
  	int i;
3af24433e   Oleg Nesterov   workqueue: don't ...
3197

db7bccf45   Tejun Heo   workqueue: reimpl...
3198
3199
3200
  	BUG_ON(gcwq->cpu != smp_processor_id());
  
  	spin_lock_irq(&gcwq->lock);
3af24433e   Oleg Nesterov   workqueue: don't ...
3201
  	/*
e22bee782   Tejun Heo   workqueue: implem...
3202
3203
3204
  	 * 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 ...
3205
  	 */
db7bccf45   Tejun Heo   workqueue: reimpl...
3206
  	BUG_ON(gcwq->cpu != smp_processor_id());
e22bee782   Tejun Heo   workqueue: implem...
3207
3208
  	rc = trustee_wait_event(!(gcwq->flags & GCWQ_MANAGING_WORKERS));
  	BUG_ON(rc < 0);
3af24433e   Oleg Nesterov   workqueue: don't ...
3209

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

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

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

db7bccf45   Tejun Heo   workqueue: reimpl...
3218
  	/*
e22bee782   Tejun Heo   workqueue: implem...
3219
3220
3221
3222
3223
3224
3225
3226
  	 * 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...
3227

e22bee782   Tejun Heo   workqueue: implem...
3228
  	/*
cb4447669   Tejun Heo   workqueue: use wo...
3229
3230
3231
3232
  	 * 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...
3233
  	 */
cb4447669   Tejun Heo   workqueue: use wo...
3234
  	atomic_set(get_gcwq_nr_running(gcwq->cpu), 0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3235

e22bee782   Tejun Heo   workqueue: implem...
3236
3237
3238
  	spin_unlock_irq(&gcwq->lock);
  	del_timer_sync(&gcwq->idle_timer);
  	spin_lock_irq(&gcwq->lock);
3af24433e   Oleg Nesterov   workqueue: don't ...
3239

e22bee782   Tejun Heo   workqueue: implem...
3240
  	/*
db7bccf45   Tejun Heo   workqueue: reimpl...
3241
3242
3243
3244
3245
3246
3247
  	 * 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 ...
3248

db7bccf45   Tejun Heo   workqueue: reimpl...
3249
3250
3251
  	/*
  	 * 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...
3252
3253
3254
3255
  	 * 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
58a69cb47   Tejun Heo   workqueue, freeze...
3256
  	 * may be frozen works in freezable cwqs.  Don't declare
e22bee782   Tejun Heo   workqueue: implem...
3257
  	 * completion while frozen.
db7bccf45   Tejun Heo   workqueue: reimpl...
3258
3259
3260
3261
  	 */
  	while (gcwq->nr_workers != gcwq->nr_idle ||
  	       gcwq->flags & GCWQ_FREEZING ||
  	       gcwq->trustee_state == TRUSTEE_IN_CHARGE) {
e22bee782   Tejun Heo   workqueue: implem...
3262
3263
3264
3265
3266
3267
  		int nr_works = 0;
  
  		list_for_each_entry(work, &gcwq->worklist, entry) {
  			send_mayday(work);
  			nr_works++;
  		}
3af24433e   Oleg Nesterov   workqueue: don't ...
3268

e22bee782   Tejun Heo   workqueue: implem...
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
  		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...
3280
  				worker->flags |= WORKER_ROGUE;
e22bee782   Tejun Heo   workqueue: implem...
3281
3282
  				start_worker(worker);
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3283
  		}
3af24433e   Oleg Nesterov   workqueue: don't ...
3284

db7bccf45   Tejun Heo   workqueue: reimpl...
3285
3286
3287
  		/* give a breather */
  		if (trustee_wait_event_timeout(false, TRUSTEE_COOLDOWN) < 0)
  			break;
3af24433e   Oleg Nesterov   workqueue: don't ...
3288
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3289

14441960e   Oleg Nesterov   simplify cleanup_...
3290
  	/*
e22bee782   Tejun Heo   workqueue: implem...
3291
3292
3293
  	 * 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_...
3294
  	 */
e22bee782   Tejun Heo   workqueue: implem...
3295
3296
3297
3298
3299
3300
  	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 ...
3301

14441960e   Oleg Nesterov   simplify cleanup_...
3302
  	/*
e22bee782   Tejun Heo   workqueue: implem...
3303
3304
3305
3306
3307
  	 * 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_...
3308
  	 */
e22bee782   Tejun Heo   workqueue: implem...
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
  	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...
3319
3320
  		worker->flags |= WORKER_REBIND;
  		worker->flags &= ~WORKER_ROGUE;
e22bee782   Tejun Heo   workqueue: implem...
3321
3322
3323
3324
3325
3326
3327
  
  		/* 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...
3328
  		insert_work(get_cwq(gcwq->cpu, system_wq), rebind_work,
e22bee782   Tejun Heo   workqueue: implem...
3329
3330
3331
3332
3333
3334
  			    worker->scheduled.next,
  			    work_color_to_flags(WORK_NO_COLOR));
  	}
  
  	/* relinquish manager role */
  	gcwq->flags &= ~GCWQ_MANAGING_WORKERS;
db7bccf45   Tejun Heo   workqueue: reimpl...
3335
3336
3337
3338
3339
3340
  	/* 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 ...
3341
3342
3343
  }
  
  /**
db7bccf45   Tejun Heo   workqueue: reimpl...
3344
3345
3346
   * 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 ...
3347
   *
db7bccf45   Tejun Heo   workqueue: reimpl...
3348
3349
3350
3351
3352
   * 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 ...
3353
   */
db7bccf45   Tejun Heo   workqueue: reimpl...
3354
  static void __cpuinit wait_trustee_state(struct global_cwq *gcwq, int state)
06bd6ebff   Namhyung Kim   workqueue: annota...
3355
3356
  __releases(&gcwq->lock)
  __acquires(&gcwq->lock)
3af24433e   Oleg Nesterov   workqueue: don't ...
3357
  {
db7bccf45   Tejun Heo   workqueue: reimpl...
3358
3359
3360
3361
3362
3363
3364
3365
  	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 ...
3366
  }
3af24433e   Oleg Nesterov   workqueue: don't ...
3367
3368
3369
3370
3371
3372
  
  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...
3373
3374
  	struct global_cwq *gcwq = get_gcwq(cpu);
  	struct task_struct *new_trustee = NULL;
e22bee782   Tejun Heo   workqueue: implem...
3375
  	struct worker *uninitialized_var(new_worker);
db7bccf45   Tejun Heo   workqueue: reimpl...
3376
  	unsigned long flags;
3af24433e   Oleg Nesterov   workqueue: don't ...
3377

8bb784428   Rafael J. Wysocki   Add suspend-relat...
3378
  	action &= ~CPU_TASKS_FROZEN;
3af24433e   Oleg Nesterov   workqueue: don't ...
3379
  	switch (action) {
db7bccf45   Tejun Heo   workqueue: reimpl...
3380
3381
3382
3383
3384
3385
3386
  	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...
3387
  		/* fall through */
3af24433e   Oleg Nesterov   workqueue: don't ...
3388
  	case CPU_UP_PREPARE:
e22bee782   Tejun Heo   workqueue: implem...
3389
3390
3391
3392
3393
3394
  		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 ...
3395
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3396
  	}
db7bccf45   Tejun Heo   workqueue: reimpl...
3397
3398
  	/* some are called w/ irq disabled, don't disturb irq status */
  	spin_lock_irqsave(&gcwq->lock, flags);
3af24433e   Oleg Nesterov   workqueue: don't ...
3399

00dfcaf74   Oleg Nesterov   workqueues: shrin...
3400
  	switch (action) {
db7bccf45   Tejun Heo   workqueue: reimpl...
3401
3402
3403
3404
3405
3406
3407
  	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...
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
  		/* 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...
3422
  		break;
3da1c84c0   Oleg Nesterov   workqueues: make ...
3423
  	case CPU_POST_DEAD:
db7bccf45   Tejun Heo   workqueue: reimpl...
3424
  		gcwq->trustee_state = TRUSTEE_BUTCHER;
e22bee782   Tejun Heo   workqueue: implem...
3425
3426
3427
3428
  		/* fall through */
  	case CPU_UP_CANCELED:
  		destroy_worker(gcwq->first_idle);
  		gcwq->first_idle = NULL;
db7bccf45   Tejun Heo   workqueue: reimpl...
3429
3430
3431
3432
  		break;
  
  	case CPU_DOWN_FAILED:
  	case CPU_ONLINE:
e22bee782   Tejun Heo   workqueue: implem...
3433
  		gcwq->flags &= ~GCWQ_DISASSOCIATED;
db7bccf45   Tejun Heo   workqueue: reimpl...
3434
3435
3436
3437
  		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 ...
3438
  		}
db7bccf45   Tejun Heo   workqueue: reimpl...
3439

e22bee782   Tejun Heo   workqueue: implem...
3440
3441
3442
3443
3444
3445
3446
3447
3448
3449
3450
  		/*
  		 * 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...
3451
  		break;
00dfcaf74   Oleg Nesterov   workqueues: shrin...
3452
  	}
db7bccf45   Tejun Heo   workqueue: reimpl...
3453
  	spin_unlock_irqrestore(&gcwq->lock, flags);
1537663f5   Tejun Heo   workqueue: kill c...
3454
  	return notifier_from_errno(0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3455
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3456

2d3854a37   Rusty Russell   cpumask: introduc...
3457
  #ifdef CONFIG_SMP
8ccad40df   Rusty Russell   work_on_cpu: Use ...
3458

2d3854a37   Rusty Russell   cpumask: introduc...
3459
  struct work_for_cpu {
6b44003e5   Andrew Morton   work_on_cpu(): re...
3460
  	struct completion completion;
2d3854a37   Rusty Russell   cpumask: introduc...
3461
3462
3463
3464
  	long (*fn)(void *);
  	void *arg;
  	long ret;
  };
6b44003e5   Andrew Morton   work_on_cpu(): re...
3465
  static int do_work_for_cpu(void *_wfc)
2d3854a37   Rusty Russell   cpumask: introduc...
3466
  {
6b44003e5   Andrew Morton   work_on_cpu(): re...
3467
  	struct work_for_cpu *wfc = _wfc;
2d3854a37   Rusty Russell   cpumask: introduc...
3468
  	wfc->ret = wfc->fn(wfc->arg);
6b44003e5   Andrew Morton   work_on_cpu(): re...
3469
3470
  	complete(&wfc->completion);
  	return 0;
2d3854a37   Rusty Russell   cpumask: introduc...
3471
3472
3473
3474
3475
3476
3477
3478
  }
  
  /**
   * 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'...
3479
3480
   * 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...
3481
   * The caller must not hold any locks which would prevent @fn from completing.
2d3854a37   Rusty Russell   cpumask: introduc...
3482
3483
3484
   */
  long work_on_cpu(unsigned int cpu, long (*fn)(void *), void *arg)
  {
6b44003e5   Andrew Morton   work_on_cpu(): re...
3485
3486
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
  	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...
3498
3499
3500
3501
  	return wfc.ret;
  }
  EXPORT_SYMBOL_GPL(work_on_cpu);
  #endif /* CONFIG_SMP */
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
3502
3503
3504
3505
3506
  #ifdef CONFIG_FREEZER
  
  /**
   * freeze_workqueues_begin - begin freezing workqueues
   *
58a69cb47   Tejun Heo   workqueue, freeze...
3507
3508
3509
   * Start freezing workqueues.  After this function returns, all freezable
   * workqueues will queue new works to their frozen_works list instead of
   * gcwq->worklist.
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
3510
3511
   *
   * CONTEXT:
8b03ae3cd   Tejun Heo   workqueue: introd...
3512
   * Grabs and releases workqueue_lock and gcwq->lock's.
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
3513
3514
3515
   */
  void freeze_workqueues_begin(void)
  {
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
3516
3517
3518
3519
3520
3521
  	unsigned int cpu;
  
  	spin_lock(&workqueue_lock);
  
  	BUG_ON(workqueue_freezing);
  	workqueue_freezing = true;
f34217977   Tejun Heo   workqueue: implem...
3522
  	for_each_gcwq_cpu(cpu) {
8b03ae3cd   Tejun Heo   workqueue: introd...
3523
  		struct global_cwq *gcwq = get_gcwq(cpu);
bdbc5dd7d   Tejun Heo   workqueue: prepar...
3524
  		struct workqueue_struct *wq;
8b03ae3cd   Tejun Heo   workqueue: introd...
3525
3526
  
  		spin_lock_irq(&gcwq->lock);
db7bccf45   Tejun Heo   workqueue: reimpl...
3527
3528
  		BUG_ON(gcwq->flags & GCWQ_FREEZING);
  		gcwq->flags |= GCWQ_FREEZING;
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
3529
3530
  		list_for_each_entry(wq, &workqueues, list) {
  			struct cpu_workqueue_struct *cwq = get_cwq(cpu, wq);
58a69cb47   Tejun Heo   workqueue, freeze...
3531
  			if (cwq && wq->flags & WQ_FREEZABLE)
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
3532
  				cwq->max_active = 0;
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
3533
  		}
8b03ae3cd   Tejun Heo   workqueue: introd...
3534
3535
  
  		spin_unlock_irq(&gcwq->lock);
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
3536
3537
3538
3539
3540
3541
  	}
  
  	spin_unlock(&workqueue_lock);
  }
  
  /**
58a69cb47   Tejun Heo   workqueue, freeze...
3542
   * freeze_workqueues_busy - are freezable workqueues still busy?
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
3543
3544
3545
3546
3547
3548
3549
3550
   *
   * Check whether freezing is complete.  This function must be called
   * between freeze_workqueues_begin() and thaw_workqueues().
   *
   * CONTEXT:
   * Grabs and releases workqueue_lock.
   *
   * RETURNS:
58a69cb47   Tejun Heo   workqueue, freeze...
3551
3552
   * %true if some freezable workqueues are still busy.  %false if freezing
   * is complete.
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
3553
3554
3555
   */
  bool freeze_workqueues_busy(void)
  {
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
3556
3557
3558
3559
3560
3561
  	unsigned int cpu;
  	bool busy = false;
  
  	spin_lock(&workqueue_lock);
  
  	BUG_ON(!workqueue_freezing);
f34217977   Tejun Heo   workqueue: implem...
3562
  	for_each_gcwq_cpu(cpu) {
bdbc5dd7d   Tejun Heo   workqueue: prepar...
3563
  		struct workqueue_struct *wq;
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
3564
3565
3566
3567
3568
3569
  		/*
  		 * 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);
58a69cb47   Tejun Heo   workqueue, freeze...
3570
  			if (!cwq || !(wq->flags & WQ_FREEZABLE))
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
3571
3572
3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583
3584
3585
3586
3587
3588
  				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...
3589
   * frozen works are transferred to their respective gcwq worklists.
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
3590
3591
   *
   * CONTEXT:
8b03ae3cd   Tejun Heo   workqueue: introd...
3592
   * Grabs and releases workqueue_lock and gcwq->lock's.
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
3593
3594
3595
   */
  void thaw_workqueues(void)
  {
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
3596
3597
3598
3599
3600
3601
  	unsigned int cpu;
  
  	spin_lock(&workqueue_lock);
  
  	if (!workqueue_freezing)
  		goto out_unlock;
f34217977   Tejun Heo   workqueue: implem...
3602
  	for_each_gcwq_cpu(cpu) {
8b03ae3cd   Tejun Heo   workqueue: introd...
3603
  		struct global_cwq *gcwq = get_gcwq(cpu);
bdbc5dd7d   Tejun Heo   workqueue: prepar...
3604
  		struct workqueue_struct *wq;
8b03ae3cd   Tejun Heo   workqueue: introd...
3605
3606
  
  		spin_lock_irq(&gcwq->lock);
db7bccf45   Tejun Heo   workqueue: reimpl...
3607
3608
  		BUG_ON(!(gcwq->flags & GCWQ_FREEZING));
  		gcwq->flags &= ~GCWQ_FREEZING;
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
3609
3610
  		list_for_each_entry(wq, &workqueues, list) {
  			struct cpu_workqueue_struct *cwq = get_cwq(cpu, wq);
58a69cb47   Tejun Heo   workqueue, freeze...
3611
  			if (!cwq || !(wq->flags & WQ_FREEZABLE))
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
3612
  				continue;
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
3613
3614
3615
3616
3617
3618
  			/* 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...
3619
  		}
8b03ae3cd   Tejun Heo   workqueue: introd...
3620

e22bee782   Tejun Heo   workqueue: implem...
3621
  		wake_up_worker(gcwq);
8b03ae3cd   Tejun Heo   workqueue: introd...
3622
  		spin_unlock_irq(&gcwq->lock);
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
3623
3624
3625
3626
3627
3628
3629
  	}
  
  	workqueue_freezing = false;
  out_unlock:
  	spin_unlock(&workqueue_lock);
  }
  #endif /* CONFIG_FREEZER */
6ee0578b4   Suresh Siddha   workqueue: mark i...
3630
  static int __init init_workqueues(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3631
  {
c34056a3f   Tejun Heo   workqueue: introd...
3632
  	unsigned int cpu;
c8e55f360   Tejun Heo   workqueue: implem...
3633
  	int i;
c34056a3f   Tejun Heo   workqueue: introd...
3634

f6500947a   Tejun Heo   workqueue: workqu...
3635
  	cpu_notifier(workqueue_cpu_callback, CPU_PRI_WORKQUEUE);
8b03ae3cd   Tejun Heo   workqueue: introd...
3636
3637
  
  	/* initialize gcwqs */
f34217977   Tejun Heo   workqueue: implem...
3638
  	for_each_gcwq_cpu(cpu) {
8b03ae3cd   Tejun Heo   workqueue: introd...
3639
3640
3641
  		struct global_cwq *gcwq = get_gcwq(cpu);
  
  		spin_lock_init(&gcwq->lock);
7e11629d0   Tejun Heo   workqueue: use sh...
3642
  		INIT_LIST_HEAD(&gcwq->worklist);
8b03ae3cd   Tejun Heo   workqueue: introd...
3643
  		gcwq->cpu = cpu;
477a3c33d   Tejun Heo   workqueue: fix GC...
3644
  		gcwq->flags |= GCWQ_DISASSOCIATED;
8b03ae3cd   Tejun Heo   workqueue: introd...
3645

c8e55f360   Tejun Heo   workqueue: implem...
3646
3647
3648
  		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...
3649
3650
3651
  		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 ...
3652

e22bee782   Tejun Heo   workqueue: implem...
3653
3654
  		setup_timer(&gcwq->mayday_timer, gcwq_mayday_timeout,
  			    (unsigned long)gcwq);
8b03ae3cd   Tejun Heo   workqueue: introd...
3655
  		ida_init(&gcwq->worker_ida);
db7bccf45   Tejun Heo   workqueue: reimpl...
3656
3657
3658
  
  		gcwq->trustee_state = TRUSTEE_DONE;
  		init_waitqueue_head(&gcwq->trustee_wait);
8b03ae3cd   Tejun Heo   workqueue: introd...
3659
  	}
e22bee782   Tejun Heo   workqueue: implem...
3660
  	/* create the initial worker */
f34217977   Tejun Heo   workqueue: implem...
3661
  	for_each_online_gcwq_cpu(cpu) {
e22bee782   Tejun Heo   workqueue: implem...
3662
3663
  		struct global_cwq *gcwq = get_gcwq(cpu);
  		struct worker *worker;
477a3c33d   Tejun Heo   workqueue: fix GC...
3664
3665
  		if (cpu != WORK_CPU_UNBOUND)
  			gcwq->flags &= ~GCWQ_DISASSOCIATED;
e22bee782   Tejun Heo   workqueue: implem...
3666
3667
3668
3669
3670
3671
  		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...
3672
3673
3674
  	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...
3675
3676
  	system_unbound_wq = alloc_workqueue("events_unbound", WQ_UNBOUND,
  					    WQ_UNBOUND_MAX_ACTIVE);
24d51add7   Tejun Heo   workqueue: fix bu...
3677
3678
  	system_freezable_wq = alloc_workqueue("events_freezable",
  					      WQ_FREEZABLE, 0);
e5cba24e3   Hitoshi Mitake   workqueue: check ...
3679
  	BUG_ON(!system_wq || !system_long_wq || !system_nrt_wq ||
24d51add7   Tejun Heo   workqueue: fix bu...
3680
  	       !system_unbound_wq || !system_freezable_wq);
6ee0578b4   Suresh Siddha   workqueue: mark i...
3681
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3682
  }
6ee0578b4   Suresh Siddha   workqueue: mark i...
3683
  early_initcall(init_workqueues);