Blame view

kernel/workqueue.c 136 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
   * This is the generic async execution mechanism.  Work items as are
   * executed in process context.  The worker pool is shared and
b11895c45   Libin   workqueue: Commen...
19
20
21
22
   * automatically managed.  There are two worker pools for each CPU (one for
   * normal work items and the other for high priority ones) and some extra
   * pools for workqueues which are not bound to any specific CPU - the
   * number of these backing pools is dynamic.
c54fce6ef   Tejun Heo   workqueue: add do...
23
24
   *
   * Please read Documentation/workqueue.txt for details.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
25
   */
9984de1a5   Paul Gortmaker   kernel: Map most ...
26
  #include <linux/export.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
27
28
29
30
31
32
33
34
35
36
  #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>
29c91e991   Tejun Heo   workqueue: implem...
44
  #include <linux/jhash.h>
42f8570f4   Sasha Levin   workqueue: use ne...
45
  #include <linux/hashtable.h>
76af4d936   Tejun Heo   workqueue: update...
46
  #include <linux/rculist.h>
bce903809   Tejun Heo   workqueue: add wq...
47
  #include <linux/nodemask.h>
4c16bd327   Tejun Heo   workqueue: implem...
48
  #include <linux/moduleparam.h>
3d1cb2059   Tejun Heo   workqueue: includ...
49
  #include <linux/uaccess.h>
e22bee782   Tejun Heo   workqueue: implem...
50

ea138446e   Tejun Heo   workqueue: rename...
51
  #include "workqueue_internal.h"
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
52

c8e55f360   Tejun Heo   workqueue: implem...
53
  enum {
bc2ae0f5b   Tejun Heo   workqueue: drop @...
54
  	/*
246475708   Tejun Heo   workqueue: make G...
55
  	 * worker_pool flags
bc2ae0f5b   Tejun Heo   workqueue: drop @...
56
  	 *
246475708   Tejun Heo   workqueue: make G...
57
  	 * A bound pool is either associated or disassociated with its CPU.
bc2ae0f5b   Tejun Heo   workqueue: drop @...
58
59
60
61
62
63
  	 * While associated (!DISASSOCIATED), all workers are bound to the
  	 * CPU and none has %WORKER_UNBOUND set and concurrency management
  	 * is in effect.
  	 *
  	 * While DISASSOCIATED, the cpu may be offline and all workers have
  	 * %WORKER_UNBOUND set and concurrency management disabled, and may
246475708   Tejun Heo   workqueue: make G...
64
  	 * be executing on any CPU.  The pool behaves as an unbound one.
bc2ae0f5b   Tejun Heo   workqueue: drop @...
65
  	 *
bc3a1afc9   Tejun Heo   workqueue: rename...
66
  	 * Note that DISASSOCIATED should be flipped only while holding
92f9c5c40   Lai Jiangshan   workqueue: rename...
67
  	 * attach_mutex to avoid changing binding state while
4736cbf7a   Lai Jiangshan   workqueue: separa...
68
  	 * worker_attach_to_pool() is in progress.
bc2ae0f5b   Tejun Heo   workqueue: drop @...
69
  	 */
246475708   Tejun Heo   workqueue: make G...
70
  	POOL_DISASSOCIATED	= 1 << 2,	/* cpu can't serve workers */
db7bccf45   Tejun Heo   workqueue: reimpl...
71

c8e55f360   Tejun Heo   workqueue: implem...
72
  	/* worker flags */
c8e55f360   Tejun Heo   workqueue: implem...
73
74
  	WORKER_DIE		= 1 << 1,	/* die die die */
  	WORKER_IDLE		= 1 << 2,	/* is idle */
e22bee782   Tejun Heo   workqueue: implem...
75
  	WORKER_PREP		= 1 << 3,	/* preparing to run works */
fb0e7beb5   Tejun Heo   workqueue: implem...
76
  	WORKER_CPU_INTENSIVE	= 1 << 6,	/* cpu intensive */
f34217977   Tejun Heo   workqueue: implem...
77
  	WORKER_UNBOUND		= 1 << 7,	/* worker is unbound */
a9ab775bc   Tejun Heo   workqueue: direct...
78
  	WORKER_REBOUND		= 1 << 8,	/* worker was rebound */
e22bee782   Tejun Heo   workqueue: implem...
79

a9ab775bc   Tejun Heo   workqueue: direct...
80
81
  	WORKER_NOT_RUNNING	= WORKER_PREP | WORKER_CPU_INTENSIVE |
  				  WORKER_UNBOUND | WORKER_REBOUND,
db7bccf45   Tejun Heo   workqueue: reimpl...
82

e34cdddb0   Tejun Heo   workqueue: use st...
83
  	NR_STD_WORKER_POOLS	= 2,		/* # standard pools per cpu */
4ce62e9e3   Tejun Heo   workqueue: introd...
84

29c91e991   Tejun Heo   workqueue: implem...
85
  	UNBOUND_POOL_HASH_ORDER	= 6,		/* hashed by pool->attrs */
c8e55f360   Tejun Heo   workqueue: implem...
86
  	BUSY_WORKER_HASH_ORDER	= 6,		/* 64 pointers */
db7bccf45   Tejun Heo   workqueue: reimpl...
87

e22bee782   Tejun Heo   workqueue: implem...
88
89
  	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...
90
91
92
  	MAYDAY_INITIAL_TIMEOUT  = HZ / 100 >= 2 ? HZ / 100 : 2,
  						/* call for help after 10ms
  						   (min two ticks) */
e22bee782   Tejun Heo   workqueue: implem...
93
94
  	MAYDAY_INTERVAL		= HZ / 10,	/* and then every 100ms */
  	CREATE_COOLDOWN		= HZ,		/* time to breath after fail */
e22bee782   Tejun Heo   workqueue: implem...
95
96
97
  
  	/*
  	 * Rescue workers are used only on emergencies and shared by
8698a745d   Dongsheng Yang   sched, treewide: ...
98
  	 * all cpus.  Give MIN_NICE.
e22bee782   Tejun Heo   workqueue: implem...
99
  	 */
8698a745d   Dongsheng Yang   sched, treewide: ...
100
101
  	RESCUER_NICE_LEVEL	= MIN_NICE,
  	HIGHPRI_NICE_LEVEL	= MIN_NICE,
ecf6881ff   Tejun Heo   workqueue: make w...
102
103
  
  	WQ_NAME_LEN		= 24,
c8e55f360   Tejun Heo   workqueue: implem...
104
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
105
106
  
  /*
4690c4ab5   Tejun Heo   workqueue: misc/c...
107
108
   * Structure fields follow one of the following exclusion rules.
   *
e41e704bc   Tejun Heo   workqueue: improv...
109
110
   * I: Modifiable by initialization/destruction paths and read-only for
   *    everyone else.
4690c4ab5   Tejun Heo   workqueue: misc/c...
111
   *
e22bee782   Tejun Heo   workqueue: implem...
112
113
114
   * P: Preemption protected.  Disabling preemption is enough and should
   *    only be modified and accessed from the local cpu.
   *
d565ed630   Tejun Heo   workqueue: move g...
115
   * L: pool->lock protected.  Access with pool->lock held.
4690c4ab5   Tejun Heo   workqueue: misc/c...
116
   *
d565ed630   Tejun Heo   workqueue: move g...
117
118
119
120
   * X: During normal operation, modification requires pool->lock and should
   *    be done only from local cpu.  Either disabling preemption on local
   *    cpu or grabbing pool->lock is enough for read access.  If
   *    POOL_DISASSOCIATED is set, it's identical to L.
e22bee782   Tejun Heo   workqueue: implem...
121
   *
92f9c5c40   Lai Jiangshan   workqueue: rename...
122
   * A: pool->attach_mutex protected.
822d8405d   Tejun Heo   workqueue: conver...
123
   *
68e13a67d   Lai Jiangshan   workqueue: rename...
124
   * PL: wq_pool_mutex protected.
5bcab3355   Tejun Heo   workqueue: separa...
125
   *
68e13a67d   Lai Jiangshan   workqueue: rename...
126
   * PR: wq_pool_mutex protected for writes.  Sched-RCU protected for reads.
76af4d936   Tejun Heo   workqueue: update...
127
   *
3c25a55da   Lai Jiangshan   workqueue: rename...
128
129
   * WQ: wq->mutex protected.
   *
b59276054   Lai Jiangshan   workqueue: remove...
130
   * WR: wq->mutex protected for writes.  Sched-RCU protected for reads.
2e109a285   Tejun Heo   workqueue: rename...
131
132
   *
   * MD: wq_mayday_lock protected.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
133
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
134

2eaebdb33   Tejun Heo   workqueue: move s...
135
  /* struct worker is defined in workqueue_internal.h */
c34056a3f   Tejun Heo   workqueue: introd...
136

bd7bdd43d   Tejun Heo   workqueue: factor...
137
  struct worker_pool {
d565ed630   Tejun Heo   workqueue: move g...
138
  	spinlock_t		lock;		/* the pool lock */
d84ff0512   Tejun Heo   workqueue: consis...
139
  	int			cpu;		/* I: the associated cpu */
f3f90ad46   Tejun Heo   workqueue: determ...
140
  	int			node;		/* I: the associated node ID */
9daf9e678   Tejun Heo   workqueue: add wo...
141
  	int			id;		/* I: pool ID */
11ebea50d   Tejun Heo   workqueue: separa...
142
  	unsigned int		flags;		/* X: flags */
bd7bdd43d   Tejun Heo   workqueue: factor...
143
144
145
  
  	struct list_head	worklist;	/* L: list of pending works */
  	int			nr_workers;	/* L: total number of workers */
ea1abd619   Lai Jiangshan   workqueue: reimpl...
146
147
  
  	/* nr_idle includes the ones off idle_list for rebinding */
bd7bdd43d   Tejun Heo   workqueue: factor...
148
149
150
151
152
  	int			nr_idle;	/* L: currently idle ones */
  
  	struct list_head	idle_list;	/* X: list of idle workers */
  	struct timer_list	idle_timer;	/* L: worker idle timeout */
  	struct timer_list	mayday_timer;	/* L: SOS timer for workers */
c5aa87bbf   Tejun Heo   workqueue: update...
153
  	/* a workers is either on busy_hash or idle_list, or the manager */
c9e7cf273   Tejun Heo   workqueue: move b...
154
155
  	DECLARE_HASHTABLE(busy_hash, BUSY_WORKER_HASH_ORDER);
  						/* L: hash of busy workers */
bc3a1afc9   Tejun Heo   workqueue: rename...
156
  	/* see manage_workers() for details on the two manager mutexes */
34a06bd6b   Tejun Heo   workqueue: replac...
157
  	struct mutex		manager_arb;	/* manager arbitration */
92f9c5c40   Lai Jiangshan   workqueue: rename...
158
159
  	struct mutex		attach_mutex;	/* attach/detach exclusion */
  	struct list_head	workers;	/* A: attached workers */
60f5a4bcf   Lai Jiangshan   workqueue: async ...
160
  	struct completion	*detach_completion; /* all workers detached */
e19e397a8   Tejun Heo   workqueue: move n...
161

7cda9aae0   Lai Jiangshan   workqueue: conver...
162
  	struct ida		worker_ida;	/* worker IDs for task name */
e19e397a8   Tejun Heo   workqueue: move n...
163

7a4e344c5   Tejun Heo   workqueue: introd...
164
  	struct workqueue_attrs	*attrs;		/* I: worker attributes */
68e13a67d   Lai Jiangshan   workqueue: rename...
165
166
  	struct hlist_node	hash_node;	/* PL: unbound_pool_hash node */
  	int			refcnt;		/* PL: refcnt for unbound pools */
7a4e344c5   Tejun Heo   workqueue: introd...
167

e19e397a8   Tejun Heo   workqueue: move n...
168
169
170
171
172
173
  	/*
  	 * The current concurrency level.  As it's likely to be accessed
  	 * from other CPUs during try_to_wake_up(), put it in a separate
  	 * cacheline.
  	 */
  	atomic_t		nr_running ____cacheline_aligned_in_smp;
29c91e991   Tejun Heo   workqueue: implem...
174
175
176
177
178
179
  
  	/*
  	 * Destruction of pool is sched-RCU protected to allow dereferences
  	 * from get_work_pool().
  	 */
  	struct rcu_head		rcu;
8b03ae3cd   Tejun Heo   workqueue: introd...
180
181
182
  } ____cacheline_aligned_in_smp;
  
  /*
112202d90   Tejun Heo   workqueue: rename...
183
184
185
186
   * The per-pool workqueue.  While queued, the lower WORK_STRUCT_FLAG_BITS
   * of work_struct->data are used for flags and the remaining high bits
   * point to the pwq; thus, pwqs need to be aligned at two's power of the
   * number of flag bits.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
187
   */
112202d90   Tejun Heo   workqueue: rename...
188
  struct pool_workqueue {
bd7bdd43d   Tejun Heo   workqueue: factor...
189
  	struct worker_pool	*pool;		/* I: the associated pool */
4690c4ab5   Tejun Heo   workqueue: misc/c...
190
  	struct workqueue_struct *wq;		/* I: the owning workqueue */
73f53c4aa   Tejun Heo   workqueue: reimpl...
191
192
  	int			work_color;	/* L: current color */
  	int			flush_color;	/* L: flushing color */
8864b4e59   Tejun Heo   workqueue: implem...
193
  	int			refcnt;		/* L: reference count */
73f53c4aa   Tejun Heo   workqueue: reimpl...
194
195
  	int			nr_in_flight[WORK_NR_COLORS];
  						/* L: nr of in_flight works */
1e19ffc63   Tejun Heo   workqueue: implem...
196
  	int			nr_active;	/* L: nr of active works */
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
197
  	int			max_active;	/* L: max active works */
1e19ffc63   Tejun Heo   workqueue: implem...
198
  	struct list_head	delayed_works;	/* L: delayed works */
3c25a55da   Lai Jiangshan   workqueue: rename...
199
  	struct list_head	pwqs_node;	/* WR: node on wq->pwqs */
2e109a285   Tejun Heo   workqueue: rename...
200
  	struct list_head	mayday_node;	/* MD: node on wq->maydays */
8864b4e59   Tejun Heo   workqueue: implem...
201
202
203
204
205
  
  	/*
  	 * Release of unbound pwq is punted to system_wq.  See put_pwq()
  	 * and pwq_unbound_release_workfn() for details.  pool_workqueue
  	 * itself is also sched-RCU protected so that the first pwq can be
b09f4fd39   Lai Jiangshan   workqueue: protec...
206
  	 * determined without grabbing wq->mutex.
8864b4e59   Tejun Heo   workqueue: implem...
207
208
209
  	 */
  	struct work_struct	unbound_release_work;
  	struct rcu_head		rcu;
e904e6c26   Tejun Heo   workqueue: introd...
210
  } __aligned(1 << WORK_STRUCT_FLAG_BITS);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
211
212
  
  /*
73f53c4aa   Tejun Heo   workqueue: reimpl...
213
214
215
   * Structure used to wait for workqueue flush.
   */
  struct wq_flusher {
3c25a55da   Lai Jiangshan   workqueue: rename...
216
217
  	struct list_head	list;		/* WQ: list of flushers */
  	int			flush_color;	/* WQ: flush color waiting for */
73f53c4aa   Tejun Heo   workqueue: reimpl...
218
219
  	struct completion	done;		/* flush completion */
  };
226223ab3   Tejun Heo   workqueue: implem...
220
  struct wq_device;
73f53c4aa   Tejun Heo   workqueue: reimpl...
221
  /*
c5aa87bbf   Tejun Heo   workqueue: update...
222
223
   * The externally visible workqueue.  It relays the issued work items to
   * the appropriate worker_pool through its pool_workqueues.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
224
225
   */
  struct workqueue_struct {
3c25a55da   Lai Jiangshan   workqueue: rename...
226
  	struct list_head	pwqs;		/* WR: all pwqs of this wq */
68e13a67d   Lai Jiangshan   workqueue: rename...
227
  	struct list_head	list;		/* PL: list of all workqueues */
73f53c4aa   Tejun Heo   workqueue: reimpl...
228

3c25a55da   Lai Jiangshan   workqueue: rename...
229
230
231
  	struct mutex		mutex;		/* protects this wq */
  	int			work_color;	/* WQ: current work color */
  	int			flush_color;	/* WQ: current flush color */
112202d90   Tejun Heo   workqueue: rename...
232
  	atomic_t		nr_pwqs_to_flush; /* flush in progress */
3c25a55da   Lai Jiangshan   workqueue: rename...
233
234
235
  	struct wq_flusher	*first_flusher;	/* WQ: first flusher */
  	struct list_head	flusher_queue;	/* WQ: flush waiters */
  	struct list_head	flusher_overflow; /* WQ: flush overflow list */
73f53c4aa   Tejun Heo   workqueue: reimpl...
236

2e109a285   Tejun Heo   workqueue: rename...
237
  	struct list_head	maydays;	/* MD: pwqs requesting rescue */
e22bee782   Tejun Heo   workqueue: implem...
238
  	struct worker		*rescuer;	/* I: rescue worker */
87fc741e9   Lai Jiangshan   workqueue: protec...
239
  	int			nr_drainers;	/* WQ: drain in progress */
a357fc032   Lai Jiangshan   workqueue: protec...
240
  	int			saved_max_active; /* WQ: saved pwq max_active */
226223ab3   Tejun Heo   workqueue: implem...
241

6029a9182   Tejun Heo   workqueue: add wo...
242
  	struct workqueue_attrs	*unbound_attrs;	/* WQ: only for unbound wqs */
4c16bd327   Tejun Heo   workqueue: implem...
243
  	struct pool_workqueue	*dfl_pwq;	/* WQ: only for unbound wqs */
6029a9182   Tejun Heo   workqueue: add wo...
244

226223ab3   Tejun Heo   workqueue: implem...
245
246
247
  #ifdef CONFIG_SYSFS
  	struct wq_device	*wq_dev;	/* I: for sysfs interface */
  #endif
4e6045f13   Johannes Berg   workqueue: debug ...
248
  #ifdef CONFIG_LOCKDEP
4690c4ab5   Tejun Heo   workqueue: misc/c...
249
  	struct lockdep_map	lockdep_map;
4e6045f13   Johannes Berg   workqueue: debug ...
250
  #endif
ecf6881ff   Tejun Heo   workqueue: make w...
251
  	char			name[WQ_NAME_LEN]; /* I: workqueue name */
2728fd2f0   Tejun Heo   workqueue: move h...
252
253
254
255
  
  	/* hot fields used during command issue, aligned to cacheline */
  	unsigned int		flags ____cacheline_aligned; /* WQ: WQ_* flags */
  	struct pool_workqueue __percpu *cpu_pwqs; /* I: per-cpu pwqs */
df2d5ae49   Tejun Heo   workqueue: map an...
256
  	struct pool_workqueue __rcu *numa_pwq_tbl[]; /* FR: unbound pwqs indexed by node */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
257
  };
e904e6c26   Tejun Heo   workqueue: introd...
258
  static struct kmem_cache *pwq_cache;
bce903809   Tejun Heo   workqueue: add wq...
259
260
  static cpumask_var_t *wq_numa_possible_cpumask;
  					/* possible CPUs of each node */
d55262c4d   Tejun Heo   workqueue: update...
261
262
  static bool wq_disable_numa;
  module_param_named(disable_numa, wq_disable_numa, bool, 0444);
cee22a150   Viresh Kumar   workqueues: Intro...
263
264
265
266
267
268
269
270
  /* see the comment above the definition of WQ_POWER_EFFICIENT */
  #ifdef CONFIG_WQ_POWER_EFFICIENT_DEFAULT
  static bool wq_power_efficient = true;
  #else
  static bool wq_power_efficient;
  #endif
  
  module_param_named(power_efficient, wq_power_efficient, bool, 0444);
bce903809   Tejun Heo   workqueue: add wq...
271
  static bool wq_numa_enabled;		/* unbound NUMA affinity enabled */
4c16bd327   Tejun Heo   workqueue: implem...
272
273
  /* buf for wq_update_unbound_numa_attrs(), protected by CPU hotplug exclusion */
  static struct workqueue_attrs *wq_update_unbound_numa_attrs_buf;
68e13a67d   Lai Jiangshan   workqueue: rename...
274
  static DEFINE_MUTEX(wq_pool_mutex);	/* protects pools and workqueues list */
2e109a285   Tejun Heo   workqueue: rename...
275
  static DEFINE_SPINLOCK(wq_mayday_lock);	/* protects wq->maydays list */
5bcab3355   Tejun Heo   workqueue: separa...
276

68e13a67d   Lai Jiangshan   workqueue: rename...
277
278
  static LIST_HEAD(workqueues);		/* PL: list of all workqueues */
  static bool workqueue_freezing;		/* PL: have wqs started freezing? */
7d19c5ce6   Tejun Heo   workqueue: reloca...
279
280
281
282
  
  /* the per-cpu worker pools */
  static DEFINE_PER_CPU_SHARED_ALIGNED(struct worker_pool [NR_STD_WORKER_POOLS],
  				     cpu_worker_pools);
68e13a67d   Lai Jiangshan   workqueue: rename...
283
  static DEFINE_IDR(worker_pool_idr);	/* PR: idr of all pools */
7d19c5ce6   Tejun Heo   workqueue: reloca...
284

68e13a67d   Lai Jiangshan   workqueue: rename...
285
  /* PL: hash of all unbound pools keyed by pool->attrs */
29c91e991   Tejun Heo   workqueue: implem...
286
  static DEFINE_HASHTABLE(unbound_pool_hash, UNBOUND_POOL_HASH_ORDER);
c5aa87bbf   Tejun Heo   workqueue: update...
287
  /* I: attributes used when instantiating standard unbound pools on demand */
29c91e991   Tejun Heo   workqueue: implem...
288
  static struct workqueue_attrs *unbound_std_wq_attrs[NR_STD_WORKER_POOLS];
8a2b75384   Tejun Heo   workqueue: fix or...
289
290
  /* I: attributes used when instantiating ordered pools on demand */
  static struct workqueue_attrs *ordered_wq_attrs[NR_STD_WORKER_POOLS];
d320c0383   Tejun Heo   workqueue: s/__cr...
291
  struct workqueue_struct *system_wq __read_mostly;
ad7b1f841   Marc Dionne   workqueue: Make s...
292
  EXPORT_SYMBOL(system_wq);
044c782ce   Valentin Ilie   workqueue: fix ch...
293
  struct workqueue_struct *system_highpri_wq __read_mostly;
1aabe902c   Joonsoo Kim   workqueue: introd...
294
  EXPORT_SYMBOL_GPL(system_highpri_wq);
044c782ce   Valentin Ilie   workqueue: fix ch...
295
  struct workqueue_struct *system_long_wq __read_mostly;
d320c0383   Tejun Heo   workqueue: s/__cr...
296
  EXPORT_SYMBOL_GPL(system_long_wq);
044c782ce   Valentin Ilie   workqueue: fix ch...
297
  struct workqueue_struct *system_unbound_wq __read_mostly;
f34217977   Tejun Heo   workqueue: implem...
298
  EXPORT_SYMBOL_GPL(system_unbound_wq);
044c782ce   Valentin Ilie   workqueue: fix ch...
299
  struct workqueue_struct *system_freezable_wq __read_mostly;
24d51add7   Tejun Heo   workqueue: fix bu...
300
  EXPORT_SYMBOL_GPL(system_freezable_wq);
0668106ca   Viresh Kumar   workqueue: Add sy...
301
302
303
304
  struct workqueue_struct *system_power_efficient_wq __read_mostly;
  EXPORT_SYMBOL_GPL(system_power_efficient_wq);
  struct workqueue_struct *system_freezable_power_efficient_wq __read_mostly;
  EXPORT_SYMBOL_GPL(system_freezable_power_efficient_wq);
d320c0383   Tejun Heo   workqueue: s/__cr...
305

7d19c5ce6   Tejun Heo   workqueue: reloca...
306
307
308
  static int worker_thread(void *__worker);
  static void copy_workqueue_attrs(struct workqueue_attrs *to,
  				 const struct workqueue_attrs *from);
97bd23470   Tejun Heo   workqueue: prepar...
309
310
  #define CREATE_TRACE_POINTS
  #include <trace/events/workqueue.h>
68e13a67d   Lai Jiangshan   workqueue: rename...
311
  #define assert_rcu_or_pool_mutex()					\
5bcab3355   Tejun Heo   workqueue: separa...
312
  	rcu_lockdep_assert(rcu_read_lock_sched_held() ||		\
68e13a67d   Lai Jiangshan   workqueue: rename...
313
314
  			   lockdep_is_held(&wq_pool_mutex),		\
  			   "sched RCU or wq_pool_mutex should be held")
5bcab3355   Tejun Heo   workqueue: separa...
315

b09f4fd39   Lai Jiangshan   workqueue: protec...
316
  #define assert_rcu_or_wq_mutex(wq)					\
76af4d936   Tejun Heo   workqueue: update...
317
  	rcu_lockdep_assert(rcu_read_lock_sched_held() ||		\
b59276054   Lai Jiangshan   workqueue: remove...
318
  			   lockdep_is_held(&wq->mutex),			\
b09f4fd39   Lai Jiangshan   workqueue: protec...
319
  			   "sched RCU or wq->mutex should be held")
76af4d936   Tejun Heo   workqueue: update...
320

f02ae73aa   Tejun Heo   workqueue: drop "...
321
322
323
  #define for_each_cpu_worker_pool(pool, cpu)				\
  	for ((pool) = &per_cpu(cpu_worker_pools, cpu)[0];		\
  	     (pool) < &per_cpu(cpu_worker_pools, cpu)[NR_STD_WORKER_POOLS]; \
7a62c2c87   Tejun Heo   workqueue: remove...
324
  	     (pool)++)
4ce62e9e3   Tejun Heo   workqueue: introd...
325

49e3cf44d   Tejun Heo   workqueue: replac...
326
  /**
171169695   Tejun Heo   workqueue: introd...
327
328
   * for_each_pool - iterate through all worker_pools in the system
   * @pool: iteration cursor
611c92a02   Tejun Heo   workqueue: rename...
329
   * @pi: integer used for iteration
fa1b54e69   Tejun Heo   workqueue: update...
330
   *
68e13a67d   Lai Jiangshan   workqueue: rename...
331
332
333
   * This must be called either with wq_pool_mutex held or sched RCU read
   * locked.  If the pool needs to be used beyond the locking in effect, the
   * caller is responsible for guaranteeing that the pool stays online.
fa1b54e69   Tejun Heo   workqueue: update...
334
335
336
   *
   * The if/else clause exists only for the lockdep assertion and can be
   * ignored.
171169695   Tejun Heo   workqueue: introd...
337
   */
611c92a02   Tejun Heo   workqueue: rename...
338
339
  #define for_each_pool(pool, pi)						\
  	idr_for_each_entry(&worker_pool_idr, pool, pi)			\
68e13a67d   Lai Jiangshan   workqueue: rename...
340
  		if (({ assert_rcu_or_pool_mutex(); false; })) { }	\
fa1b54e69   Tejun Heo   workqueue: update...
341
  		else
171169695   Tejun Heo   workqueue: introd...
342
343
  
  /**
822d8405d   Tejun Heo   workqueue: conver...
344
345
   * for_each_pool_worker - iterate through all workers of a worker_pool
   * @worker: iteration cursor
822d8405d   Tejun Heo   workqueue: conver...
346
347
   * @pool: worker_pool to iterate workers of
   *
92f9c5c40   Lai Jiangshan   workqueue: rename...
348
   * This must be called with @pool->attach_mutex.
822d8405d   Tejun Heo   workqueue: conver...
349
350
351
352
   *
   * The if/else clause exists only for the lockdep assertion and can be
   * ignored.
   */
da028469b   Lai Jiangshan   workqueue: separa...
353
354
  #define for_each_pool_worker(worker, pool)				\
  	list_for_each_entry((worker), &(pool)->workers, node)		\
92f9c5c40   Lai Jiangshan   workqueue: rename...
355
  		if (({ lockdep_assert_held(&pool->attach_mutex); false; })) { } \
822d8405d   Tejun Heo   workqueue: conver...
356
357
358
  		else
  
  /**
49e3cf44d   Tejun Heo   workqueue: replac...
359
360
361
   * for_each_pwq - iterate through all pool_workqueues of the specified workqueue
   * @pwq: iteration cursor
   * @wq: the target workqueue
76af4d936   Tejun Heo   workqueue: update...
362
   *
b09f4fd39   Lai Jiangshan   workqueue: protec...
363
   * This must be called either with wq->mutex held or sched RCU read locked.
794b18bc8   Tejun Heo   workqueue: separa...
364
365
   * If the pwq needs to be used beyond the locking in effect, the caller is
   * responsible for guaranteeing that the pwq stays online.
76af4d936   Tejun Heo   workqueue: update...
366
367
368
   *
   * The if/else clause exists only for the lockdep assertion and can be
   * ignored.
49e3cf44d   Tejun Heo   workqueue: replac...
369
370
   */
  #define for_each_pwq(pwq, wq)						\
76af4d936   Tejun Heo   workqueue: update...
371
  	list_for_each_entry_rcu((pwq), &(wq)->pwqs, pwqs_node)		\
b09f4fd39   Lai Jiangshan   workqueue: protec...
372
  		if (({ assert_rcu_or_wq_mutex(wq); false; })) { }	\
76af4d936   Tejun Heo   workqueue: update...
373
  		else
f34217977   Tejun Heo   workqueue: implem...
374

dc186ad74   Thomas Gleixner   workqueue: Add de...
375
376
377
  #ifdef CONFIG_DEBUG_OBJECTS_WORK
  
  static struct debug_obj_descr work_debug_descr;
997772884   Stanislaw Gruszka   debugobjects: Add...
378
379
380
381
  static void *work_debug_hint(void *addr)
  {
  	return ((struct work_struct *) addr)->func;
  }
dc186ad74   Thomas Gleixner   workqueue: Add de...
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
  /*
   * 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...
417
  		if (test_bit(WORK_STRUCT_STATIC_BIT, work_data_bits(work))) {
dc186ad74   Thomas Gleixner   workqueue: Add de...
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
  			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...
453
  	.debug_hint	= work_debug_hint,
dc186ad74   Thomas Gleixner   workqueue: Add de...
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
  	.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);
ea2e64f28   Thomas Gleixner   workqueue: Provid...
483
484
485
486
487
488
  void destroy_delayed_work_on_stack(struct delayed_work *work)
  {
  	destroy_timer_on_stack(&work->timer);
  	debug_object_free(&work->work, &work_debug_descr);
  }
  EXPORT_SYMBOL_GPL(destroy_delayed_work_on_stack);
dc186ad74   Thomas Gleixner   workqueue: Add de...
489
490
491
492
  #else
  static inline void debug_work_activate(struct work_struct *work) { }
  static inline void debug_work_deactivate(struct work_struct *work) { }
  #endif
4e8b22bd1   Li Bin   workqueue: fix po...
493
494
495
496
497
498
499
  /**
   * worker_pool_assign_id - allocate ID and assing it to @pool
   * @pool: the pool pointer of interest
   *
   * Returns 0 if ID in [0, WORK_OFFQ_POOL_NONE) is allocated and assigned
   * successfully, -errno on failure.
   */
9daf9e678   Tejun Heo   workqueue: add wo...
500
501
502
  static int worker_pool_assign_id(struct worker_pool *pool)
  {
  	int ret;
68e13a67d   Lai Jiangshan   workqueue: rename...
503
  	lockdep_assert_held(&wq_pool_mutex);
5bcab3355   Tejun Heo   workqueue: separa...
504

4e8b22bd1   Li Bin   workqueue: fix po...
505
506
  	ret = idr_alloc(&worker_pool_idr, pool, 0, WORK_OFFQ_POOL_NONE,
  			GFP_KERNEL);
229641a6f   Tejun Heo   Merge tag 'v3.9-r...
507
  	if (ret >= 0) {
e68035fb6   Tejun Heo   workqueue: conver...
508
  		pool->id = ret;
229641a6f   Tejun Heo   Merge tag 'v3.9-r...
509
510
  		return 0;
  	}
fa1b54e69   Tejun Heo   workqueue: update...
511
  	return ret;
7c3eed5cd   Tejun Heo   workqueue: record...
512
  }
76af4d936   Tejun Heo   workqueue: update...
513
  /**
df2d5ae49   Tejun Heo   workqueue: map an...
514
515
516
517
518
519
520
   * unbound_pwq_by_node - return the unbound pool_workqueue for the given node
   * @wq: the target workqueue
   * @node: the node ID
   *
   * This must be called either with pwq_lock held or sched RCU read locked.
   * If the pwq needs to be used beyond the locking in effect, the caller is
   * responsible for guaranteeing that the pwq stays online.
d185af300   Yacine Belkadi   workqueue: fix so...
521
522
   *
   * Return: The unbound pool_workqueue for @node.
df2d5ae49   Tejun Heo   workqueue: map an...
523
524
525
526
527
528
529
   */
  static struct pool_workqueue *unbound_pwq_by_node(struct workqueue_struct *wq,
  						  int node)
  {
  	assert_rcu_or_wq_mutex(wq);
  	return rcu_dereference_raw(wq->numa_pwq_tbl[node]);
  }
73f53c4aa   Tejun Heo   workqueue: reimpl...
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
  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
545

14441960e   Oleg Nesterov   simplify cleanup_...
546
  /*
112202d90   Tejun Heo   workqueue: rename...
547
548
   * While queued, %WORK_STRUCT_PWQ is set and non flag bits of a work's data
   * contain the pointer to the queued pwq.  Once execution starts, the flag
7c3eed5cd   Tejun Heo   workqueue: record...
549
   * is cleared and the high bits contain OFFQ flags and pool ID.
7a22ad757   Tejun Heo   workqueue: carry ...
550
   *
112202d90   Tejun Heo   workqueue: rename...
551
552
   * set_work_pwq(), set_work_pool_and_clear_pending(), mark_work_canceling()
   * and clear_work_data() can be used to set the pwq, pool or clear
bbb68dfab   Tejun Heo   workqueue: mark a...
553
554
   * work->data.  These functions should only be called while the work is
   * owned - ie. while the PENDING bit is set.
7a22ad757   Tejun Heo   workqueue: carry ...
555
   *
112202d90   Tejun Heo   workqueue: rename...
556
   * get_work_pool() and get_work_pwq() can be used to obtain the pool or pwq
7c3eed5cd   Tejun Heo   workqueue: record...
557
   * corresponding to a work.  Pool is available once the work has been
112202d90   Tejun Heo   workqueue: rename...
558
   * queued anywhere after initialization until it is sync canceled.  pwq is
7c3eed5cd   Tejun Heo   workqueue: record...
559
   * available only while the work item is queued.
7a22ad757   Tejun Heo   workqueue: carry ...
560
   *
bbb68dfab   Tejun Heo   workqueue: mark a...
561
562
563
564
   * %WORK_OFFQ_CANCELING is used to mark a work item which is being
   * canceled.  While being canceled, a work item may have its PENDING set
   * but stay off timer and worklist for arbitrarily long and nobody should
   * try to steal the PENDING bit.
14441960e   Oleg Nesterov   simplify cleanup_...
565
   */
7a22ad757   Tejun Heo   workqueue: carry ...
566
567
  static inline void set_work_data(struct work_struct *work, unsigned long data,
  				 unsigned long flags)
365970a1e   David Howells   WorkStruct: Merge...
568
  {
6183c009f   Tejun Heo   workqueue: make s...
569
  	WARN_ON_ONCE(!work_pending(work));
7a22ad757   Tejun Heo   workqueue: carry ...
570
571
  	atomic_long_set(&work->data, data | flags | work_static(work));
  }
365970a1e   David Howells   WorkStruct: Merge...
572

112202d90   Tejun Heo   workqueue: rename...
573
  static void set_work_pwq(struct work_struct *work, struct pool_workqueue *pwq,
7a22ad757   Tejun Heo   workqueue: carry ...
574
575
  			 unsigned long extra_flags)
  {
112202d90   Tejun Heo   workqueue: rename...
576
577
  	set_work_data(work, (unsigned long)pwq,
  		      WORK_STRUCT_PENDING | WORK_STRUCT_PWQ | extra_flags);
365970a1e   David Howells   WorkStruct: Merge...
578
  }
4468a00fd   Lai Jiangshan   workqueue: make w...
579
580
581
582
583
584
  static void set_work_pool_and_keep_pending(struct work_struct *work,
  					   int pool_id)
  {
  	set_work_data(work, (unsigned long)pool_id << WORK_OFFQ_POOL_SHIFT,
  		      WORK_STRUCT_PENDING);
  }
7c3eed5cd   Tejun Heo   workqueue: record...
585
586
  static void set_work_pool_and_clear_pending(struct work_struct *work,
  					    int pool_id)
7a22ad757   Tejun Heo   workqueue: carry ...
587
  {
23657bb19   Tejun Heo   workqueue: add mi...
588
589
590
591
592
593
594
  	/*
  	 * The following wmb is paired with the implied mb in
  	 * test_and_set_bit(PENDING) and ensures all updates to @work made
  	 * here are visible to and precede any updates by the next PENDING
  	 * owner.
  	 */
  	smp_wmb();
7c3eed5cd   Tejun Heo   workqueue: record...
595
  	set_work_data(work, (unsigned long)pool_id << WORK_OFFQ_POOL_SHIFT, 0);
7a22ad757   Tejun Heo   workqueue: carry ...
596
  }
f756d5e25   Nathan Lynch   [PATCH] fix workq...
597

7a22ad757   Tejun Heo   workqueue: carry ...
598
  static void clear_work_data(struct work_struct *work)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
599
  {
7c3eed5cd   Tejun Heo   workqueue: record...
600
601
  	smp_wmb();	/* see set_work_pool_and_clear_pending() */
  	set_work_data(work, WORK_STRUCT_NO_POOL, 0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
602
  }
112202d90   Tejun Heo   workqueue: rename...
603
  static struct pool_workqueue *get_work_pwq(struct work_struct *work)
b1f4ec172   Oleg Nesterov   workqueue: introd...
604
  {
e120153dd   Tejun Heo   workqueue: fix ho...
605
  	unsigned long data = atomic_long_read(&work->data);
7a22ad757   Tejun Heo   workqueue: carry ...
606

112202d90   Tejun Heo   workqueue: rename...
607
  	if (data & WORK_STRUCT_PWQ)
e120153dd   Tejun Heo   workqueue: fix ho...
608
609
610
  		return (void *)(data & WORK_STRUCT_WQ_DATA_MASK);
  	else
  		return NULL;
4d707b9f4   Oleg Nesterov   workqueue: change...
611
  }
7c3eed5cd   Tejun Heo   workqueue: record...
612
613
614
615
  /**
   * get_work_pool - return the worker_pool a given work was associated with
   * @work: the work item of interest
   *
68e13a67d   Lai Jiangshan   workqueue: rename...
616
617
618
   * Pools are created and destroyed under wq_pool_mutex, and allows read
   * access under sched-RCU read lock.  As such, this function should be
   * called under wq_pool_mutex or with preemption disabled.
fa1b54e69   Tejun Heo   workqueue: update...
619
620
621
622
623
   *
   * All fields of the returned pool are accessible as long as the above
   * mentioned locking is in effect.  If the returned pool needs to be used
   * beyond the critical section, the caller is responsible for ensuring the
   * returned pool is and stays online.
d185af300   Yacine Belkadi   workqueue: fix so...
624
625
   *
   * Return: The worker_pool @work was last associated with.  %NULL if none.
7c3eed5cd   Tejun Heo   workqueue: record...
626
627
   */
  static struct worker_pool *get_work_pool(struct work_struct *work)
365970a1e   David Howells   WorkStruct: Merge...
628
  {
e120153dd   Tejun Heo   workqueue: fix ho...
629
  	unsigned long data = atomic_long_read(&work->data);
7c3eed5cd   Tejun Heo   workqueue: record...
630
  	int pool_id;
7a22ad757   Tejun Heo   workqueue: carry ...
631

68e13a67d   Lai Jiangshan   workqueue: rename...
632
  	assert_rcu_or_pool_mutex();
fa1b54e69   Tejun Heo   workqueue: update...
633

112202d90   Tejun Heo   workqueue: rename...
634
635
  	if (data & WORK_STRUCT_PWQ)
  		return ((struct pool_workqueue *)
7c3eed5cd   Tejun Heo   workqueue: record...
636
  			(data & WORK_STRUCT_WQ_DATA_MASK))->pool;
7a22ad757   Tejun Heo   workqueue: carry ...
637

7c3eed5cd   Tejun Heo   workqueue: record...
638
639
  	pool_id = data >> WORK_OFFQ_POOL_SHIFT;
  	if (pool_id == WORK_OFFQ_POOL_NONE)
7a22ad757   Tejun Heo   workqueue: carry ...
640
  		return NULL;
fa1b54e69   Tejun Heo   workqueue: update...
641
  	return idr_find(&worker_pool_idr, pool_id);
7c3eed5cd   Tejun Heo   workqueue: record...
642
643
644
645
646
647
  }
  
  /**
   * get_work_pool_id - return the worker pool ID a given work is associated with
   * @work: the work item of interest
   *
d185af300   Yacine Belkadi   workqueue: fix so...
648
   * Return: The worker_pool ID @work was last associated with.
7c3eed5cd   Tejun Heo   workqueue: record...
649
650
651
652
   * %WORK_OFFQ_POOL_NONE if none.
   */
  static int get_work_pool_id(struct work_struct *work)
  {
54d5b7d07   Lai Jiangshan   workqueue: make g...
653
  	unsigned long data = atomic_long_read(&work->data);
112202d90   Tejun Heo   workqueue: rename...
654
655
  	if (data & WORK_STRUCT_PWQ)
  		return ((struct pool_workqueue *)
54d5b7d07   Lai Jiangshan   workqueue: make g...
656
  			(data & WORK_STRUCT_WQ_DATA_MASK))->pool->id;
7c3eed5cd   Tejun Heo   workqueue: record...
657

54d5b7d07   Lai Jiangshan   workqueue: make g...
658
  	return data >> WORK_OFFQ_POOL_SHIFT;
7c3eed5cd   Tejun Heo   workqueue: record...
659
  }
bbb68dfab   Tejun Heo   workqueue: mark a...
660
661
  static void mark_work_canceling(struct work_struct *work)
  {
7c3eed5cd   Tejun Heo   workqueue: record...
662
  	unsigned long pool_id = get_work_pool_id(work);
bbb68dfab   Tejun Heo   workqueue: mark a...
663

7c3eed5cd   Tejun Heo   workqueue: record...
664
665
  	pool_id <<= WORK_OFFQ_POOL_SHIFT;
  	set_work_data(work, pool_id | WORK_OFFQ_CANCELING, WORK_STRUCT_PENDING);
bbb68dfab   Tejun Heo   workqueue: mark a...
666
667
668
669
670
  }
  
  static bool work_is_canceling(struct work_struct *work)
  {
  	unsigned long data = atomic_long_read(&work->data);
112202d90   Tejun Heo   workqueue: rename...
671
  	return !(data & WORK_STRUCT_PWQ) && (data & WORK_OFFQ_CANCELING);
bbb68dfab   Tejun Heo   workqueue: mark a...
672
  }
e22bee782   Tejun Heo   workqueue: implem...
673
  /*
3270476a6   Tejun Heo   workqueue: reimpl...
674
675
   * Policy functions.  These define the policies on how the global worker
   * pools are managed.  Unless noted otherwise, these functions assume that
d565ed630   Tejun Heo   workqueue: move g...
676
   * they're being called with pool->lock held.
e22bee782   Tejun Heo   workqueue: implem...
677
   */
63d95a915   Tejun Heo   workqueue: use @p...
678
  static bool __need_more_worker(struct worker_pool *pool)
a848e3b67   Oleg Nesterov   workqueue: introd...
679
  {
e19e397a8   Tejun Heo   workqueue: move n...
680
  	return !atomic_read(&pool->nr_running);
a848e3b67   Oleg Nesterov   workqueue: introd...
681
  }
4594bf159   David Howells   [PATCH] WorkStruc...
682
  /*
e22bee782   Tejun Heo   workqueue: implem...
683
684
   * Need to wake up a worker?  Called from anything but currently
   * running workers.
974271c48   Tejun Heo   workqueue: don't ...
685
686
   *
   * Note that, because unbound workers never contribute to nr_running, this
706026c21   Tejun Heo   workqueue: post g...
687
   * function will always return %true for unbound pools as long as the
974271c48   Tejun Heo   workqueue: don't ...
688
   * worklist isn't empty.
4594bf159   David Howells   [PATCH] WorkStruc...
689
   */
63d95a915   Tejun Heo   workqueue: use @p...
690
  static bool need_more_worker(struct worker_pool *pool)
365970a1e   David Howells   WorkStruct: Merge...
691
  {
63d95a915   Tejun Heo   workqueue: use @p...
692
  	return !list_empty(&pool->worklist) && __need_more_worker(pool);
e22bee782   Tejun Heo   workqueue: implem...
693
  }
4594bf159   David Howells   [PATCH] WorkStruc...
694

e22bee782   Tejun Heo   workqueue: implem...
695
  /* Can I start working?  Called from busy but !running workers. */
63d95a915   Tejun Heo   workqueue: use @p...
696
  static bool may_start_working(struct worker_pool *pool)
e22bee782   Tejun Heo   workqueue: implem...
697
  {
63d95a915   Tejun Heo   workqueue: use @p...
698
  	return pool->nr_idle;
e22bee782   Tejun Heo   workqueue: implem...
699
700
701
  }
  
  /* Do I need to keep working?  Called from currently running workers. */
63d95a915   Tejun Heo   workqueue: use @p...
702
  static bool keep_working(struct worker_pool *pool)
e22bee782   Tejun Heo   workqueue: implem...
703
  {
e19e397a8   Tejun Heo   workqueue: move n...
704
705
  	return !list_empty(&pool->worklist) &&
  		atomic_read(&pool->nr_running) <= 1;
e22bee782   Tejun Heo   workqueue: implem...
706
707
708
  }
  
  /* Do we need a new worker?  Called from manager. */
63d95a915   Tejun Heo   workqueue: use @p...
709
  static bool need_to_create_worker(struct worker_pool *pool)
e22bee782   Tejun Heo   workqueue: implem...
710
  {
63d95a915   Tejun Heo   workqueue: use @p...
711
  	return need_more_worker(pool) && !may_start_working(pool);
e22bee782   Tejun Heo   workqueue: implem...
712
  }
365970a1e   David Howells   WorkStruct: Merge...
713

e22bee782   Tejun Heo   workqueue: implem...
714
  /* Do we have too many workers and should some go away? */
63d95a915   Tejun Heo   workqueue: use @p...
715
  static bool too_many_workers(struct worker_pool *pool)
e22bee782   Tejun Heo   workqueue: implem...
716
  {
34a06bd6b   Tejun Heo   workqueue: replac...
717
  	bool managing = mutex_is_locked(&pool->manager_arb);
63d95a915   Tejun Heo   workqueue: use @p...
718
719
  	int nr_idle = pool->nr_idle + managing; /* manager is considered idle */
  	int nr_busy = pool->nr_workers - nr_idle;
e22bee782   Tejun Heo   workqueue: implem...
720
721
  
  	return nr_idle > 2 && (nr_idle - 2) * MAX_IDLE_WORKERS_RATIO >= nr_busy;
365970a1e   David Howells   WorkStruct: Merge...
722
  }
4d707b9f4   Oleg Nesterov   workqueue: change...
723
  /*
e22bee782   Tejun Heo   workqueue: implem...
724
725
   * Wake up functions.
   */
1037de36e   Lai Jiangshan   workqueue: rename...
726
727
  /* Return the first idle worker.  Safe with preemption disabled */
  static struct worker *first_idle_worker(struct worker_pool *pool)
7e11629d0   Tejun Heo   workqueue: use sh...
728
  {
63d95a915   Tejun Heo   workqueue: use @p...
729
  	if (unlikely(list_empty(&pool->idle_list)))
7e11629d0   Tejun Heo   workqueue: use sh...
730
  		return NULL;
63d95a915   Tejun Heo   workqueue: use @p...
731
  	return list_first_entry(&pool->idle_list, struct worker, entry);
7e11629d0   Tejun Heo   workqueue: use sh...
732
733
734
735
  }
  
  /**
   * wake_up_worker - wake up an idle worker
63d95a915   Tejun Heo   workqueue: use @p...
736
   * @pool: worker pool to wake worker from
7e11629d0   Tejun Heo   workqueue: use sh...
737
   *
63d95a915   Tejun Heo   workqueue: use @p...
738
   * Wake up the first idle worker of @pool.
7e11629d0   Tejun Heo   workqueue: use sh...
739
740
   *
   * CONTEXT:
d565ed630   Tejun Heo   workqueue: move g...
741
   * spin_lock_irq(pool->lock).
7e11629d0   Tejun Heo   workqueue: use sh...
742
   */
63d95a915   Tejun Heo   workqueue: use @p...
743
  static void wake_up_worker(struct worker_pool *pool)
7e11629d0   Tejun Heo   workqueue: use sh...
744
  {
1037de36e   Lai Jiangshan   workqueue: rename...
745
  	struct worker *worker = first_idle_worker(pool);
7e11629d0   Tejun Heo   workqueue: use sh...
746
747
748
749
  
  	if (likely(worker))
  		wake_up_process(worker->task);
  }
4690c4ab5   Tejun Heo   workqueue: misc/c...
750
  /**
e22bee782   Tejun Heo   workqueue: implem...
751
752
753
754
755
756
757
758
759
760
   * 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)
   */
d84ff0512   Tejun Heo   workqueue: consis...
761
  void wq_worker_waking_up(struct task_struct *task, int cpu)
e22bee782   Tejun Heo   workqueue: implem...
762
763
  {
  	struct worker *worker = kthread_data(task);
365760004   Joonsoo Kim   workqueue: add WA...
764
  	if (!(worker->flags & WORKER_NOT_RUNNING)) {
ec22ca5ea   Tejun Heo   workqueue: move g...
765
  		WARN_ON_ONCE(worker->pool->cpu != cpu);
e19e397a8   Tejun Heo   workqueue: move n...
766
  		atomic_inc(&worker->pool->nr_running);
365760004   Joonsoo Kim   workqueue: add WA...
767
  	}
e22bee782   Tejun Heo   workqueue: implem...
768
769
770
771
772
773
774
775
776
777
778
779
780
781
  }
  
  /**
   * 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)
   *
d185af300   Yacine Belkadi   workqueue: fix so...
782
   * Return:
e22bee782   Tejun Heo   workqueue: implem...
783
784
   * Worker task on @cpu to wake up, %NULL if none.
   */
d84ff0512   Tejun Heo   workqueue: consis...
785
  struct task_struct *wq_worker_sleeping(struct task_struct *task, int cpu)
e22bee782   Tejun Heo   workqueue: implem...
786
787
  {
  	struct worker *worker = kthread_data(task), *to_wakeup = NULL;
111c225a5   Tejun Heo   workqueue: set PF...
788
  	struct worker_pool *pool;
e22bee782   Tejun Heo   workqueue: implem...
789

111c225a5   Tejun Heo   workqueue: set PF...
790
791
792
793
794
  	/*
  	 * Rescuers, which may not have all the fields set up like normal
  	 * workers, also reach here, let's not access anything before
  	 * checking NOT_RUNNING.
  	 */
2d64672ed   Steven Rostedt   workqueue: It is ...
795
  	if (worker->flags & WORKER_NOT_RUNNING)
e22bee782   Tejun Heo   workqueue: implem...
796
  		return NULL;
111c225a5   Tejun Heo   workqueue: set PF...
797
  	pool = worker->pool;
111c225a5   Tejun Heo   workqueue: set PF...
798

e22bee782   Tejun Heo   workqueue: implem...
799
  	/* this can only happen on the local cpu */
92b69f509   Lai Jiangshan   workqueue: sanity...
800
  	if (WARN_ON_ONCE(cpu != raw_smp_processor_id() || pool->cpu != cpu))
6183c009f   Tejun Heo   workqueue: make s...
801
  		return NULL;
e22bee782   Tejun Heo   workqueue: implem...
802
803
804
805
806
807
  
  	/*
  	 * The counterpart of the following dec_and_test, implied mb,
  	 * worklist not empty test sequence is in insert_work().
  	 * Please read comment there.
  	 *
628c78e7e   Tejun Heo   workqueue: remove...
808
809
810
  	 * NOT_RUNNING is clear.  This means that we're bound to and
  	 * running on the local cpu w/ rq lock held and preemption
  	 * disabled, which in turn means that none else could be
d565ed630   Tejun Heo   workqueue: move g...
811
  	 * manipulating idle_list, so dereferencing idle_list without pool
628c78e7e   Tejun Heo   workqueue: remove...
812
  	 * lock is safe.
e22bee782   Tejun Heo   workqueue: implem...
813
  	 */
e19e397a8   Tejun Heo   workqueue: move n...
814
815
  	if (atomic_dec_and_test(&pool->nr_running) &&
  	    !list_empty(&pool->worklist))
1037de36e   Lai Jiangshan   workqueue: rename...
816
  		to_wakeup = first_idle_worker(pool);
e22bee782   Tejun Heo   workqueue: implem...
817
818
819
820
821
  	return to_wakeup ? to_wakeup->task : NULL;
  }
  
  /**
   * worker_set_flags - set worker flags and adjust nr_running accordingly
cb4447669   Tejun Heo   workqueue: use wo...
822
   * @worker: self
d302f0178   Tejun Heo   workqueue: implem...
823
   * @flags: flags to set
d302f0178   Tejun Heo   workqueue: implem...
824
   *
228f1d001   Lai Jiangshan   workqueue: remove...
825
   * Set @flags in @worker->flags and adjust nr_running accordingly.
d302f0178   Tejun Heo   workqueue: implem...
826
   *
cb4447669   Tejun Heo   workqueue: use wo...
827
   * CONTEXT:
d565ed630   Tejun Heo   workqueue: move g...
828
   * spin_lock_irq(pool->lock)
d302f0178   Tejun Heo   workqueue: implem...
829
   */
228f1d001   Lai Jiangshan   workqueue: remove...
830
  static inline void worker_set_flags(struct worker *worker, unsigned int flags)
d302f0178   Tejun Heo   workqueue: implem...
831
  {
bd7bdd43d   Tejun Heo   workqueue: factor...
832
  	struct worker_pool *pool = worker->pool;
e22bee782   Tejun Heo   workqueue: implem...
833

cb4447669   Tejun Heo   workqueue: use wo...
834
  	WARN_ON_ONCE(worker->task != current);
228f1d001   Lai Jiangshan   workqueue: remove...
835
  	/* If transitioning into NOT_RUNNING, adjust nr_running. */
e22bee782   Tejun Heo   workqueue: implem...
836
837
  	if ((flags & WORKER_NOT_RUNNING) &&
  	    !(worker->flags & WORKER_NOT_RUNNING)) {
228f1d001   Lai Jiangshan   workqueue: remove...
838
  		atomic_dec(&pool->nr_running);
e22bee782   Tejun Heo   workqueue: implem...
839
  	}
d302f0178   Tejun Heo   workqueue: implem...
840
841
842
843
  	worker->flags |= flags;
  }
  
  /**
e22bee782   Tejun Heo   workqueue: implem...
844
   * worker_clr_flags - clear worker flags and adjust nr_running accordingly
cb4447669   Tejun Heo   workqueue: use wo...
845
   * @worker: self
d302f0178   Tejun Heo   workqueue: implem...
846
847
   * @flags: flags to clear
   *
e22bee782   Tejun Heo   workqueue: implem...
848
   * Clear @flags in @worker->flags and adjust nr_running accordingly.
d302f0178   Tejun Heo   workqueue: implem...
849
   *
cb4447669   Tejun Heo   workqueue: use wo...
850
   * CONTEXT:
d565ed630   Tejun Heo   workqueue: move g...
851
   * spin_lock_irq(pool->lock)
d302f0178   Tejun Heo   workqueue: implem...
852
853
854
   */
  static inline void worker_clr_flags(struct worker *worker, unsigned int flags)
  {
63d95a915   Tejun Heo   workqueue: use @p...
855
  	struct worker_pool *pool = worker->pool;
e22bee782   Tejun Heo   workqueue: implem...
856
  	unsigned int oflags = worker->flags;
cb4447669   Tejun Heo   workqueue: use wo...
857
  	WARN_ON_ONCE(worker->task != current);
d302f0178   Tejun Heo   workqueue: implem...
858
  	worker->flags &= ~flags;
e22bee782   Tejun Heo   workqueue: implem...
859

42c025f3d   Tejun Heo   workqueue: note t...
860
861
862
863
864
  	/*
  	 * 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...
865
866
  	if ((flags & WORKER_NOT_RUNNING) && (oflags & WORKER_NOT_RUNNING))
  		if (!(worker->flags & WORKER_NOT_RUNNING))
e19e397a8   Tejun Heo   workqueue: move n...
867
  			atomic_inc(&pool->nr_running);
d302f0178   Tejun Heo   workqueue: implem...
868
869
870
  }
  
  /**
8cca0eea3   Tejun Heo   workqueue: add fi...
871
   * find_worker_executing_work - find worker which is executing a work
c9e7cf273   Tejun Heo   workqueue: move b...
872
   * @pool: pool of interest
8cca0eea3   Tejun Heo   workqueue: add fi...
873
874
   * @work: work to find worker for
   *
c9e7cf273   Tejun Heo   workqueue: move b...
875
876
   * Find a worker which is executing @work on @pool by searching
   * @pool->busy_hash which is keyed by the address of @work.  For a worker
a2c1c57be   Tejun Heo   workqueue: consid...
877
878
879
880
881
882
883
884
885
886
887
888
   * to match, its current execution should match the address of @work and
   * its work function.  This is to avoid unwanted dependency between
   * unrelated work executions through a work item being recycled while still
   * being executed.
   *
   * This is a bit tricky.  A work item may be freed once its execution
   * starts and nothing prevents the freed area from being recycled for
   * another work item.  If the same work item address ends up being reused
   * before the original execution finishes, workqueue will identify the
   * recycled work item as currently executing and make it wait until the
   * current execution finishes, introducing an unwanted dependency.
   *
c5aa87bbf   Tejun Heo   workqueue: update...
889
890
891
892
893
894
   * This function checks the work item address and work function to avoid
   * false positives.  Note that this isn't complete as one may construct a
   * work function which can introduce dependency onto itself through a
   * recycled work item.  Well, if somebody wants to shoot oneself in the
   * foot that badly, there's only so much we can do, and if such deadlock
   * actually occurs, it should be easy to locate the culprit work function.
8cca0eea3   Tejun Heo   workqueue: add fi...
895
896
   *
   * CONTEXT:
d565ed630   Tejun Heo   workqueue: move g...
897
   * spin_lock_irq(pool->lock).
8cca0eea3   Tejun Heo   workqueue: add fi...
898
   *
d185af300   Yacine Belkadi   workqueue: fix so...
899
900
   * Return:
   * Pointer to worker which is executing @work if found, %NULL
8cca0eea3   Tejun Heo   workqueue: add fi...
901
   * otherwise.
4d707b9f4   Oleg Nesterov   workqueue: change...
902
   */
c9e7cf273   Tejun Heo   workqueue: move b...
903
  static struct worker *find_worker_executing_work(struct worker_pool *pool,
8cca0eea3   Tejun Heo   workqueue: add fi...
904
  						 struct work_struct *work)
4d707b9f4   Oleg Nesterov   workqueue: change...
905
  {
42f8570f4   Sasha Levin   workqueue: use ne...
906
  	struct worker *worker;
42f8570f4   Sasha Levin   workqueue: use ne...
907

b67bfe0d4   Sasha Levin   hlist: drop the n...
908
  	hash_for_each_possible(pool->busy_hash, worker, hentry,
a2c1c57be   Tejun Heo   workqueue: consid...
909
910
911
  			       (unsigned long)work)
  		if (worker->current_work == work &&
  		    worker->current_func == work->func)
42f8570f4   Sasha Levin   workqueue: use ne...
912
913
914
  			return worker;
  
  	return NULL;
4d707b9f4   Oleg Nesterov   workqueue: change...
915
  }
8cca0eea3   Tejun Heo   workqueue: add fi...
916
  /**
bf4ede014   Tejun Heo   workqueue: move t...
917
918
919
920
921
922
923
924
925
926
927
928
929
930
   * 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:
d565ed630   Tejun Heo   workqueue: move g...
931
   * spin_lock_irq(pool->lock).
bf4ede014   Tejun Heo   workqueue: move t...
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
   */
  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;
  }
8864b4e59   Tejun Heo   workqueue: implem...
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
  /**
   * get_pwq - get an extra reference on the specified pool_workqueue
   * @pwq: pool_workqueue to get
   *
   * Obtain an extra reference on @pwq.  The caller should guarantee that
   * @pwq has positive refcnt and be holding the matching pool->lock.
   */
  static void get_pwq(struct pool_workqueue *pwq)
  {
  	lockdep_assert_held(&pwq->pool->lock);
  	WARN_ON_ONCE(pwq->refcnt <= 0);
  	pwq->refcnt++;
  }
  
  /**
   * put_pwq - put a pool_workqueue reference
   * @pwq: pool_workqueue to put
   *
   * Drop a reference of @pwq.  If its refcnt reaches zero, schedule its
   * destruction.  The caller should be holding the matching pool->lock.
   */
  static void put_pwq(struct pool_workqueue *pwq)
  {
  	lockdep_assert_held(&pwq->pool->lock);
  	if (likely(--pwq->refcnt))
  		return;
  	if (WARN_ON_ONCE(!(pwq->wq->flags & WQ_UNBOUND)))
  		return;
  	/*
  	 * @pwq can't be released under pool->lock, bounce to
  	 * pwq_unbound_release_workfn().  This never recurses on the same
  	 * pool->lock as this path is taken only for unbound workqueues and
  	 * the release work item is scheduled on a per-cpu workqueue.  To
  	 * avoid lockdep warning, unbound pool->locks are given lockdep
  	 * subclass of 1 in get_unbound_pool().
  	 */
  	schedule_work(&pwq->unbound_release_work);
  }
dce90d47c   Tejun Heo   workqueue: introd...
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
  /**
   * put_pwq_unlocked - put_pwq() with surrounding pool lock/unlock
   * @pwq: pool_workqueue to put (can be %NULL)
   *
   * put_pwq() with locking.  This function also allows %NULL @pwq.
   */
  static void put_pwq_unlocked(struct pool_workqueue *pwq)
  {
  	if (pwq) {
  		/*
  		 * As both pwqs and pools are sched-RCU protected, the
  		 * following lock operations are safe.
  		 */
  		spin_lock_irq(&pwq->pool->lock);
  		put_pwq(pwq);
  		spin_unlock_irq(&pwq->pool->lock);
  	}
  }
112202d90   Tejun Heo   workqueue: rename...
1012
  static void pwq_activate_delayed_work(struct work_struct *work)
bf4ede014   Tejun Heo   workqueue: move t...
1013
  {
112202d90   Tejun Heo   workqueue: rename...
1014
  	struct pool_workqueue *pwq = get_work_pwq(work);
bf4ede014   Tejun Heo   workqueue: move t...
1015
1016
  
  	trace_workqueue_activate_work(work);
112202d90   Tejun Heo   workqueue: rename...
1017
  	move_linked_works(work, &pwq->pool->worklist, NULL);
bf4ede014   Tejun Heo   workqueue: move t...
1018
  	__clear_bit(WORK_STRUCT_DELAYED_BIT, work_data_bits(work));
112202d90   Tejun Heo   workqueue: rename...
1019
  	pwq->nr_active++;
bf4ede014   Tejun Heo   workqueue: move t...
1020
  }
112202d90   Tejun Heo   workqueue: rename...
1021
  static void pwq_activate_first_delayed(struct pool_workqueue *pwq)
3aa624975   Lai Jiangshan   workqueue: fix po...
1022
  {
112202d90   Tejun Heo   workqueue: rename...
1023
  	struct work_struct *work = list_first_entry(&pwq->delayed_works,
3aa624975   Lai Jiangshan   workqueue: fix po...
1024
  						    struct work_struct, entry);
112202d90   Tejun Heo   workqueue: rename...
1025
  	pwq_activate_delayed_work(work);
3aa624975   Lai Jiangshan   workqueue: fix po...
1026
  }
bf4ede014   Tejun Heo   workqueue: move t...
1027
  /**
112202d90   Tejun Heo   workqueue: rename...
1028
1029
   * pwq_dec_nr_in_flight - decrement pwq's nr_in_flight
   * @pwq: pwq of interest
bf4ede014   Tejun Heo   workqueue: move t...
1030
   * @color: color of work which left the queue
bf4ede014   Tejun Heo   workqueue: move t...
1031
1032
   *
   * A work either has completed or is removed from pending queue,
112202d90   Tejun Heo   workqueue: rename...
1033
   * decrement nr_in_flight of its pwq and handle workqueue flushing.
bf4ede014   Tejun Heo   workqueue: move t...
1034
1035
   *
   * CONTEXT:
d565ed630   Tejun Heo   workqueue: move g...
1036
   * spin_lock_irq(pool->lock).
bf4ede014   Tejun Heo   workqueue: move t...
1037
   */
112202d90   Tejun Heo   workqueue: rename...
1038
  static void pwq_dec_nr_in_flight(struct pool_workqueue *pwq, int color)
bf4ede014   Tejun Heo   workqueue: move t...
1039
  {
8864b4e59   Tejun Heo   workqueue: implem...
1040
  	/* uncolored work items don't participate in flushing or nr_active */
bf4ede014   Tejun Heo   workqueue: move t...
1041
  	if (color == WORK_NO_COLOR)
8864b4e59   Tejun Heo   workqueue: implem...
1042
  		goto out_put;
bf4ede014   Tejun Heo   workqueue: move t...
1043

112202d90   Tejun Heo   workqueue: rename...
1044
  	pwq->nr_in_flight[color]--;
bf4ede014   Tejun Heo   workqueue: move t...
1045

112202d90   Tejun Heo   workqueue: rename...
1046
1047
  	pwq->nr_active--;
  	if (!list_empty(&pwq->delayed_works)) {
b3f9f405a   Lai Jiangshan   workqueue: remove...
1048
  		/* one down, submit a delayed one */
112202d90   Tejun Heo   workqueue: rename...
1049
1050
  		if (pwq->nr_active < pwq->max_active)
  			pwq_activate_first_delayed(pwq);
bf4ede014   Tejun Heo   workqueue: move t...
1051
1052
1053
  	}
  
  	/* is flush in progress and are we at the flushing tip? */
112202d90   Tejun Heo   workqueue: rename...
1054
  	if (likely(pwq->flush_color != color))
8864b4e59   Tejun Heo   workqueue: implem...
1055
  		goto out_put;
bf4ede014   Tejun Heo   workqueue: move t...
1056
1057
  
  	/* are there still in-flight works? */
112202d90   Tejun Heo   workqueue: rename...
1058
  	if (pwq->nr_in_flight[color])
8864b4e59   Tejun Heo   workqueue: implem...
1059
  		goto out_put;
bf4ede014   Tejun Heo   workqueue: move t...
1060

112202d90   Tejun Heo   workqueue: rename...
1061
1062
  	/* this pwq is done, clear flush_color */
  	pwq->flush_color = -1;
bf4ede014   Tejun Heo   workqueue: move t...
1063
1064
  
  	/*
112202d90   Tejun Heo   workqueue: rename...
1065
  	 * If this was the last pwq, wake up the first flusher.  It
bf4ede014   Tejun Heo   workqueue: move t...
1066
1067
  	 * will handle the rest.
  	 */
112202d90   Tejun Heo   workqueue: rename...
1068
1069
  	if (atomic_dec_and_test(&pwq->wq->nr_pwqs_to_flush))
  		complete(&pwq->wq->first_flusher->done);
8864b4e59   Tejun Heo   workqueue: implem...
1070
1071
  out_put:
  	put_pwq(pwq);
bf4ede014   Tejun Heo   workqueue: move t...
1072
  }
36e227d24   Tejun Heo   workqueue: reorga...
1073
  /**
bbb68dfab   Tejun Heo   workqueue: mark a...
1074
   * try_to_grab_pending - steal work item from worklist and disable irq
36e227d24   Tejun Heo   workqueue: reorga...
1075
1076
   * @work: work item to steal
   * @is_dwork: @work is a delayed_work
bbb68dfab   Tejun Heo   workqueue: mark a...
1077
   * @flags: place to store irq state
36e227d24   Tejun Heo   workqueue: reorga...
1078
1079
   *
   * Try to grab PENDING bit of @work.  This function can handle @work in any
d185af300   Yacine Belkadi   workqueue: fix so...
1080
   * stable state - idle, on timer or on worklist.
36e227d24   Tejun Heo   workqueue: reorga...
1081
   *
d185af300   Yacine Belkadi   workqueue: fix so...
1082
   * Return:
36e227d24   Tejun Heo   workqueue: reorga...
1083
1084
1085
   *  1		if @work was pending and we successfully stole PENDING
   *  0		if @work was idle and we claimed PENDING
   *  -EAGAIN	if PENDING couldn't be grabbed at the moment, safe to busy-retry
bbb68dfab   Tejun Heo   workqueue: mark a...
1086
1087
   *  -ENOENT	if someone else is canceling @work, this state may persist
   *		for arbitrarily long
36e227d24   Tejun Heo   workqueue: reorga...
1088
   *
d185af300   Yacine Belkadi   workqueue: fix so...
1089
   * Note:
bbb68dfab   Tejun Heo   workqueue: mark a...
1090
   * On >= 0 return, the caller owns @work's PENDING bit.  To avoid getting
e0aecdd87   Tejun Heo   workqueue: use ir...
1091
1092
1093
   * interrupted while holding PENDING and @work off queue, irq must be
   * disabled on entry.  This, combined with delayed_work->timer being
   * irqsafe, ensures that we return -EAGAIN for finite short period of time.
bbb68dfab   Tejun Heo   workqueue: mark a...
1094
1095
1096
1097
   *
   * On successful return, >= 0, irq is disabled and the caller is
   * responsible for releasing it using local_irq_restore(*@flags).
   *
e0aecdd87   Tejun Heo   workqueue: use ir...
1098
   * This function is safe to call from any context including IRQ handler.
bf4ede014   Tejun Heo   workqueue: move t...
1099
   */
bbb68dfab   Tejun Heo   workqueue: mark a...
1100
1101
  static int try_to_grab_pending(struct work_struct *work, bool is_dwork,
  			       unsigned long *flags)
bf4ede014   Tejun Heo   workqueue: move t...
1102
  {
d565ed630   Tejun Heo   workqueue: move g...
1103
  	struct worker_pool *pool;
112202d90   Tejun Heo   workqueue: rename...
1104
  	struct pool_workqueue *pwq;
bf4ede014   Tejun Heo   workqueue: move t...
1105

bbb68dfab   Tejun Heo   workqueue: mark a...
1106
  	local_irq_save(*flags);
36e227d24   Tejun Heo   workqueue: reorga...
1107
1108
1109
  	/* try to steal the timer if it exists */
  	if (is_dwork) {
  		struct delayed_work *dwork = to_delayed_work(work);
e0aecdd87   Tejun Heo   workqueue: use ir...
1110
1111
1112
1113
1114
  		/*
  		 * dwork->timer is irqsafe.  If del_timer() fails, it's
  		 * guaranteed that the timer is not queued anywhere and not
  		 * running on the local CPU.
  		 */
36e227d24   Tejun Heo   workqueue: reorga...
1115
1116
1117
1118
1119
  		if (likely(del_timer(&dwork->timer)))
  			return 1;
  	}
  
  	/* try to claim PENDING the normal way */
bf4ede014   Tejun Heo   workqueue: move t...
1120
1121
1122
1123
1124
1125
1126
  	if (!test_and_set_bit(WORK_STRUCT_PENDING_BIT, work_data_bits(work)))
  		return 0;
  
  	/*
  	 * The queueing is in progress, or it is already queued. Try to
  	 * steal it from ->worklist without clearing WORK_STRUCT_PENDING.
  	 */
d565ed630   Tejun Heo   workqueue: move g...
1127
1128
  	pool = get_work_pool(work);
  	if (!pool)
bbb68dfab   Tejun Heo   workqueue: mark a...
1129
  		goto fail;
bf4ede014   Tejun Heo   workqueue: move t...
1130

d565ed630   Tejun Heo   workqueue: move g...
1131
  	spin_lock(&pool->lock);
0b3dae68a   Lai Jiangshan   workqueue: simpli...
1132
  	/*
112202d90   Tejun Heo   workqueue: rename...
1133
1134
1135
1136
1137
  	 * work->data is guaranteed to point to pwq only while the work
  	 * item is queued on pwq->wq, and both updating work->data to point
  	 * to pwq on queueing and to pool on dequeueing are done under
  	 * pwq->pool->lock.  This in turn guarantees that, if work->data
  	 * points to pwq which is associated with a locked pool, the work
0b3dae68a   Lai Jiangshan   workqueue: simpli...
1138
1139
  	 * item is currently queued on that pool.
  	 */
112202d90   Tejun Heo   workqueue: rename...
1140
1141
  	pwq = get_work_pwq(work);
  	if (pwq && pwq->pool == pool) {
160628362   Tejun Heo   workqueue: cosmet...
1142
1143
1144
1145
1146
  		debug_work_deactivate(work);
  
  		/*
  		 * A delayed work item cannot be grabbed directly because
  		 * it might have linked NO_COLOR work items which, if left
112202d90   Tejun Heo   workqueue: rename...
1147
  		 * on the delayed_list, will confuse pwq->nr_active
160628362   Tejun Heo   workqueue: cosmet...
1148
1149
1150
1151
  		 * management later on and cause stall.  Make sure the work
  		 * item is activated before grabbing.
  		 */
  		if (*work_data_bits(work) & WORK_STRUCT_DELAYED)
112202d90   Tejun Heo   workqueue: rename...
1152
  			pwq_activate_delayed_work(work);
160628362   Tejun Heo   workqueue: cosmet...
1153
1154
  
  		list_del_init(&work->entry);
9c34a7042   Lai Jiangshan   workqueue: reuse ...
1155
  		pwq_dec_nr_in_flight(pwq, get_work_color(work));
160628362   Tejun Heo   workqueue: cosmet...
1156

112202d90   Tejun Heo   workqueue: rename...
1157
  		/* work->data points to pwq iff queued, point to pool */
160628362   Tejun Heo   workqueue: cosmet...
1158
1159
1160
1161
  		set_work_pool_and_keep_pending(work, pool->id);
  
  		spin_unlock(&pool->lock);
  		return 1;
bf4ede014   Tejun Heo   workqueue: move t...
1162
  	}
d565ed630   Tejun Heo   workqueue: move g...
1163
  	spin_unlock(&pool->lock);
bbb68dfab   Tejun Heo   workqueue: mark a...
1164
1165
1166
1167
1168
  fail:
  	local_irq_restore(*flags);
  	if (work_is_canceling(work))
  		return -ENOENT;
  	cpu_relax();
36e227d24   Tejun Heo   workqueue: reorga...
1169
  	return -EAGAIN;
bf4ede014   Tejun Heo   workqueue: move t...
1170
1171
1172
  }
  
  /**
706026c21   Tejun Heo   workqueue: post g...
1173
   * insert_work - insert a work into a pool
112202d90   Tejun Heo   workqueue: rename...
1174
   * @pwq: pwq @work belongs to
4690c4ab5   Tejun Heo   workqueue: misc/c...
1175
1176
1177
1178
   * @work: work to insert
   * @head: insertion point
   * @extra_flags: extra WORK_STRUCT_* flags to set
   *
112202d90   Tejun Heo   workqueue: rename...
1179
   * Insert @work which belongs to @pwq after @head.  @extra_flags is or'd to
706026c21   Tejun Heo   workqueue: post g...
1180
   * work_struct flags.
4690c4ab5   Tejun Heo   workqueue: misc/c...
1181
1182
   *
   * CONTEXT:
d565ed630   Tejun Heo   workqueue: move g...
1183
   * spin_lock_irq(pool->lock).
4690c4ab5   Tejun Heo   workqueue: misc/c...
1184
   */
112202d90   Tejun Heo   workqueue: rename...
1185
1186
  static void insert_work(struct pool_workqueue *pwq, struct work_struct *work,
  			struct list_head *head, unsigned int extra_flags)
b89deed32   Oleg Nesterov   implement flush_w...
1187
  {
112202d90   Tejun Heo   workqueue: rename...
1188
  	struct worker_pool *pool = pwq->pool;
e22bee782   Tejun Heo   workqueue: implem...
1189

4690c4ab5   Tejun Heo   workqueue: misc/c...
1190
  	/* we own @work, set data and link */
112202d90   Tejun Heo   workqueue: rename...
1191
  	set_work_pwq(work, pwq, extra_flags);
1a4d9b0aa   Oleg Nesterov   workqueues: inser...
1192
  	list_add_tail(&work->entry, head);
8864b4e59   Tejun Heo   workqueue: implem...
1193
  	get_pwq(pwq);
e22bee782   Tejun Heo   workqueue: implem...
1194
1195
  
  	/*
c5aa87bbf   Tejun Heo   workqueue: update...
1196
1197
1198
  	 * Ensure either wq_worker_sleeping() 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.
e22bee782   Tejun Heo   workqueue: implem...
1199
1200
  	 */
  	smp_mb();
63d95a915   Tejun Heo   workqueue: use @p...
1201
1202
  	if (__need_more_worker(pool))
  		wake_up_worker(pool);
b89deed32   Oleg Nesterov   implement flush_w...
1203
  }
c8efcc258   Tejun Heo   workqueue: allow ...
1204
1205
  /*
   * Test whether @work is being queued from another work executing on the
8d03ecfe4   Tejun Heo   workqueue: reimpl...
1206
   * same workqueue.
c8efcc258   Tejun Heo   workqueue: allow ...
1207
1208
1209
   */
  static bool is_chained_work(struct workqueue_struct *wq)
  {
8d03ecfe4   Tejun Heo   workqueue: reimpl...
1210
1211
1212
1213
1214
1215
1216
  	struct worker *worker;
  
  	worker = current_wq_worker();
  	/*
  	 * Return %true iff I'm a worker execuing a work item on @wq.  If
  	 * I'm @worker, it's safe to dereference it without locking.
  	 */
112202d90   Tejun Heo   workqueue: rename...
1217
  	return worker && worker->current_pwq->wq == wq;
c8efcc258   Tejun Heo   workqueue: allow ...
1218
  }
d84ff0512   Tejun Heo   workqueue: consis...
1219
  static void __queue_work(int cpu, struct workqueue_struct *wq,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1220
1221
  			 struct work_struct *work)
  {
112202d90   Tejun Heo   workqueue: rename...
1222
  	struct pool_workqueue *pwq;
c9178087a   Tejun Heo   workqueue: perfor...
1223
  	struct worker_pool *last_pool;
1e19ffc63   Tejun Heo   workqueue: implem...
1224
  	struct list_head *worklist;
8a2e8e5de   Tejun Heo   workqueue: fix cw...
1225
  	unsigned int work_flags;
b75cac936   Joonsoo Kim   workqueue: correc...
1226
  	unsigned int req_cpu = cpu;
8930caba3   Tejun Heo   workqueue: disabl...
1227
1228
1229
1230
1231
1232
1233
1234
  
  	/*
  	 * While a work item is PENDING && off queue, a task trying to
  	 * steal the PENDING will busy-loop waiting for it to either get
  	 * queued or lose PENDING.  Grabbing PENDING and queueing should
  	 * happen with IRQ disabled.
  	 */
  	WARN_ON_ONCE(!irqs_disabled());
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1235

dc186ad74   Thomas Gleixner   workqueue: Add de...
1236
  	debug_work_activate(work);
1e19ffc63   Tejun Heo   workqueue: implem...
1237

9ef28a73f   Li Bin   workqueue: fix co...
1238
  	/* if draining, only works from the same workqueue are allowed */
618b01eb4   Tejun Heo   workqueue: make i...
1239
  	if (unlikely(wq->flags & __WQ_DRAINING) &&
c8efcc258   Tejun Heo   workqueue: allow ...
1240
  	    WARN_ON_ONCE(!is_chained_work(wq)))
e41e704bc   Tejun Heo   workqueue: improv...
1241
  		return;
9e8cd2f58   Tejun Heo   workqueue: implem...
1242
  retry:
df2d5ae49   Tejun Heo   workqueue: map an...
1243
1244
  	if (req_cpu == WORK_CPU_UNBOUND)
  		cpu = raw_smp_processor_id();
c9178087a   Tejun Heo   workqueue: perfor...
1245
  	/* pwq which will be used unless @work is executing elsewhere */
df2d5ae49   Tejun Heo   workqueue: map an...
1246
  	if (!(wq->flags & WQ_UNBOUND))
7fb98ea79   Tejun Heo   workqueue: replac...
1247
  		pwq = per_cpu_ptr(wq->cpu_pwqs, cpu);
df2d5ae49   Tejun Heo   workqueue: map an...
1248
1249
  	else
  		pwq = unbound_pwq_by_node(wq, cpu_to_node(cpu));
dbf2576e3   Tejun Heo   workqueue: make a...
1250

c9178087a   Tejun Heo   workqueue: perfor...
1251
1252
1253
1254
1255
1256
1257
1258
  	/*
  	 * If @work was previously on a different pool, it might still be
  	 * running there, in which case the work needs to be queued on that
  	 * pool to guarantee non-reentrancy.
  	 */
  	last_pool = get_work_pool(work);
  	if (last_pool && last_pool != pwq->pool) {
  		struct worker *worker;
18aa9effa   Tejun Heo   workqueue: implem...
1259

c9178087a   Tejun Heo   workqueue: perfor...
1260
  		spin_lock(&last_pool->lock);
18aa9effa   Tejun Heo   workqueue: implem...
1261

c9178087a   Tejun Heo   workqueue: perfor...
1262
  		worker = find_worker_executing_work(last_pool, work);
18aa9effa   Tejun Heo   workqueue: implem...
1263

c9178087a   Tejun Heo   workqueue: perfor...
1264
1265
  		if (worker && worker->current_pwq->wq == wq) {
  			pwq = worker->current_pwq;
8930caba3   Tejun Heo   workqueue: disabl...
1266
  		} else {
c9178087a   Tejun Heo   workqueue: perfor...
1267
1268
  			/* meh... not running there, queue here */
  			spin_unlock(&last_pool->lock);
112202d90   Tejun Heo   workqueue: rename...
1269
  			spin_lock(&pwq->pool->lock);
8930caba3   Tejun Heo   workqueue: disabl...
1270
  		}
f34217977   Tejun Heo   workqueue: implem...
1271
  	} else {
112202d90   Tejun Heo   workqueue: rename...
1272
  		spin_lock(&pwq->pool->lock);
502ca9d81   Tejun Heo   workqueue: make s...
1273
  	}
9e8cd2f58   Tejun Heo   workqueue: implem...
1274
1275
1276
1277
  	/*
  	 * pwq is determined and locked.  For unbound pools, we could have
  	 * raced with pwq release and it could already be dead.  If its
  	 * refcnt is zero, repeat pwq selection.  Note that pwqs never die
df2d5ae49   Tejun Heo   workqueue: map an...
1278
1279
  	 * without another pwq replacing it in the numa_pwq_tbl or while
  	 * work items are executing on it, so the retrying is guaranteed to
9e8cd2f58   Tejun Heo   workqueue: implem...
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
  	 * make forward-progress.
  	 */
  	if (unlikely(!pwq->refcnt)) {
  		if (wq->flags & WQ_UNBOUND) {
  			spin_unlock(&pwq->pool->lock);
  			cpu_relax();
  			goto retry;
  		}
  		/* oops */
  		WARN_ONCE(true, "workqueue: per-cpu pwq for %s on cpu%d has 0 refcnt",
  			  wq->name, cpu);
  	}
112202d90   Tejun Heo   workqueue: rename...
1292
1293
  	/* pwq determined, queue */
  	trace_workqueue_queue_work(req_cpu, pwq, work);
502ca9d81   Tejun Heo   workqueue: make s...
1294

f5b2552b4   Dan Carpenter   workqueue: change...
1295
  	if (WARN_ON(!list_empty(&work->entry))) {
112202d90   Tejun Heo   workqueue: rename...
1296
  		spin_unlock(&pwq->pool->lock);
f5b2552b4   Dan Carpenter   workqueue: change...
1297
1298
  		return;
  	}
1e19ffc63   Tejun Heo   workqueue: implem...
1299

112202d90   Tejun Heo   workqueue: rename...
1300
1301
  	pwq->nr_in_flight[pwq->work_color]++;
  	work_flags = work_color_to_flags(pwq->work_color);
1e19ffc63   Tejun Heo   workqueue: implem...
1302

112202d90   Tejun Heo   workqueue: rename...
1303
  	if (likely(pwq->nr_active < pwq->max_active)) {
cdadf0097   Tejun Heo   workqueue: add qu...
1304
  		trace_workqueue_activate_work(work);
112202d90   Tejun Heo   workqueue: rename...
1305
1306
  		pwq->nr_active++;
  		worklist = &pwq->pool->worklist;
8a2e8e5de   Tejun Heo   workqueue: fix cw...
1307
1308
  	} else {
  		work_flags |= WORK_STRUCT_DELAYED;
112202d90   Tejun Heo   workqueue: rename...
1309
  		worklist = &pwq->delayed_works;
8a2e8e5de   Tejun Heo   workqueue: fix cw...
1310
  	}
1e19ffc63   Tejun Heo   workqueue: implem...
1311

112202d90   Tejun Heo   workqueue: rename...
1312
  	insert_work(pwq, work, worklist, work_flags);
1e19ffc63   Tejun Heo   workqueue: implem...
1313

112202d90   Tejun Heo   workqueue: rename...
1314
  	spin_unlock(&pwq->pool->lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1315
  }
0fcb78c22   Rolf Eike Beer   [PATCH] Add DocBo...
1316
  /**
c1a220e7a   Zhang Rui   pm: introduce new...
1317
1318
   * queue_work_on - queue work on specific cpu
   * @cpu: CPU number to execute work on
0fcb78c22   Rolf Eike Beer   [PATCH] Add DocBo...
1319
1320
1321
   * @wq: workqueue to use
   * @work: work to queue
   *
c1a220e7a   Zhang Rui   pm: introduce new...
1322
1323
   * We queue the work to a specific CPU, the caller must ensure it
   * can't go away.
d185af300   Yacine Belkadi   workqueue: fix so...
1324
1325
   *
   * Return: %false if @work was already on a queue, %true otherwise.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1326
   */
d4283e937   Tejun Heo   workqueue: make q...
1327
1328
  bool queue_work_on(int cpu, struct workqueue_struct *wq,
  		   struct work_struct *work)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1329
  {
d4283e937   Tejun Heo   workqueue: make q...
1330
  	bool ret = false;
8930caba3   Tejun Heo   workqueue: disabl...
1331
  	unsigned long flags;
ef1ca236b   Oleg Nesterov   workqueues: queue...
1332

8930caba3   Tejun Heo   workqueue: disabl...
1333
  	local_irq_save(flags);
c1a220e7a   Zhang Rui   pm: introduce new...
1334

22df02bb3   Tejun Heo   workqueue: define...
1335
  	if (!test_and_set_bit(WORK_STRUCT_PENDING_BIT, work_data_bits(work))) {
4690c4ab5   Tejun Heo   workqueue: misc/c...
1336
  		__queue_work(cpu, wq, work);
d4283e937   Tejun Heo   workqueue: make q...
1337
  		ret = true;
c1a220e7a   Zhang Rui   pm: introduce new...
1338
  	}
ef1ca236b   Oleg Nesterov   workqueues: queue...
1339

8930caba3   Tejun Heo   workqueue: disabl...
1340
  	local_irq_restore(flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1341
1342
  	return ret;
  }
ad7b1f841   Marc Dionne   workqueue: Make s...
1343
  EXPORT_SYMBOL(queue_work_on);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1344

d8e794dfd   Tejun Heo   workqueue: set de...
1345
  void delayed_work_timer_fn(unsigned long __data)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1346
  {
52bad64d9   David Howells   WorkStruct: Separ...
1347
  	struct delayed_work *dwork = (struct delayed_work *)__data;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1348

e0aecdd87   Tejun Heo   workqueue: use ir...
1349
  	/* should have been called from irqsafe timer with irq already off */
60c057bca   Lai Jiangshan   workqueue: add de...
1350
  	__queue_work(dwork->cpu, dwork->wq, &dwork->work);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1351
  }
1438ade56   Konstantin Khlebnikov   workqueue: un-GPL...
1352
  EXPORT_SYMBOL(delayed_work_timer_fn);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1353

7beb2edf4   Tejun Heo   workqueue: factor...
1354
1355
  static void __queue_delayed_work(int cpu, struct workqueue_struct *wq,
  				struct delayed_work *dwork, unsigned long delay)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1356
  {
7beb2edf4   Tejun Heo   workqueue: factor...
1357
1358
  	struct timer_list *timer = &dwork->timer;
  	struct work_struct *work = &dwork->work;
7beb2edf4   Tejun Heo   workqueue: factor...
1359
1360
1361
  
  	WARN_ON_ONCE(timer->function != delayed_work_timer_fn ||
  		     timer->data != (unsigned long)dwork);
fc4b514f2   Tejun Heo   workqueue: conver...
1362
1363
  	WARN_ON_ONCE(timer_pending(timer));
  	WARN_ON_ONCE(!list_empty(&work->entry));
7beb2edf4   Tejun Heo   workqueue: factor...
1364

8852aac25   Tejun Heo   workqueue: mod_de...
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
  	/*
  	 * If @delay is 0, queue @dwork->work immediately.  This is for
  	 * both optimization and correctness.  The earliest @timer can
  	 * expire is on the closest next tick and delayed_work users depend
  	 * on that there's no such delay when @delay is 0.
  	 */
  	if (!delay) {
  		__queue_work(cpu, wq, &dwork->work);
  		return;
  	}
7beb2edf4   Tejun Heo   workqueue: factor...
1375
  	timer_stats_timer_set_start_info(&dwork->timer);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1376

60c057bca   Lai Jiangshan   workqueue: add de...
1377
  	dwork->wq = wq;
1265057fa   Tejun Heo   workqueue: fix CP...
1378
  	dwork->cpu = cpu;
7beb2edf4   Tejun Heo   workqueue: factor...
1379
1380
1381
1382
1383
1384
  	timer->expires = jiffies + delay;
  
  	if (unlikely(cpu != WORK_CPU_UNBOUND))
  		add_timer_on(timer, cpu);
  	else
  		add_timer(timer);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1385
  }
0fcb78c22   Rolf Eike Beer   [PATCH] Add DocBo...
1386
1387
1388
1389
  /**
   * 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...
1390
   * @dwork: work to queue
0fcb78c22   Rolf Eike Beer   [PATCH] Add DocBo...
1391
1392
   * @delay: number of jiffies to wait before queueing
   *
d185af300   Yacine Belkadi   workqueue: fix so...
1393
   * Return: %false if @work was already on a queue, %true otherwise.  If
715f13008   Tejun Heo   workqueue: fix ze...
1394
1395
   * @delay is zero and @dwork is idle, it will be scheduled for immediate
   * execution.
0fcb78c22   Rolf Eike Beer   [PATCH] Add DocBo...
1396
   */
d4283e937   Tejun Heo   workqueue: make q...
1397
1398
  bool queue_delayed_work_on(int cpu, struct workqueue_struct *wq,
  			   struct delayed_work *dwork, unsigned long delay)
7a6bc1cdd   Venkatesh Pallipadi   [CPUFREQ] Add que...
1399
  {
52bad64d9   David Howells   WorkStruct: Separ...
1400
  	struct work_struct *work = &dwork->work;
d4283e937   Tejun Heo   workqueue: make q...
1401
  	bool ret = false;
8930caba3   Tejun Heo   workqueue: disabl...
1402
  	unsigned long flags;
7a6bc1cdd   Venkatesh Pallipadi   [CPUFREQ] Add que...
1403

8930caba3   Tejun Heo   workqueue: disabl...
1404
1405
  	/* read the comment in __queue_work() */
  	local_irq_save(flags);
7a6bc1cdd   Venkatesh Pallipadi   [CPUFREQ] Add que...
1406

22df02bb3   Tejun Heo   workqueue: define...
1407
  	if (!test_and_set_bit(WORK_STRUCT_PENDING_BIT, work_data_bits(work))) {
7beb2edf4   Tejun Heo   workqueue: factor...
1408
  		__queue_delayed_work(cpu, wq, dwork, delay);
d4283e937   Tejun Heo   workqueue: make q...
1409
  		ret = true;
7a6bc1cdd   Venkatesh Pallipadi   [CPUFREQ] Add que...
1410
  	}
8a3e77cc2   Andrew Liu   workqueue: remove...
1411

8930caba3   Tejun Heo   workqueue: disabl...
1412
  	local_irq_restore(flags);
7a6bc1cdd   Venkatesh Pallipadi   [CPUFREQ] Add que...
1413
1414
  	return ret;
  }
ad7b1f841   Marc Dionne   workqueue: Make s...
1415
  EXPORT_SYMBOL(queue_delayed_work_on);
c7fc77f78   Tejun Heo   workqueue: remove...
1416

c8e55f360   Tejun Heo   workqueue: implem...
1417
  /**
8376fe22c   Tejun Heo   workqueue: implem...
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
   * mod_delayed_work_on - modify delay of or queue a delayed work on specific CPU
   * @cpu: CPU number to execute work on
   * @wq: workqueue to use
   * @dwork: work to queue
   * @delay: number of jiffies to wait before queueing
   *
   * If @dwork is idle, equivalent to queue_delayed_work_on(); otherwise,
   * modify @dwork's timer so that it expires after @delay.  If @delay is
   * zero, @work is guaranteed to be scheduled immediately regardless of its
   * current state.
   *
d185af300   Yacine Belkadi   workqueue: fix so...
1429
   * Return: %false if @dwork was idle and queued, %true if @dwork was
8376fe22c   Tejun Heo   workqueue: implem...
1430
1431
   * pending and its timer was modified.
   *
e0aecdd87   Tejun Heo   workqueue: use ir...
1432
   * This function is safe to call from any context including IRQ handler.
8376fe22c   Tejun Heo   workqueue: implem...
1433
1434
1435
1436
1437
1438
1439
   * See try_to_grab_pending() for details.
   */
  bool mod_delayed_work_on(int cpu, struct workqueue_struct *wq,
  			 struct delayed_work *dwork, unsigned long delay)
  {
  	unsigned long flags;
  	int ret;
c7fc77f78   Tejun Heo   workqueue: remove...
1440

8376fe22c   Tejun Heo   workqueue: implem...
1441
1442
1443
  	do {
  		ret = try_to_grab_pending(&dwork->work, true, &flags);
  	} while (unlikely(ret == -EAGAIN));
63bc03625   Oleg Nesterov   unify queue_delay...
1444

8376fe22c   Tejun Heo   workqueue: implem...
1445
1446
1447
  	if (likely(ret >= 0)) {
  		__queue_delayed_work(cpu, wq, dwork, delay);
  		local_irq_restore(flags);
7a6bc1cdd   Venkatesh Pallipadi   [CPUFREQ] Add que...
1448
  	}
8376fe22c   Tejun Heo   workqueue: implem...
1449
1450
  
  	/* -ENOENT from try_to_grab_pending() becomes %true */
7a6bc1cdd   Venkatesh Pallipadi   [CPUFREQ] Add que...
1451
1452
  	return ret;
  }
8376fe22c   Tejun Heo   workqueue: implem...
1453
1454
1455
  EXPORT_SYMBOL_GPL(mod_delayed_work_on);
  
  /**
c8e55f360   Tejun Heo   workqueue: implem...
1456
1457
1458
1459
1460
1461
1462
   * 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:
d565ed630   Tejun Heo   workqueue: move g...
1463
   * spin_lock_irq(pool->lock).
c8e55f360   Tejun Heo   workqueue: implem...
1464
1465
   */
  static void worker_enter_idle(struct worker *worker)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1466
  {
bd7bdd43d   Tejun Heo   workqueue: factor...
1467
  	struct worker_pool *pool = worker->pool;
c8e55f360   Tejun Heo   workqueue: implem...
1468

6183c009f   Tejun Heo   workqueue: make s...
1469
1470
1471
1472
  	if (WARN_ON_ONCE(worker->flags & WORKER_IDLE) ||
  	    WARN_ON_ONCE(!list_empty(&worker->entry) &&
  			 (worker->hentry.next || worker->hentry.pprev)))
  		return;
c8e55f360   Tejun Heo   workqueue: implem...
1473

051e18501   Lai Jiangshan   workqueue: unfold...
1474
  	/* can't use worker_set_flags(), also called from create_worker() */
cb4447669   Tejun Heo   workqueue: use wo...
1475
  	worker->flags |= WORKER_IDLE;
bd7bdd43d   Tejun Heo   workqueue: factor...
1476
  	pool->nr_idle++;
e22bee782   Tejun Heo   workqueue: implem...
1477
  	worker->last_active = jiffies;
c8e55f360   Tejun Heo   workqueue: implem...
1478
1479
  
  	/* idle_list is LIFO */
bd7bdd43d   Tejun Heo   workqueue: factor...
1480
  	list_add(&worker->entry, &pool->idle_list);
db7bccf45   Tejun Heo   workqueue: reimpl...
1481

628c78e7e   Tejun Heo   workqueue: remove...
1482
1483
  	if (too_many_workers(pool) && !timer_pending(&pool->idle_timer))
  		mod_timer(&pool->idle_timer, jiffies + IDLE_WORKER_TIMEOUT);
cb4447669   Tejun Heo   workqueue: use wo...
1484

544ecf310   Tejun Heo   workqueue: skip n...
1485
  	/*
706026c21   Tejun Heo   workqueue: post g...
1486
  	 * Sanity check nr_running.  Because wq_unbind_fn() releases
d565ed630   Tejun Heo   workqueue: move g...
1487
  	 * pool->lock between setting %WORKER_UNBOUND and zapping
628c78e7e   Tejun Heo   workqueue: remove...
1488
1489
  	 * nr_running, the warning may trigger spuriously.  Check iff
  	 * unbind is not in progress.
544ecf310   Tejun Heo   workqueue: skip n...
1490
  	 */
246475708   Tejun Heo   workqueue: make G...
1491
  	WARN_ON_ONCE(!(pool->flags & POOL_DISASSOCIATED) &&
bd7bdd43d   Tejun Heo   workqueue: factor...
1492
  		     pool->nr_workers == pool->nr_idle &&
e19e397a8   Tejun Heo   workqueue: move n...
1493
  		     atomic_read(&pool->nr_running));
c8e55f360   Tejun Heo   workqueue: implem...
1494
1495
1496
1497
1498
1499
1500
1501
1502
  }
  
  /**
   * worker_leave_idle - leave idle state
   * @worker: worker which is leaving idle state
   *
   * @worker is leaving idle state.  Update stats.
   *
   * LOCKING:
d565ed630   Tejun Heo   workqueue: move g...
1503
   * spin_lock_irq(pool->lock).
c8e55f360   Tejun Heo   workqueue: implem...
1504
1505
1506
   */
  static void worker_leave_idle(struct worker *worker)
  {
bd7bdd43d   Tejun Heo   workqueue: factor...
1507
  	struct worker_pool *pool = worker->pool;
c8e55f360   Tejun Heo   workqueue: implem...
1508

6183c009f   Tejun Heo   workqueue: make s...
1509
1510
  	if (WARN_ON_ONCE(!(worker->flags & WORKER_IDLE)))
  		return;
d302f0178   Tejun Heo   workqueue: implem...
1511
  	worker_clr_flags(worker, WORKER_IDLE);
bd7bdd43d   Tejun Heo   workqueue: factor...
1512
  	pool->nr_idle--;
c8e55f360   Tejun Heo   workqueue: implem...
1513
1514
  	list_del_init(&worker->entry);
  }
f7537df52   Lai Jiangshan   workqueue: alloc ...
1515
  static struct worker *alloc_worker(int node)
c34056a3f   Tejun Heo   workqueue: introd...
1516
1517
  {
  	struct worker *worker;
f7537df52   Lai Jiangshan   workqueue: alloc ...
1518
  	worker = kzalloc_node(sizeof(*worker), GFP_KERNEL, node);
c8e55f360   Tejun Heo   workqueue: implem...
1519
1520
  	if (worker) {
  		INIT_LIST_HEAD(&worker->entry);
affee4b29   Tejun Heo   workqueue: reimpl...
1521
  		INIT_LIST_HEAD(&worker->scheduled);
da028469b   Lai Jiangshan   workqueue: separa...
1522
  		INIT_LIST_HEAD(&worker->node);
e22bee782   Tejun Heo   workqueue: implem...
1523
1524
  		/* on creation a worker is in !idle && prep state */
  		worker->flags = WORKER_PREP;
c8e55f360   Tejun Heo   workqueue: implem...
1525
  	}
c34056a3f   Tejun Heo   workqueue: introd...
1526
1527
1528
1529
  	return worker;
  }
  
  /**
4736cbf7a   Lai Jiangshan   workqueue: separa...
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
   * worker_attach_to_pool() - attach a worker to a pool
   * @worker: worker to be attached
   * @pool: the target pool
   *
   * Attach @worker to @pool.  Once attached, the %WORKER_UNBOUND flag and
   * cpu-binding of @worker are kept coordinated with the pool across
   * cpu-[un]hotplugs.
   */
  static void worker_attach_to_pool(struct worker *worker,
  				   struct worker_pool *pool)
  {
  	mutex_lock(&pool->attach_mutex);
  
  	/*
  	 * set_cpus_allowed_ptr() will fail if the cpumask doesn't have any
  	 * online CPUs.  It'll be re-applied when any of the CPUs come up.
  	 */
  	set_cpus_allowed_ptr(worker->task, pool->attrs->cpumask);
  
  	/*
  	 * The pool->attach_mutex ensures %POOL_DISASSOCIATED remains
  	 * stable across this function.  See the comments above the
  	 * flag definition for details.
  	 */
  	if (pool->flags & POOL_DISASSOCIATED)
  		worker->flags |= WORKER_UNBOUND;
  
  	list_add_tail(&worker->node, &pool->workers);
  
  	mutex_unlock(&pool->attach_mutex);
  }
  
  /**
60f5a4bcf   Lai Jiangshan   workqueue: async ...
1563
1564
1565
1566
   * worker_detach_from_pool() - detach a worker from its pool
   * @worker: worker which is attached to its pool
   * @pool: the pool @worker is attached to
   *
4736cbf7a   Lai Jiangshan   workqueue: separa...
1567
1568
1569
   * Undo the attaching which had been done in worker_attach_to_pool().  The
   * caller worker shouldn't access to the pool after detached except it has
   * other reference to the pool.
60f5a4bcf   Lai Jiangshan   workqueue: async ...
1570
1571
1572
1573
1574
   */
  static void worker_detach_from_pool(struct worker *worker,
  				    struct worker_pool *pool)
  {
  	struct completion *detach_completion = NULL;
92f9c5c40   Lai Jiangshan   workqueue: rename...
1575
  	mutex_lock(&pool->attach_mutex);
da028469b   Lai Jiangshan   workqueue: separa...
1576
1577
  	list_del(&worker->node);
  	if (list_empty(&pool->workers))
60f5a4bcf   Lai Jiangshan   workqueue: async ...
1578
  		detach_completion = pool->detach_completion;
92f9c5c40   Lai Jiangshan   workqueue: rename...
1579
  	mutex_unlock(&pool->attach_mutex);
60f5a4bcf   Lai Jiangshan   workqueue: async ...
1580

b62c07519   Lai Jiangshan   workqueue: clear ...
1581
1582
  	/* clear leftover flags without pool->lock after it is detached */
  	worker->flags &= ~(WORKER_UNBOUND | WORKER_REBOUND);
60f5a4bcf   Lai Jiangshan   workqueue: async ...
1583
1584
1585
1586
1587
  	if (detach_completion)
  		complete(detach_completion);
  }
  
  /**
c34056a3f   Tejun Heo   workqueue: introd...
1588
   * create_worker - create a new workqueue worker
63d95a915   Tejun Heo   workqueue: use @p...
1589
   * @pool: pool the new worker will belong to
c34056a3f   Tejun Heo   workqueue: introd...
1590
   *
051e18501   Lai Jiangshan   workqueue: unfold...
1591
   * Create and start a new worker which is attached to @pool.
c34056a3f   Tejun Heo   workqueue: introd...
1592
1593
1594
1595
   *
   * CONTEXT:
   * Might sleep.  Does GFP_KERNEL allocations.
   *
d185af300   Yacine Belkadi   workqueue: fix so...
1596
   * Return:
c34056a3f   Tejun Heo   workqueue: introd...
1597
1598
   * Pointer to the newly created worker.
   */
bc2ae0f5b   Tejun Heo   workqueue: drop @...
1599
  static struct worker *create_worker(struct worker_pool *pool)
c34056a3f   Tejun Heo   workqueue: introd...
1600
  {
c34056a3f   Tejun Heo   workqueue: introd...
1601
  	struct worker *worker = NULL;
f34217977   Tejun Heo   workqueue: implem...
1602
  	int id = -1;
e3c916a4c   Tejun Heo   workqueue: drop '...
1603
  	char id_buf[16];
c34056a3f   Tejun Heo   workqueue: introd...
1604

7cda9aae0   Lai Jiangshan   workqueue: conver...
1605
1606
  	/* ID is needed to determine kthread name */
  	id = ida_simple_get(&pool->worker_ida, 0, 0, GFP_KERNEL);
822d8405d   Tejun Heo   workqueue: conver...
1607
1608
  	if (id < 0)
  		goto fail;
c34056a3f   Tejun Heo   workqueue: introd...
1609

f7537df52   Lai Jiangshan   workqueue: alloc ...
1610
  	worker = alloc_worker(pool->node);
c34056a3f   Tejun Heo   workqueue: introd...
1611
1612
  	if (!worker)
  		goto fail;
bd7bdd43d   Tejun Heo   workqueue: factor...
1613
  	worker->pool = pool;
c34056a3f   Tejun Heo   workqueue: introd...
1614
  	worker->id = id;
29c91e991   Tejun Heo   workqueue: implem...
1615
  	if (pool->cpu >= 0)
e3c916a4c   Tejun Heo   workqueue: drop '...
1616
1617
  		snprintf(id_buf, sizeof(id_buf), "%d:%d%s", pool->cpu, id,
  			 pool->attrs->nice < 0  ? "H" : "");
f34217977   Tejun Heo   workqueue: implem...
1618
  	else
e3c916a4c   Tejun Heo   workqueue: drop '...
1619
  		snprintf(id_buf, sizeof(id_buf), "u%d:%d", pool->id, id);
f3f90ad46   Tejun Heo   workqueue: determ...
1620
  	worker->task = kthread_create_on_node(worker_thread, worker, pool->node,
e3c916a4c   Tejun Heo   workqueue: drop '...
1621
  					      "kworker/%s", id_buf);
c34056a3f   Tejun Heo   workqueue: introd...
1622
1623
  	if (IS_ERR(worker->task))
  		goto fail;
911512280   Oleg Nesterov   workqueue: swap s...
1624
1625
1626
1627
  	set_user_nice(worker->task, pool->attrs->nice);
  
  	/* prevent userland from meddling with cpumask of workqueue workers */
  	worker->task->flags |= PF_NO_SETAFFINITY;
da028469b   Lai Jiangshan   workqueue: separa...
1628
  	/* successful, attach the worker to the pool */
4736cbf7a   Lai Jiangshan   workqueue: separa...
1629
  	worker_attach_to_pool(worker, pool);
822d8405d   Tejun Heo   workqueue: conver...
1630

051e18501   Lai Jiangshan   workqueue: unfold...
1631
1632
1633
1634
1635
1636
  	/* start the newly created worker */
  	spin_lock_irq(&pool->lock);
  	worker->pool->nr_workers++;
  	worker_enter_idle(worker);
  	wake_up_process(worker->task);
  	spin_unlock_irq(&pool->lock);
c34056a3f   Tejun Heo   workqueue: introd...
1637
  	return worker;
822d8405d   Tejun Heo   workqueue: conver...
1638

c34056a3f   Tejun Heo   workqueue: introd...
1639
  fail:
9625ab172   Lai Jiangshan   workqueue: use ma...
1640
  	if (id >= 0)
7cda9aae0   Lai Jiangshan   workqueue: conver...
1641
  		ida_simple_remove(&pool->worker_ida, id);
c34056a3f   Tejun Heo   workqueue: introd...
1642
1643
1644
1645
1646
  	kfree(worker);
  	return NULL;
  }
  
  /**
c34056a3f   Tejun Heo   workqueue: introd...
1647
1648
1649
   * destroy_worker - destroy a workqueue worker
   * @worker: worker to be destroyed
   *
73eb7fe73   Lai Jiangshan   workqueue: destro...
1650
1651
   * Destroy @worker and adjust @pool stats accordingly.  The worker should
   * be idle.
c8e55f360   Tejun Heo   workqueue: implem...
1652
1653
   *
   * CONTEXT:
60f5a4bcf   Lai Jiangshan   workqueue: async ...
1654
   * spin_lock_irq(pool->lock).
c34056a3f   Tejun Heo   workqueue: introd...
1655
1656
1657
   */
  static void destroy_worker(struct worker *worker)
  {
bd7bdd43d   Tejun Heo   workqueue: factor...
1658
  	struct worker_pool *pool = worker->pool;
c34056a3f   Tejun Heo   workqueue: introd...
1659

cd549687a   Tejun Heo   workqueue: better...
1660
  	lockdep_assert_held(&pool->lock);
c34056a3f   Tejun Heo   workqueue: introd...
1661
  	/* sanity check frenzy */
6183c009f   Tejun Heo   workqueue: make s...
1662
  	if (WARN_ON(worker->current_work) ||
73eb7fe73   Lai Jiangshan   workqueue: destro...
1663
1664
  	    WARN_ON(!list_empty(&worker->scheduled)) ||
  	    WARN_ON(!(worker->flags & WORKER_IDLE)))
6183c009f   Tejun Heo   workqueue: make s...
1665
  		return;
c34056a3f   Tejun Heo   workqueue: introd...
1666

73eb7fe73   Lai Jiangshan   workqueue: destro...
1667
1668
  	pool->nr_workers--;
  	pool->nr_idle--;
5bdfff96c   Lai Jiangshan   workqueue: ensure...
1669

c8e55f360   Tejun Heo   workqueue: implem...
1670
  	list_del_init(&worker->entry);
cb4447669   Tejun Heo   workqueue: use wo...
1671
  	worker->flags |= WORKER_DIE;
60f5a4bcf   Lai Jiangshan   workqueue: async ...
1672
  	wake_up_process(worker->task);
c34056a3f   Tejun Heo   workqueue: introd...
1673
  }
63d95a915   Tejun Heo   workqueue: use @p...
1674
  static void idle_worker_timeout(unsigned long __pool)
e22bee782   Tejun Heo   workqueue: implem...
1675
  {
63d95a915   Tejun Heo   workqueue: use @p...
1676
  	struct worker_pool *pool = (void *)__pool;
e22bee782   Tejun Heo   workqueue: implem...
1677

d565ed630   Tejun Heo   workqueue: move g...
1678
  	spin_lock_irq(&pool->lock);
e22bee782   Tejun Heo   workqueue: implem...
1679

3347fc9f3   Lai Jiangshan   workqueue: destro...
1680
  	while (too_many_workers(pool)) {
e22bee782   Tejun Heo   workqueue: implem...
1681
1682
1683
1684
  		struct worker *worker;
  		unsigned long expires;
  
  		/* idle_list is kept in LIFO order, check the last one */
63d95a915   Tejun Heo   workqueue: use @p...
1685
  		worker = list_entry(pool->idle_list.prev, struct worker, entry);
e22bee782   Tejun Heo   workqueue: implem...
1686
  		expires = worker->last_active + IDLE_WORKER_TIMEOUT;
3347fc9f3   Lai Jiangshan   workqueue: destro...
1687
  		if (time_before(jiffies, expires)) {
63d95a915   Tejun Heo   workqueue: use @p...
1688
  			mod_timer(&pool->idle_timer, expires);
3347fc9f3   Lai Jiangshan   workqueue: destro...
1689
  			break;
d5abe6691   Peter Zijlstra   [PATCH] debug: wo...
1690
  		}
3347fc9f3   Lai Jiangshan   workqueue: destro...
1691
1692
  
  		destroy_worker(worker);
e22bee782   Tejun Heo   workqueue: implem...
1693
  	}
d565ed630   Tejun Heo   workqueue: move g...
1694
  	spin_unlock_irq(&pool->lock);
e22bee782   Tejun Heo   workqueue: implem...
1695
  }
d5abe6691   Peter Zijlstra   [PATCH] debug: wo...
1696

493a1724f   Tejun Heo   workqueue: add wo...
1697
  static void send_mayday(struct work_struct *work)
e22bee782   Tejun Heo   workqueue: implem...
1698
  {
112202d90   Tejun Heo   workqueue: rename...
1699
1700
  	struct pool_workqueue *pwq = get_work_pwq(work);
  	struct workqueue_struct *wq = pwq->wq;
493a1724f   Tejun Heo   workqueue: add wo...
1701

2e109a285   Tejun Heo   workqueue: rename...
1702
  	lockdep_assert_held(&wq_mayday_lock);
e22bee782   Tejun Heo   workqueue: implem...
1703

493008a8e   Tejun Heo   workqueue: drop W...
1704
  	if (!wq->rescuer)
493a1724f   Tejun Heo   workqueue: add wo...
1705
  		return;
e22bee782   Tejun Heo   workqueue: implem...
1706
1707
  
  	/* mayday mayday mayday */
493a1724f   Tejun Heo   workqueue: add wo...
1708
  	if (list_empty(&pwq->mayday_node)) {
77668c8b5   Lai Jiangshan   workqueue: fix a ...
1709
1710
1711
1712
1713
1714
  		/*
  		 * If @pwq is for an unbound wq, its base ref may be put at
  		 * any time due to an attribute change.  Pin @pwq until the
  		 * rescuer is done with it.
  		 */
  		get_pwq(pwq);
493a1724f   Tejun Heo   workqueue: add wo...
1715
  		list_add_tail(&pwq->mayday_node, &wq->maydays);
e22bee782   Tejun Heo   workqueue: implem...
1716
  		wake_up_process(wq->rescuer->task);
493a1724f   Tejun Heo   workqueue: add wo...
1717
  	}
e22bee782   Tejun Heo   workqueue: implem...
1718
  }
706026c21   Tejun Heo   workqueue: post g...
1719
  static void pool_mayday_timeout(unsigned long __pool)
e22bee782   Tejun Heo   workqueue: implem...
1720
  {
63d95a915   Tejun Heo   workqueue: use @p...
1721
  	struct worker_pool *pool = (void *)__pool;
e22bee782   Tejun Heo   workqueue: implem...
1722
  	struct work_struct *work;
2e109a285   Tejun Heo   workqueue: rename...
1723
  	spin_lock_irq(&wq_mayday_lock);		/* for wq->maydays */
493a1724f   Tejun Heo   workqueue: add wo...
1724
  	spin_lock(&pool->lock);
e22bee782   Tejun Heo   workqueue: implem...
1725

63d95a915   Tejun Heo   workqueue: use @p...
1726
  	if (need_to_create_worker(pool)) {
e22bee782   Tejun Heo   workqueue: implem...
1727
1728
1729
1730
1731
1732
  		/*
  		 * 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.
  		 */
63d95a915   Tejun Heo   workqueue: use @p...
1733
  		list_for_each_entry(work, &pool->worklist, entry)
e22bee782   Tejun Heo   workqueue: implem...
1734
  			send_mayday(work);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1735
  	}
e22bee782   Tejun Heo   workqueue: implem...
1736

493a1724f   Tejun Heo   workqueue: add wo...
1737
  	spin_unlock(&pool->lock);
2e109a285   Tejun Heo   workqueue: rename...
1738
  	spin_unlock_irq(&wq_mayday_lock);
e22bee782   Tejun Heo   workqueue: implem...
1739

63d95a915   Tejun Heo   workqueue: use @p...
1740
  	mod_timer(&pool->mayday_timer, jiffies + MAYDAY_INTERVAL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1741
  }
e22bee782   Tejun Heo   workqueue: implem...
1742
1743
  /**
   * maybe_create_worker - create a new worker if necessary
63d95a915   Tejun Heo   workqueue: use @p...
1744
   * @pool: pool to create a new worker for
e22bee782   Tejun Heo   workqueue: implem...
1745
   *
63d95a915   Tejun Heo   workqueue: use @p...
1746
   * Create a new worker for @pool if necessary.  @pool is guaranteed to
e22bee782   Tejun Heo   workqueue: implem...
1747
1748
   * have at least one idle worker on return from this function.  If
   * creating a new worker takes longer than MAYDAY_INTERVAL, mayday is
63d95a915   Tejun Heo   workqueue: use @p...
1749
   * sent to all rescuers with works scheduled on @pool to resolve
e22bee782   Tejun Heo   workqueue: implem...
1750
1751
   * possible allocation deadlock.
   *
c5aa87bbf   Tejun Heo   workqueue: update...
1752
1753
   * On return, need_to_create_worker() is guaranteed to be %false and
   * may_start_working() %true.
e22bee782   Tejun Heo   workqueue: implem...
1754
1755
   *
   * LOCKING:
d565ed630   Tejun Heo   workqueue: move g...
1756
   * spin_lock_irq(pool->lock) which may be released and regrabbed
e22bee782   Tejun Heo   workqueue: implem...
1757
1758
1759
   * multiple times.  Does GFP_KERNEL allocations.  Called only from
   * manager.
   *
d185af300   Yacine Belkadi   workqueue: fix so...
1760
   * Return:
c5aa87bbf   Tejun Heo   workqueue: update...
1761
   * %false if no action was taken and pool->lock stayed locked, %true
e22bee782   Tejun Heo   workqueue: implem...
1762
1763
   * otherwise.
   */
63d95a915   Tejun Heo   workqueue: use @p...
1764
  static bool maybe_create_worker(struct worker_pool *pool)
d565ed630   Tejun Heo   workqueue: move g...
1765
1766
  __releases(&pool->lock)
  __acquires(&pool->lock)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1767
  {
63d95a915   Tejun Heo   workqueue: use @p...
1768
  	if (!need_to_create_worker(pool))
e22bee782   Tejun Heo   workqueue: implem...
1769
1770
  		return false;
  restart:
d565ed630   Tejun Heo   workqueue: move g...
1771
  	spin_unlock_irq(&pool->lock);
9f9c23644   Tejun Heo   workqueue: fix lo...
1772

e22bee782   Tejun Heo   workqueue: implem...
1773
  	/* if we don't make progress in MAYDAY_INITIAL_TIMEOUT, call for help */
63d95a915   Tejun Heo   workqueue: use @p...
1774
  	mod_timer(&pool->mayday_timer, jiffies + MAYDAY_INITIAL_TIMEOUT);
e22bee782   Tejun Heo   workqueue: implem...
1775
1776
  
  	while (true) {
051e18501   Lai Jiangshan   workqueue: unfold...
1777
  		if (create_worker(pool) || !need_to_create_worker(pool))
e22bee782   Tejun Heo   workqueue: implem...
1778
  			break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1779

e212f361f   Lai Jiangshan   workqueue: use sc...
1780
  		schedule_timeout_interruptible(CREATE_COOLDOWN);
9f9c23644   Tejun Heo   workqueue: fix lo...
1781

63d95a915   Tejun Heo   workqueue: use @p...
1782
  		if (!need_to_create_worker(pool))
e22bee782   Tejun Heo   workqueue: implem...
1783
1784
  			break;
  	}
63d95a915   Tejun Heo   workqueue: use @p...
1785
  	del_timer_sync(&pool->mayday_timer);
d565ed630   Tejun Heo   workqueue: move g...
1786
  	spin_lock_irq(&pool->lock);
051e18501   Lai Jiangshan   workqueue: unfold...
1787
1788
1789
1790
1791
  	/*
  	 * This is necessary even after a new worker was just successfully
  	 * created as @pool->lock was dropped and the new worker might have
  	 * already become busy.
  	 */
63d95a915   Tejun Heo   workqueue: use @p...
1792
  	if (need_to_create_worker(pool))
e22bee782   Tejun Heo   workqueue: implem...
1793
1794
1795
1796
1797
  		goto restart;
  	return true;
  }
  
  /**
e22bee782   Tejun Heo   workqueue: implem...
1798
1799
   * manage_workers - manage worker pool
   * @worker: self
73f53c4aa   Tejun Heo   workqueue: reimpl...
1800
   *
706026c21   Tejun Heo   workqueue: post g...
1801
   * Assume the manager role and manage the worker pool @worker belongs
e22bee782   Tejun Heo   workqueue: implem...
1802
   * to.  At any given time, there can be only zero or one manager per
706026c21   Tejun Heo   workqueue: post g...
1803
   * pool.  The exclusion is handled automatically by this function.
e22bee782   Tejun Heo   workqueue: implem...
1804
1805
1806
1807
   *
   * 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.
73f53c4aa   Tejun Heo   workqueue: reimpl...
1808
1809
   *
   * CONTEXT:
d565ed630   Tejun Heo   workqueue: move g...
1810
   * spin_lock_irq(pool->lock) which may be released and regrabbed
e22bee782   Tejun Heo   workqueue: implem...
1811
1812
   * multiple times.  Does GFP_KERNEL allocations.
   *
d185af300   Yacine Belkadi   workqueue: fix so...
1813
   * Return:
2d498db98   Libin   workqueue: Fix ma...
1814
1815
1816
1817
1818
   * %false if the pool don't need management and the caller can safely start
   * processing works, %true indicates that the function released pool->lock
   * and reacquired it to perform some management function and that the
   * conditions that the caller verified while holding the lock before
   * calling the function might no longer be true.
73f53c4aa   Tejun Heo   workqueue: reimpl...
1819
   */
e22bee782   Tejun Heo   workqueue: implem...
1820
  static bool manage_workers(struct worker *worker)
73f53c4aa   Tejun Heo   workqueue: reimpl...
1821
  {
63d95a915   Tejun Heo   workqueue: use @p...
1822
  	struct worker_pool *pool = worker->pool;
e22bee782   Tejun Heo   workqueue: implem...
1823
  	bool ret = false;
73f53c4aa   Tejun Heo   workqueue: reimpl...
1824

bc3a1afc9   Tejun Heo   workqueue: rename...
1825
  	/*
bc3a1afc9   Tejun Heo   workqueue: rename...
1826
1827
1828
1829
1830
1831
1832
1833
  	 * Anyone who successfully grabs manager_arb wins the arbitration
  	 * and becomes the manager.  mutex_trylock() on pool->manager_arb
  	 * failure while holding pool->lock reliably indicates that someone
  	 * else is managing the pool and the worker which failed trylock
  	 * can proceed to executing work items.  This means that anyone
  	 * grabbing manager_arb is responsible for actually performing
  	 * manager duties.  If manager_arb is grabbed and released without
  	 * actual management, the pool may stall indefinitely.
bc3a1afc9   Tejun Heo   workqueue: rename...
1834
  	 */
34a06bd6b   Tejun Heo   workqueue: replac...
1835
  	if (!mutex_trylock(&pool->manager_arb))
e22bee782   Tejun Heo   workqueue: implem...
1836
  		return ret;
1e19ffc63   Tejun Heo   workqueue: implem...
1837

63d95a915   Tejun Heo   workqueue: use @p...
1838
  	ret |= maybe_create_worker(pool);
e22bee782   Tejun Heo   workqueue: implem...
1839

34a06bd6b   Tejun Heo   workqueue: replac...
1840
  	mutex_unlock(&pool->manager_arb);
e22bee782   Tejun Heo   workqueue: implem...
1841
  	return ret;
73f53c4aa   Tejun Heo   workqueue: reimpl...
1842
1843
1844
  }
  
  /**
a62428c0a   Tejun Heo   workqueue: separa...
1845
   * process_one_work - process single work
c34056a3f   Tejun Heo   workqueue: introd...
1846
   * @worker: self
a62428c0a   Tejun Heo   workqueue: separa...
1847
1848
1849
1850
1851
1852
1853
1854
1855
   * @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:
d565ed630   Tejun Heo   workqueue: move g...
1856
   * spin_lock_irq(pool->lock) which is released and regrabbed.
a62428c0a   Tejun Heo   workqueue: separa...
1857
   */
c34056a3f   Tejun Heo   workqueue: introd...
1858
  static void process_one_work(struct worker *worker, struct work_struct *work)
d565ed630   Tejun Heo   workqueue: move g...
1859
1860
  __releases(&pool->lock)
  __acquires(&pool->lock)
a62428c0a   Tejun Heo   workqueue: separa...
1861
  {
112202d90   Tejun Heo   workqueue: rename...
1862
  	struct pool_workqueue *pwq = get_work_pwq(work);
bd7bdd43d   Tejun Heo   workqueue: factor...
1863
  	struct worker_pool *pool = worker->pool;
112202d90   Tejun Heo   workqueue: rename...
1864
  	bool cpu_intensive = pwq->wq->flags & WQ_CPU_INTENSIVE;
73f53c4aa   Tejun Heo   workqueue: reimpl...
1865
  	int work_color;
7e11629d0   Tejun Heo   workqueue: use sh...
1866
  	struct worker *collision;
a62428c0a   Tejun Heo   workqueue: separa...
1867
1868
1869
1870
1871
1872
1873
1874
  #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.
  	 */
4d82a1deb   Peter Zijlstra   lockdep: fix oops...
1875
1876
1877
  	struct lockdep_map lockdep_map;
  
  	lockdep_copy_map(&lockdep_map, &work->lockdep_map);
a62428c0a   Tejun Heo   workqueue: separa...
1878
  #endif
807407c0a   Lai Jiangshan   workqueue: strong...
1879
  	/* ensure we're on the correct CPU */
85327af61   Lai Jiangshan   workqueue: strong...
1880
  	WARN_ON_ONCE(!(pool->flags & POOL_DISASSOCIATED) &&
ec22ca5ea   Tejun Heo   workqueue: move g...
1881
  		     raw_smp_processor_id() != pool->cpu);
25511a477   Tejun Heo   workqueue: reimpl...
1882

7e11629d0   Tejun Heo   workqueue: use sh...
1883
1884
1885
1886
1887
1888
  	/*
  	 * 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.
  	 */
c9e7cf273   Tejun Heo   workqueue: move b...
1889
  	collision = find_worker_executing_work(pool, work);
7e11629d0   Tejun Heo   workqueue: use sh...
1890
1891
1892
1893
  	if (unlikely(collision)) {
  		move_linked_works(work, &collision->scheduled, NULL);
  		return;
  	}
8930caba3   Tejun Heo   workqueue: disabl...
1894
  	/* claim and dequeue */
a62428c0a   Tejun Heo   workqueue: separa...
1895
  	debug_work_deactivate(work);
c9e7cf273   Tejun Heo   workqueue: move b...
1896
  	hash_add(pool->busy_hash, &worker->hentry, (unsigned long)work);
c34056a3f   Tejun Heo   workqueue: introd...
1897
  	worker->current_work = work;
a2c1c57be   Tejun Heo   workqueue: consid...
1898
  	worker->current_func = work->func;
112202d90   Tejun Heo   workqueue: rename...
1899
  	worker->current_pwq = pwq;
73f53c4aa   Tejun Heo   workqueue: reimpl...
1900
  	work_color = get_work_color(work);
7a22ad757   Tejun Heo   workqueue: carry ...
1901

a62428c0a   Tejun Heo   workqueue: separa...
1902
  	list_del_init(&work->entry);
649027d73   Tejun Heo   workqueue: implem...
1903
  	/*
228f1d001   Lai Jiangshan   workqueue: remove...
1904
1905
1906
1907
  	 * CPU intensive works don't participate in concurrency management.
  	 * They're the scheduler's responsibility.  This takes @worker out
  	 * of concurrency management and the next code block will chain
  	 * execution of the pending work items.
fb0e7beb5   Tejun Heo   workqueue: implem...
1908
1909
  	 */
  	if (unlikely(cpu_intensive))
228f1d001   Lai Jiangshan   workqueue: remove...
1910
  		worker_set_flags(worker, WORKER_CPU_INTENSIVE);
fb0e7beb5   Tejun Heo   workqueue: implem...
1911

974271c48   Tejun Heo   workqueue: don't ...
1912
  	/*
a489a03ec   Lai Jiangshan   workqueue: remove...
1913
1914
1915
1916
  	 * Wake up another worker if necessary.  The condition is always
  	 * false for normal per-cpu workers since nr_running would always
  	 * be >= 1 at this point.  This is used to chain execution of the
  	 * pending work items for WORKER_NOT_RUNNING workers such as the
228f1d001   Lai Jiangshan   workqueue: remove...
1917
  	 * UNBOUND and CPU_INTENSIVE ones.
974271c48   Tejun Heo   workqueue: don't ...
1918
  	 */
a489a03ec   Lai Jiangshan   workqueue: remove...
1919
  	if (need_more_worker(pool))
63d95a915   Tejun Heo   workqueue: use @p...
1920
  		wake_up_worker(pool);
974271c48   Tejun Heo   workqueue: don't ...
1921

8930caba3   Tejun Heo   workqueue: disabl...
1922
  	/*
7c3eed5cd   Tejun Heo   workqueue: record...
1923
  	 * Record the last pool and clear PENDING which should be the last
d565ed630   Tejun Heo   workqueue: move g...
1924
  	 * update to @work.  Also, do this inside @pool->lock so that
23657bb19   Tejun Heo   workqueue: add mi...
1925
1926
  	 * PENDING and queued state changes happen together while IRQ is
  	 * disabled.
8930caba3   Tejun Heo   workqueue: disabl...
1927
  	 */
7c3eed5cd   Tejun Heo   workqueue: record...
1928
  	set_work_pool_and_clear_pending(work, pool->id);
a62428c0a   Tejun Heo   workqueue: separa...
1929

d565ed630   Tejun Heo   workqueue: move g...
1930
  	spin_unlock_irq(&pool->lock);
a62428c0a   Tejun Heo   workqueue: separa...
1931

112202d90   Tejun Heo   workqueue: rename...
1932
  	lock_map_acquire_read(&pwq->wq->lockdep_map);
a62428c0a   Tejun Heo   workqueue: separa...
1933
  	lock_map_acquire(&lockdep_map);
e36c886a0   Arjan van de Ven   workqueue: Add ba...
1934
  	trace_workqueue_execute_start(work);
a2c1c57be   Tejun Heo   workqueue: consid...
1935
  	worker->current_func(work);
e36c886a0   Arjan van de Ven   workqueue: Add ba...
1936
1937
1938
1939
1940
  	/*
  	 * 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...
1941
  	lock_map_release(&lockdep_map);
112202d90   Tejun Heo   workqueue: rename...
1942
  	lock_map_release(&pwq->wq->lockdep_map);
a62428c0a   Tejun Heo   workqueue: separa...
1943
1944
  
  	if (unlikely(in_atomic() || lockdep_depth(current) > 0)) {
044c782ce   Valentin Ilie   workqueue: fix ch...
1945
1946
1947
1948
  		pr_err("BUG: workqueue leaked lock or atomic: %s/0x%08x/%d
  "
  		       "     last function: %pf
  ",
a2c1c57be   Tejun Heo   workqueue: consid...
1949
1950
  		       current->comm, preempt_count(), task_pid_nr(current),
  		       worker->current_func);
a62428c0a   Tejun Heo   workqueue: separa...
1951
1952
1953
  		debug_show_held_locks(current);
  		dump_stack();
  	}
b22ce2785   Tejun Heo   workqueue: cond_r...
1954
1955
1956
1957
1958
  	/*
  	 * The following prevents a kworker from hogging CPU on !PREEMPT
  	 * kernels, where a requeueing work item waiting for something to
  	 * happen could deadlock with stop_machine as such work item could
  	 * indefinitely requeue itself while all other CPUs are trapped in
789cbbeca   Joe Lawrence   workqueue: Add qu...
1959
1960
  	 * stop_machine. At the same time, report a quiescent RCU state so
  	 * the same condition doesn't freeze RCU.
b22ce2785   Tejun Heo   workqueue: cond_r...
1961
  	 */
3e28e3772   Joe Lawrence   workqueue: Use co...
1962
  	cond_resched_rcu_qs();
b22ce2785   Tejun Heo   workqueue: cond_r...
1963

d565ed630   Tejun Heo   workqueue: move g...
1964
  	spin_lock_irq(&pool->lock);
a62428c0a   Tejun Heo   workqueue: separa...
1965

fb0e7beb5   Tejun Heo   workqueue: implem...
1966
1967
1968
  	/* clear cpu intensive status */
  	if (unlikely(cpu_intensive))
  		worker_clr_flags(worker, WORKER_CPU_INTENSIVE);
a62428c0a   Tejun Heo   workqueue: separa...
1969
  	/* we're done with it, release */
42f8570f4   Sasha Levin   workqueue: use ne...
1970
  	hash_del(&worker->hentry);
c34056a3f   Tejun Heo   workqueue: introd...
1971
  	worker->current_work = NULL;
a2c1c57be   Tejun Heo   workqueue: consid...
1972
  	worker->current_func = NULL;
112202d90   Tejun Heo   workqueue: rename...
1973
  	worker->current_pwq = NULL;
3d1cb2059   Tejun Heo   workqueue: includ...
1974
  	worker->desc_valid = false;
112202d90   Tejun Heo   workqueue: rename...
1975
  	pwq_dec_nr_in_flight(pwq, work_color);
a62428c0a   Tejun Heo   workqueue: separa...
1976
  }
affee4b29   Tejun Heo   workqueue: reimpl...
1977
1978
1979
1980
1981
1982
1983
1984
1985
  /**
   * 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:
d565ed630   Tejun Heo   workqueue: move g...
1986
   * spin_lock_irq(pool->lock) which may be released and regrabbed
affee4b29   Tejun Heo   workqueue: reimpl...
1987
1988
1989
   * multiple times.
   */
  static void process_scheduled_works(struct worker *worker)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1990
  {
affee4b29   Tejun Heo   workqueue: reimpl...
1991
1992
  	while (!list_empty(&worker->scheduled)) {
  		struct work_struct *work = list_first_entry(&worker->scheduled,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1993
  						struct work_struct, entry);
c34056a3f   Tejun Heo   workqueue: introd...
1994
  		process_one_work(worker, work);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1995
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1996
  }
4690c4ab5   Tejun Heo   workqueue: misc/c...
1997
1998
  /**
   * worker_thread - the worker thread function
c34056a3f   Tejun Heo   workqueue: introd...
1999
   * @__worker: self
4690c4ab5   Tejun Heo   workqueue: misc/c...
2000
   *
c5aa87bbf   Tejun Heo   workqueue: update...
2001
2002
2003
2004
2005
   * The worker thread function.  All workers belong to a worker_pool -
   * either a per-cpu one or dynamic unbound one.  These workers process all
   * work items regardless of their specific target workqueue.  The only
   * exception is work items which belong to workqueues with a rescuer which
   * will be explained in rescuer_thread().
d185af300   Yacine Belkadi   workqueue: fix so...
2006
2007
   *
   * Return: 0
4690c4ab5   Tejun Heo   workqueue: misc/c...
2008
   */
c34056a3f   Tejun Heo   workqueue: introd...
2009
  static int worker_thread(void *__worker)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2010
  {
c34056a3f   Tejun Heo   workqueue: introd...
2011
  	struct worker *worker = __worker;
bd7bdd43d   Tejun Heo   workqueue: factor...
2012
  	struct worker_pool *pool = worker->pool;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2013

e22bee782   Tejun Heo   workqueue: implem...
2014
2015
  	/* tell the scheduler that this is a workqueue worker */
  	worker->task->flags |= PF_WQ_WORKER;
c8e55f360   Tejun Heo   workqueue: implem...
2016
  woke_up:
d565ed630   Tejun Heo   workqueue: move g...
2017
  	spin_lock_irq(&pool->lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2018

a9ab775bc   Tejun Heo   workqueue: direct...
2019
2020
  	/* am I supposed to die? */
  	if (unlikely(worker->flags & WORKER_DIE)) {
d565ed630   Tejun Heo   workqueue: move g...
2021
  		spin_unlock_irq(&pool->lock);
a9ab775bc   Tejun Heo   workqueue: direct...
2022
2023
  		WARN_ON_ONCE(!list_empty(&worker->entry));
  		worker->task->flags &= ~PF_WQ_WORKER;
60f5a4bcf   Lai Jiangshan   workqueue: async ...
2024
2025
  
  		set_task_comm(worker->task, "kworker/dying");
7cda9aae0   Lai Jiangshan   workqueue: conver...
2026
  		ida_simple_remove(&pool->worker_ida, worker->id);
60f5a4bcf   Lai Jiangshan   workqueue: async ...
2027
2028
  		worker_detach_from_pool(worker, pool);
  		kfree(worker);
a9ab775bc   Tejun Heo   workqueue: direct...
2029
  		return 0;
c8e55f360   Tejun Heo   workqueue: implem...
2030
  	}
affee4b29   Tejun Heo   workqueue: reimpl...
2031

c8e55f360   Tejun Heo   workqueue: implem...
2032
  	worker_leave_idle(worker);
db7bccf45   Tejun Heo   workqueue: reimpl...
2033
  recheck:
e22bee782   Tejun Heo   workqueue: implem...
2034
  	/* no more worker necessary? */
63d95a915   Tejun Heo   workqueue: use @p...
2035
  	if (!need_more_worker(pool))
e22bee782   Tejun Heo   workqueue: implem...
2036
2037
2038
  		goto sleep;
  
  	/* do we need to manage? */
63d95a915   Tejun Heo   workqueue: use @p...
2039
  	if (unlikely(!may_start_working(pool)) && manage_workers(worker))
e22bee782   Tejun Heo   workqueue: implem...
2040
  		goto recheck;
c8e55f360   Tejun Heo   workqueue: implem...
2041
2042
2043
2044
2045
  	/*
  	 * ->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.
  	 */
6183c009f   Tejun Heo   workqueue: make s...
2046
  	WARN_ON_ONCE(!list_empty(&worker->scheduled));
c8e55f360   Tejun Heo   workqueue: implem...
2047

e22bee782   Tejun Heo   workqueue: implem...
2048
  	/*
a9ab775bc   Tejun Heo   workqueue: direct...
2049
2050
2051
2052
2053
  	 * Finish PREP stage.  We're guaranteed to have at least one idle
  	 * worker or that someone else has already assumed the manager
  	 * role.  This is where @worker starts participating in concurrency
  	 * management if applicable and concurrency management is restored
  	 * after being rebound.  See rebind_workers() for details.
e22bee782   Tejun Heo   workqueue: implem...
2054
  	 */
a9ab775bc   Tejun Heo   workqueue: direct...
2055
  	worker_clr_flags(worker, WORKER_PREP | WORKER_REBOUND);
e22bee782   Tejun Heo   workqueue: implem...
2056
2057
  
  	do {
c8e55f360   Tejun Heo   workqueue: implem...
2058
  		struct work_struct *work =
bd7bdd43d   Tejun Heo   workqueue: factor...
2059
  			list_first_entry(&pool->worklist,
c8e55f360   Tejun Heo   workqueue: implem...
2060
2061
2062
2063
2064
2065
  					 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...
2066
  				process_scheduled_works(worker);
c8e55f360   Tejun Heo   workqueue: implem...
2067
2068
2069
  		} else {
  			move_linked_works(work, &worker->scheduled, NULL);
  			process_scheduled_works(worker);
affee4b29   Tejun Heo   workqueue: reimpl...
2070
  		}
63d95a915   Tejun Heo   workqueue: use @p...
2071
  	} while (keep_working(pool));
e22bee782   Tejun Heo   workqueue: implem...
2072

228f1d001   Lai Jiangshan   workqueue: remove...
2073
  	worker_set_flags(worker, WORKER_PREP);
d313dd85a   Tejun Heo   workqueue: fix wo...
2074
  sleep:
c8e55f360   Tejun Heo   workqueue: implem...
2075
  	/*
d565ed630   Tejun Heo   workqueue: move g...
2076
2077
2078
2079
2080
  	 * pool->lock is held and there's no work to process and no need to
  	 * manage, sleep.  Workers are woken up only while holding
  	 * pool->lock or from local cpu, so setting the current state
  	 * before releasing pool->lock is enough to prevent losing any
  	 * event.
c8e55f360   Tejun Heo   workqueue: implem...
2081
2082
2083
  	 */
  	worker_enter_idle(worker);
  	__set_current_state(TASK_INTERRUPTIBLE);
d565ed630   Tejun Heo   workqueue: move g...
2084
  	spin_unlock_irq(&pool->lock);
c8e55f360   Tejun Heo   workqueue: implem...
2085
2086
  	schedule();
  	goto woke_up;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2087
  }
e22bee782   Tejun Heo   workqueue: implem...
2088
2089
  /**
   * rescuer_thread - the rescuer thread function
111c225a5   Tejun Heo   workqueue: set PF...
2090
   * @__rescuer: self
e22bee782   Tejun Heo   workqueue: implem...
2091
2092
   *
   * Workqueue rescuer thread function.  There's one rescuer for each
493008a8e   Tejun Heo   workqueue: drop W...
2093
   * workqueue which has WQ_MEM_RECLAIM set.
e22bee782   Tejun Heo   workqueue: implem...
2094
   *
706026c21   Tejun Heo   workqueue: post g...
2095
   * Regular work processing on a pool may block trying to create a new
e22bee782   Tejun Heo   workqueue: implem...
2096
2097
2098
2099
2100
   * 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.
   *
706026c21   Tejun Heo   workqueue: post g...
2101
2102
   * When such condition is possible, the pool summons rescuers of all
   * workqueues which have works queued on the pool and let them process
e22bee782   Tejun Heo   workqueue: implem...
2103
2104
2105
   * those works so that forward progress can be guaranteed.
   *
   * This should happen rarely.
d185af300   Yacine Belkadi   workqueue: fix so...
2106
2107
   *
   * Return: 0
e22bee782   Tejun Heo   workqueue: implem...
2108
   */
111c225a5   Tejun Heo   workqueue: set PF...
2109
  static int rescuer_thread(void *__rescuer)
e22bee782   Tejun Heo   workqueue: implem...
2110
  {
111c225a5   Tejun Heo   workqueue: set PF...
2111
2112
  	struct worker *rescuer = __rescuer;
  	struct workqueue_struct *wq = rescuer->rescue_wq;
e22bee782   Tejun Heo   workqueue: implem...
2113
  	struct list_head *scheduled = &rescuer->scheduled;
4d595b866   Lai Jiangshan   workqueue: make r...
2114
  	bool should_stop;
e22bee782   Tejun Heo   workqueue: implem...
2115
2116
  
  	set_user_nice(current, RESCUER_NICE_LEVEL);
111c225a5   Tejun Heo   workqueue: set PF...
2117
2118
2119
2120
2121
2122
  
  	/*
  	 * Mark rescuer as worker too.  As WORKER_PREP is never cleared, it
  	 * doesn't participate in concurrency management.
  	 */
  	rescuer->task->flags |= PF_WQ_WORKER;
e22bee782   Tejun Heo   workqueue: implem...
2123
2124
  repeat:
  	set_current_state(TASK_INTERRUPTIBLE);
4d595b866   Lai Jiangshan   workqueue: make r...
2125
2126
2127
2128
2129
2130
2131
2132
2133
  	/*
  	 * By the time the rescuer is requested to stop, the workqueue
  	 * shouldn't have any work pending, but @wq->maydays may still have
  	 * pwq(s) queued.  This can happen by non-rescuer workers consuming
  	 * all the work items before the rescuer got to them.  Go through
  	 * @wq->maydays processing before acting on should_stop so that the
  	 * list is always empty on exit.
  	 */
  	should_stop = kthread_should_stop();
e22bee782   Tejun Heo   workqueue: implem...
2134

493a1724f   Tejun Heo   workqueue: add wo...
2135
  	/* see whether any pwq is asking for help */
2e109a285   Tejun Heo   workqueue: rename...
2136
  	spin_lock_irq(&wq_mayday_lock);
493a1724f   Tejun Heo   workqueue: add wo...
2137
2138
2139
2140
  
  	while (!list_empty(&wq->maydays)) {
  		struct pool_workqueue *pwq = list_first_entry(&wq->maydays,
  					struct pool_workqueue, mayday_node);
112202d90   Tejun Heo   workqueue: rename...
2141
  		struct worker_pool *pool = pwq->pool;
e22bee782   Tejun Heo   workqueue: implem...
2142
2143
2144
  		struct work_struct *work, *n;
  
  		__set_current_state(TASK_RUNNING);
493a1724f   Tejun Heo   workqueue: add wo...
2145
  		list_del_init(&pwq->mayday_node);
2e109a285   Tejun Heo   workqueue: rename...
2146
  		spin_unlock_irq(&wq_mayday_lock);
e22bee782   Tejun Heo   workqueue: implem...
2147

51697d393   Lai Jiangshan   workqueue: use ge...
2148
2149
2150
  		worker_attach_to_pool(rescuer, pool);
  
  		spin_lock_irq(&pool->lock);
b31041042   Lai Jiangshan   workqueue: better...
2151
  		rescuer->pool = pool;
e22bee782   Tejun Heo   workqueue: implem...
2152
2153
2154
2155
2156
  
  		/*
  		 * Slurp in all works issued via this workqueue and
  		 * process'em.
  		 */
6183c009f   Tejun Heo   workqueue: make s...
2157
  		WARN_ON_ONCE(!list_empty(&rescuer->scheduled));
bd7bdd43d   Tejun Heo   workqueue: factor...
2158
  		list_for_each_entry_safe(work, n, &pool->worklist, entry)
112202d90   Tejun Heo   workqueue: rename...
2159
  			if (get_work_pwq(work) == pwq)
e22bee782   Tejun Heo   workqueue: implem...
2160
2161
2162
  				move_linked_works(work, scheduled, &n);
  
  		process_scheduled_works(rescuer);
7576958a9   Tejun Heo   workqueue: wake u...
2163
2164
  
  		/*
77668c8b5   Lai Jiangshan   workqueue: fix a ...
2165
  		 * Put the reference grabbed by send_mayday().  @pool won't
13b1d625e   Lai Jiangshan   workqueue: move r...
2166
  		 * go away while we're still attached to it.
77668c8b5   Lai Jiangshan   workqueue: fix a ...
2167
2168
2169
2170
  		 */
  		put_pwq(pwq);
  
  		/*
d8ca83e68   Lai Jiangshan   workqueue: wake r...
2171
  		 * Leave this pool.  If need_more_worker() is %true, notify a
7576958a9   Tejun Heo   workqueue: wake u...
2172
2173
2174
  		 * regular worker; otherwise, we end up with 0 concurrency
  		 * and stalling the execution.
  		 */
d8ca83e68   Lai Jiangshan   workqueue: wake r...
2175
  		if (need_more_worker(pool))
63d95a915   Tejun Heo   workqueue: use @p...
2176
  			wake_up_worker(pool);
7576958a9   Tejun Heo   workqueue: wake u...
2177

b31041042   Lai Jiangshan   workqueue: better...
2178
  		rescuer->pool = NULL;
13b1d625e   Lai Jiangshan   workqueue: move r...
2179
2180
2181
2182
2183
  		spin_unlock_irq(&pool->lock);
  
  		worker_detach_from_pool(rescuer, pool);
  
  		spin_lock_irq(&wq_mayday_lock);
e22bee782   Tejun Heo   workqueue: implem...
2184
  	}
2e109a285   Tejun Heo   workqueue: rename...
2185
  	spin_unlock_irq(&wq_mayday_lock);
493a1724f   Tejun Heo   workqueue: add wo...
2186

4d595b866   Lai Jiangshan   workqueue: make r...
2187
2188
2189
2190
2191
  	if (should_stop) {
  		__set_current_state(TASK_RUNNING);
  		rescuer->task->flags &= ~PF_WQ_WORKER;
  		return 0;
  	}
111c225a5   Tejun Heo   workqueue: set PF...
2192
2193
  	/* rescuers should never participate in concurrency management */
  	WARN_ON_ONCE(!(rescuer->flags & WORKER_NOT_RUNNING));
e22bee782   Tejun Heo   workqueue: implem...
2194
2195
  	schedule();
  	goto repeat;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2196
  }
fc2e4d704   Oleg Nesterov   reimplement flush...
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
  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...
2207
2208
  /**
   * insert_wq_barrier - insert a barrier work
112202d90   Tejun Heo   workqueue: rename...
2209
   * @pwq: pwq to insert barrier into
4690c4ab5   Tejun Heo   workqueue: misc/c...
2210
   * @barr: wq_barrier to insert
affee4b29   Tejun Heo   workqueue: reimpl...
2211
2212
   * @target: target work to attach @barr to
   * @worker: worker currently executing @target, NULL if @target is not executing
4690c4ab5   Tejun Heo   workqueue: misc/c...
2213
   *
affee4b29   Tejun Heo   workqueue: reimpl...
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
   * @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
112202d90   Tejun Heo   workqueue: rename...
2226
   * underneath us, so we can't reliably determine pwq from @target.
4690c4ab5   Tejun Heo   workqueue: misc/c...
2227
2228
   *
   * CONTEXT:
d565ed630   Tejun Heo   workqueue: move g...
2229
   * spin_lock_irq(pool->lock).
4690c4ab5   Tejun Heo   workqueue: misc/c...
2230
   */
112202d90   Tejun Heo   workqueue: rename...
2231
  static void insert_wq_barrier(struct pool_workqueue *pwq,
affee4b29   Tejun Heo   workqueue: reimpl...
2232
2233
  			      struct wq_barrier *barr,
  			      struct work_struct *target, struct worker *worker)
fc2e4d704   Oleg Nesterov   reimplement flush...
2234
  {
affee4b29   Tejun Heo   workqueue: reimpl...
2235
2236
  	struct list_head *head;
  	unsigned int linked = 0;
dc186ad74   Thomas Gleixner   workqueue: Add de...
2237
  	/*
d565ed630   Tejun Heo   workqueue: move g...
2238
  	 * debugobject calls are safe here even with pool->lock locked
dc186ad74   Thomas Gleixner   workqueue: Add de...
2239
2240
2241
2242
  	 * 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_...
2243
  	INIT_WORK_ONSTACK(&barr->work, wq_barrier_func);
22df02bb3   Tejun Heo   workqueue: define...
2244
  	__set_bit(WORK_STRUCT_PENDING_BIT, work_data_bits(&barr->work));
fc2e4d704   Oleg Nesterov   reimplement flush...
2245
  	init_completion(&barr->done);
83c22520c   Oleg Nesterov   flush_cpu_workque...
2246

affee4b29   Tejun Heo   workqueue: reimpl...
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
  	/*
  	 * 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...
2261
  	debug_work_activate(&barr->work);
112202d90   Tejun Heo   workqueue: rename...
2262
  	insert_work(pwq, &barr->work, head,
affee4b29   Tejun Heo   workqueue: reimpl...
2263
  		    work_color_to_flags(WORK_NO_COLOR) | linked);
fc2e4d704   Oleg Nesterov   reimplement flush...
2264
  }
73f53c4aa   Tejun Heo   workqueue: reimpl...
2265
  /**
112202d90   Tejun Heo   workqueue: rename...
2266
   * flush_workqueue_prep_pwqs - prepare pwqs for workqueue flushing
73f53c4aa   Tejun Heo   workqueue: reimpl...
2267
2268
2269
2270
   * @wq: workqueue being flushed
   * @flush_color: new flush color, < 0 for no-op
   * @work_color: new work color, < 0 for no-op
   *
112202d90   Tejun Heo   workqueue: rename...
2271
   * Prepare pwqs for workqueue flushing.
73f53c4aa   Tejun Heo   workqueue: reimpl...
2272
   *
112202d90   Tejun Heo   workqueue: rename...
2273
2274
2275
2276
2277
   * If @flush_color is non-negative, flush_color on all pwqs should be
   * -1.  If no pwq has in-flight commands at the specified color, all
   * pwq->flush_color's stay at -1 and %false is returned.  If any pwq
   * has in flight commands, its pwq->flush_color is set to
   * @flush_color, @wq->nr_pwqs_to_flush is updated accordingly, pwq
73f53c4aa   Tejun Heo   workqueue: reimpl...
2278
2279
2280
2281
2282
2283
2284
   * 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.
   *
112202d90   Tejun Heo   workqueue: rename...
2285
   * If @work_color is non-negative, all pwqs should have the same
73f53c4aa   Tejun Heo   workqueue: reimpl...
2286
2287
2288
2289
   * work_color which is previous to @work_color and all will be
   * advanced to @work_color.
   *
   * CONTEXT:
3c25a55da   Lai Jiangshan   workqueue: rename...
2290
   * mutex_lock(wq->mutex).
73f53c4aa   Tejun Heo   workqueue: reimpl...
2291
   *
d185af300   Yacine Belkadi   workqueue: fix so...
2292
   * Return:
73f53c4aa   Tejun Heo   workqueue: reimpl...
2293
2294
2295
   * %true if @flush_color >= 0 and there's something to flush.  %false
   * otherwise.
   */
112202d90   Tejun Heo   workqueue: rename...
2296
  static bool flush_workqueue_prep_pwqs(struct workqueue_struct *wq,
73f53c4aa   Tejun Heo   workqueue: reimpl...
2297
  				      int flush_color, int work_color)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2298
  {
73f53c4aa   Tejun Heo   workqueue: reimpl...
2299
  	bool wait = false;
49e3cf44d   Tejun Heo   workqueue: replac...
2300
  	struct pool_workqueue *pwq;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2301

73f53c4aa   Tejun Heo   workqueue: reimpl...
2302
  	if (flush_color >= 0) {
6183c009f   Tejun Heo   workqueue: make s...
2303
  		WARN_ON_ONCE(atomic_read(&wq->nr_pwqs_to_flush));
112202d90   Tejun Heo   workqueue: rename...
2304
  		atomic_set(&wq->nr_pwqs_to_flush, 1);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2305
  	}
2355b70fd   Lai Jiangshan   workqueue: avoid ...
2306

49e3cf44d   Tejun Heo   workqueue: replac...
2307
  	for_each_pwq(pwq, wq) {
112202d90   Tejun Heo   workqueue: rename...
2308
  		struct worker_pool *pool = pwq->pool;
fc2e4d704   Oleg Nesterov   reimplement flush...
2309

b09f4fd39   Lai Jiangshan   workqueue: protec...
2310
  		spin_lock_irq(&pool->lock);
83c22520c   Oleg Nesterov   flush_cpu_workque...
2311

73f53c4aa   Tejun Heo   workqueue: reimpl...
2312
  		if (flush_color >= 0) {
6183c009f   Tejun Heo   workqueue: make s...
2313
  			WARN_ON_ONCE(pwq->flush_color != -1);
fc2e4d704   Oleg Nesterov   reimplement flush...
2314

112202d90   Tejun Heo   workqueue: rename...
2315
2316
2317
  			if (pwq->nr_in_flight[flush_color]) {
  				pwq->flush_color = flush_color;
  				atomic_inc(&wq->nr_pwqs_to_flush);
73f53c4aa   Tejun Heo   workqueue: reimpl...
2318
2319
2320
  				wait = true;
  			}
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2321

73f53c4aa   Tejun Heo   workqueue: reimpl...
2322
  		if (work_color >= 0) {
6183c009f   Tejun Heo   workqueue: make s...
2323
  			WARN_ON_ONCE(work_color != work_next_color(pwq->work_color));
112202d90   Tejun Heo   workqueue: rename...
2324
  			pwq->work_color = work_color;
73f53c4aa   Tejun Heo   workqueue: reimpl...
2325
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2326

b09f4fd39   Lai Jiangshan   workqueue: protec...
2327
  		spin_unlock_irq(&pool->lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2328
  	}
2355b70fd   Lai Jiangshan   workqueue: avoid ...
2329

112202d90   Tejun Heo   workqueue: rename...
2330
  	if (flush_color >= 0 && atomic_dec_and_test(&wq->nr_pwqs_to_flush))
73f53c4aa   Tejun Heo   workqueue: reimpl...
2331
  		complete(&wq->first_flusher->done);
14441960e   Oleg Nesterov   simplify cleanup_...
2332

73f53c4aa   Tejun Heo   workqueue: reimpl...
2333
  	return wait;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2334
  }
0fcb78c22   Rolf Eike Beer   [PATCH] Add DocBo...
2335
  /**
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2336
   * flush_workqueue - ensure that any scheduled work has run to completion.
0fcb78c22   Rolf Eike Beer   [PATCH] Add DocBo...
2337
   * @wq: workqueue to flush
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2338
   *
c5aa87bbf   Tejun Heo   workqueue: update...
2339
2340
   * This function sleeps until all work items which were queued on entry
   * have finished execution, but it is not livelocked by new incoming ones.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2341
   */
7ad5b3a50   Harvey Harrison   kernel: remove fa...
2342
  void flush_workqueue(struct workqueue_struct *wq)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2343
  {
73f53c4aa   Tejun Heo   workqueue: reimpl...
2344
2345
2346
2347
2348
2349
  	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
2350

3295f0ef9   Ingo Molnar   lockdep: rename m...
2351
2352
  	lock_map_acquire(&wq->lockdep_map);
  	lock_map_release(&wq->lockdep_map);
73f53c4aa   Tejun Heo   workqueue: reimpl...
2353

3c25a55da   Lai Jiangshan   workqueue: rename...
2354
  	mutex_lock(&wq->mutex);
73f53c4aa   Tejun Heo   workqueue: reimpl...
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
  
  	/*
  	 * 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.
  		 */
6183c009f   Tejun Heo   workqueue: make s...
2367
  		WARN_ON_ONCE(!list_empty(&wq->flusher_overflow));
73f53c4aa   Tejun Heo   workqueue: reimpl...
2368
2369
2370
2371
2372
  		this_flusher.flush_color = wq->work_color;
  		wq->work_color = next_color;
  
  		if (!wq->first_flusher) {
  			/* no flush in progress, become the first flusher */
6183c009f   Tejun Heo   workqueue: make s...
2373
  			WARN_ON_ONCE(wq->flush_color != this_flusher.flush_color);
73f53c4aa   Tejun Heo   workqueue: reimpl...
2374
2375
  
  			wq->first_flusher = &this_flusher;
112202d90   Tejun Heo   workqueue: rename...
2376
  			if (!flush_workqueue_prep_pwqs(wq, wq->flush_color,
73f53c4aa   Tejun Heo   workqueue: reimpl...
2377
2378
2379
2380
2381
2382
2383
2384
  						       wq->work_color)) {
  				/* nothing to flush, done */
  				wq->flush_color = next_color;
  				wq->first_flusher = NULL;
  				goto out_unlock;
  			}
  		} else {
  			/* wait in queue */
6183c009f   Tejun Heo   workqueue: make s...
2385
  			WARN_ON_ONCE(wq->flush_color == this_flusher.flush_color);
73f53c4aa   Tejun Heo   workqueue: reimpl...
2386
  			list_add_tail(&this_flusher.list, &wq->flusher_queue);
112202d90   Tejun Heo   workqueue: rename...
2387
  			flush_workqueue_prep_pwqs(wq, -1, wq->work_color);
73f53c4aa   Tejun Heo   workqueue: reimpl...
2388
2389
2390
2391
2392
2393
2394
2395
2396
  		}
  	} 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);
  	}
3c25a55da   Lai Jiangshan   workqueue: rename...
2397
  	mutex_unlock(&wq->mutex);
73f53c4aa   Tejun Heo   workqueue: reimpl...
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
  
  	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;
3c25a55da   Lai Jiangshan   workqueue: rename...
2409
  	mutex_lock(&wq->mutex);
73f53c4aa   Tejun Heo   workqueue: reimpl...
2410

4ce48b37b   Tejun Heo   workqueue: fix ra...
2411
2412
2413
  	/* we might have raced, check again with mutex held */
  	if (wq->first_flusher != &this_flusher)
  		goto out_unlock;
73f53c4aa   Tejun Heo   workqueue: reimpl...
2414
  	wq->first_flusher = NULL;
6183c009f   Tejun Heo   workqueue: make s...
2415
2416
  	WARN_ON_ONCE(!list_empty(&this_flusher.list));
  	WARN_ON_ONCE(wq->flush_color != this_flusher.flush_color);
73f53c4aa   Tejun Heo   workqueue: reimpl...
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
  
  	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);
  		}
6183c009f   Tejun Heo   workqueue: make s...
2428
2429
  		WARN_ON_ONCE(!list_empty(&wq->flusher_overflow) &&
  			     wq->flush_color != work_next_color(wq->work_color));
73f53c4aa   Tejun Heo   workqueue: reimpl...
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
  
  		/* 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);
112202d90   Tejun Heo   workqueue: rename...
2449
  			flush_workqueue_prep_pwqs(wq, -1, wq->work_color);
73f53c4aa   Tejun Heo   workqueue: reimpl...
2450
2451
2452
  		}
  
  		if (list_empty(&wq->flusher_queue)) {
6183c009f   Tejun Heo   workqueue: make s...
2453
  			WARN_ON_ONCE(wq->flush_color != wq->work_color);
73f53c4aa   Tejun Heo   workqueue: reimpl...
2454
2455
2456
2457
2458
  			break;
  		}
  
  		/*
  		 * Need to flush more colors.  Make the next flusher
112202d90   Tejun Heo   workqueue: rename...
2459
  		 * the new first flusher and arm pwqs.
73f53c4aa   Tejun Heo   workqueue: reimpl...
2460
  		 */
6183c009f   Tejun Heo   workqueue: make s...
2461
2462
  		WARN_ON_ONCE(wq->flush_color == wq->work_color);
  		WARN_ON_ONCE(wq->flush_color != next->flush_color);
73f53c4aa   Tejun Heo   workqueue: reimpl...
2463
2464
2465
  
  		list_del_init(&next->list);
  		wq->first_flusher = next;
112202d90   Tejun Heo   workqueue: rename...
2466
  		if (flush_workqueue_prep_pwqs(wq, wq->flush_color, -1))
73f53c4aa   Tejun Heo   workqueue: reimpl...
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
  			break;
  
  		/*
  		 * Meh... this color is already done, clear first
  		 * flusher and repeat cascading.
  		 */
  		wq->first_flusher = NULL;
  	}
  
  out_unlock:
3c25a55da   Lai Jiangshan   workqueue: rename...
2477
  	mutex_unlock(&wq->mutex);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2478
  }
ae90dd5db   Dave Jones   Move workqueue ex...
2479
  EXPORT_SYMBOL_GPL(flush_workqueue);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2480

9c5a2ba70   Tejun Heo   workqueue: separa...
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
  /**
   * 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;
49e3cf44d   Tejun Heo   workqueue: replac...
2495
  	struct pool_workqueue *pwq;
9c5a2ba70   Tejun Heo   workqueue: separa...
2496
2497
2498
2499
  
  	/*
  	 * __queue_work() needs to test whether there are drainers, is much
  	 * hotter than drain_workqueue() and already looks at @wq->flags.
618b01eb4   Tejun Heo   workqueue: make i...
2500
  	 * Use __WQ_DRAINING so that queue doesn't have to check nr_drainers.
9c5a2ba70   Tejun Heo   workqueue: separa...
2501
  	 */
87fc741e9   Lai Jiangshan   workqueue: protec...
2502
  	mutex_lock(&wq->mutex);
9c5a2ba70   Tejun Heo   workqueue: separa...
2503
  	if (!wq->nr_drainers++)
618b01eb4   Tejun Heo   workqueue: make i...
2504
  		wq->flags |= __WQ_DRAINING;
87fc741e9   Lai Jiangshan   workqueue: protec...
2505
  	mutex_unlock(&wq->mutex);
9c5a2ba70   Tejun Heo   workqueue: separa...
2506
2507
  reflush:
  	flush_workqueue(wq);
b09f4fd39   Lai Jiangshan   workqueue: protec...
2508
  	mutex_lock(&wq->mutex);
76af4d936   Tejun Heo   workqueue: update...
2509

49e3cf44d   Tejun Heo   workqueue: replac...
2510
  	for_each_pwq(pwq, wq) {
fa2563e41   Thomas Tuttle   workqueue: lock c...
2511
  		bool drained;
9c5a2ba70   Tejun Heo   workqueue: separa...
2512

b09f4fd39   Lai Jiangshan   workqueue: protec...
2513
  		spin_lock_irq(&pwq->pool->lock);
112202d90   Tejun Heo   workqueue: rename...
2514
  		drained = !pwq->nr_active && list_empty(&pwq->delayed_works);
b09f4fd39   Lai Jiangshan   workqueue: protec...
2515
  		spin_unlock_irq(&pwq->pool->lock);
fa2563e41   Thomas Tuttle   workqueue: lock c...
2516
2517
  
  		if (drained)
9c5a2ba70   Tejun Heo   workqueue: separa...
2518
2519
2520
2521
  			continue;
  
  		if (++flush_cnt == 10 ||
  		    (flush_cnt % 100 == 0 && flush_cnt <= 1000))
c5aa87bbf   Tejun Heo   workqueue: update...
2522
2523
  			pr_warn("workqueue %s: drain_workqueue() isn't complete after %u tries
  ",
044c782ce   Valentin Ilie   workqueue: fix ch...
2524
  				wq->name, flush_cnt);
76af4d936   Tejun Heo   workqueue: update...
2525

b09f4fd39   Lai Jiangshan   workqueue: protec...
2526
  		mutex_unlock(&wq->mutex);
9c5a2ba70   Tejun Heo   workqueue: separa...
2527
2528
  		goto reflush;
  	}
9c5a2ba70   Tejun Heo   workqueue: separa...
2529
  	if (!--wq->nr_drainers)
618b01eb4   Tejun Heo   workqueue: make i...
2530
  		wq->flags &= ~__WQ_DRAINING;
87fc741e9   Lai Jiangshan   workqueue: protec...
2531
  	mutex_unlock(&wq->mutex);
9c5a2ba70   Tejun Heo   workqueue: separa...
2532
2533
  }
  EXPORT_SYMBOL_GPL(drain_workqueue);
606a5020b   Tejun Heo   workqueue: gut fl...
2534
  static bool start_flush_work(struct work_struct *work, struct wq_barrier *barr)
db7008972   Oleg Nesterov   workqueues: imple...
2535
  {
affee4b29   Tejun Heo   workqueue: reimpl...
2536
  	struct worker *worker = NULL;
c9e7cf273   Tejun Heo   workqueue: move b...
2537
  	struct worker_pool *pool;
112202d90   Tejun Heo   workqueue: rename...
2538
  	struct pool_workqueue *pwq;
db7008972   Oleg Nesterov   workqueues: imple...
2539
2540
  
  	might_sleep();
fa1b54e69   Tejun Heo   workqueue: update...
2541
2542
  
  	local_irq_disable();
c9e7cf273   Tejun Heo   workqueue: move b...
2543
  	pool = get_work_pool(work);
fa1b54e69   Tejun Heo   workqueue: update...
2544
2545
  	if (!pool) {
  		local_irq_enable();
baf59022c   Tejun Heo   workqueue: factor...
2546
  		return false;
fa1b54e69   Tejun Heo   workqueue: update...
2547
  	}
db7008972   Oleg Nesterov   workqueues: imple...
2548

fa1b54e69   Tejun Heo   workqueue: update...
2549
  	spin_lock(&pool->lock);
0b3dae68a   Lai Jiangshan   workqueue: simpli...
2550
  	/* see the comment in try_to_grab_pending() with the same code */
112202d90   Tejun Heo   workqueue: rename...
2551
2552
2553
  	pwq = get_work_pwq(work);
  	if (pwq) {
  		if (unlikely(pwq->pool != pool))
4690c4ab5   Tejun Heo   workqueue: misc/c...
2554
  			goto already_gone;
606a5020b   Tejun Heo   workqueue: gut fl...
2555
  	} else {
c9e7cf273   Tejun Heo   workqueue: move b...
2556
  		worker = find_worker_executing_work(pool, work);
affee4b29   Tejun Heo   workqueue: reimpl...
2557
  		if (!worker)
4690c4ab5   Tejun Heo   workqueue: misc/c...
2558
  			goto already_gone;
112202d90   Tejun Heo   workqueue: rename...
2559
  		pwq = worker->current_pwq;
606a5020b   Tejun Heo   workqueue: gut fl...
2560
  	}
db7008972   Oleg Nesterov   workqueues: imple...
2561

112202d90   Tejun Heo   workqueue: rename...
2562
  	insert_wq_barrier(pwq, barr, work, worker);
d565ed630   Tejun Heo   workqueue: move g...
2563
  	spin_unlock_irq(&pool->lock);
7a22ad757   Tejun Heo   workqueue: carry ...
2564

e159489ba   Tejun Heo   workqueue: relax ...
2565
2566
2567
2568
2569
2570
  	/*
  	 * 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.
  	 */
493008a8e   Tejun Heo   workqueue: drop W...
2571
  	if (pwq->wq->saved_max_active == 1 || pwq->wq->rescuer)
112202d90   Tejun Heo   workqueue: rename...
2572
  		lock_map_acquire(&pwq->wq->lockdep_map);
e159489ba   Tejun Heo   workqueue: relax ...
2573
  	else
112202d90   Tejun Heo   workqueue: rename...
2574
2575
  		lock_map_acquire_read(&pwq->wq->lockdep_map);
  	lock_map_release(&pwq->wq->lockdep_map);
e159489ba   Tejun Heo   workqueue: relax ...
2576

401a8d048   Tejun Heo   workqueue: cleanu...
2577
  	return true;
4690c4ab5   Tejun Heo   workqueue: misc/c...
2578
  already_gone:
d565ed630   Tejun Heo   workqueue: move g...
2579
  	spin_unlock_irq(&pool->lock);
401a8d048   Tejun Heo   workqueue: cleanu...
2580
  	return false;
db7008972   Oleg Nesterov   workqueues: imple...
2581
  }
baf59022c   Tejun Heo   workqueue: factor...
2582
2583
2584
2585
2586
  
  /**
   * flush_work - wait for a work to finish executing the last queueing instance
   * @work: the work to flush
   *
606a5020b   Tejun Heo   workqueue: gut fl...
2587
2588
   * Wait until @work has finished execution.  @work is guaranteed to be idle
   * on return if it hasn't been requeued since flush started.
baf59022c   Tejun Heo   workqueue: factor...
2589
   *
d185af300   Yacine Belkadi   workqueue: fix so...
2590
   * Return:
baf59022c   Tejun Heo   workqueue: factor...
2591
2592
2593
2594
2595
   * %true if flush_work() waited for the work to finish execution,
   * %false if it was already idle.
   */
  bool flush_work(struct work_struct *work)
  {
12997d1a9   Bjorn Helgaas   Revert "workqueue...
2596
  	struct wq_barrier barr;
0976dfc1d   Stephen Boyd   workqueue: Catch ...
2597
2598
  	lock_map_acquire(&work->lockdep_map);
  	lock_map_release(&work->lockdep_map);
12997d1a9   Bjorn Helgaas   Revert "workqueue...
2599
2600
2601
2602
2603
2604
2605
  	if (start_flush_work(work, &barr)) {
  		wait_for_completion(&barr.done);
  		destroy_work_on_stack(&barr.work);
  		return true;
  	} else {
  		return false;
  	}
6e84d644b   Oleg Nesterov   make cancel_rearm...
2606
  }
606a5020b   Tejun Heo   workqueue: gut fl...
2607
  EXPORT_SYMBOL_GPL(flush_work);
6e84d644b   Oleg Nesterov   make cancel_rearm...
2608

36e227d24   Tejun Heo   workqueue: reorga...
2609
  static bool __cancel_work_timer(struct work_struct *work, bool is_dwork)
1f1f642e2   Oleg Nesterov   make cancel_xxx_w...
2610
  {
bbb68dfab   Tejun Heo   workqueue: mark a...
2611
  	unsigned long flags;
1f1f642e2   Oleg Nesterov   make cancel_xxx_w...
2612
2613
2614
  	int ret;
  
  	do {
bbb68dfab   Tejun Heo   workqueue: mark a...
2615
2616
2617
2618
2619
2620
  		ret = try_to_grab_pending(work, is_dwork, &flags);
  		/*
  		 * If someone else is canceling, wait for the same event it
  		 * would be waiting for before retrying.
  		 */
  		if (unlikely(ret == -ENOENT))
606a5020b   Tejun Heo   workqueue: gut fl...
2621
  			flush_work(work);
1f1f642e2   Oleg Nesterov   make cancel_xxx_w...
2622
  	} while (unlikely(ret < 0));
bbb68dfab   Tejun Heo   workqueue: mark a...
2623
2624
2625
  	/* tell other tasks trying to grab @work to back off */
  	mark_work_canceling(work);
  	local_irq_restore(flags);
606a5020b   Tejun Heo   workqueue: gut fl...
2626
  	flush_work(work);
7a22ad757   Tejun Heo   workqueue: carry ...
2627
  	clear_work_data(work);
1f1f642e2   Oleg Nesterov   make cancel_xxx_w...
2628
2629
  	return ret;
  }
6e84d644b   Oleg Nesterov   make cancel_rearm...
2630
  /**
401a8d048   Tejun Heo   workqueue: cleanu...
2631
2632
   * cancel_work_sync - cancel a work and wait for it to finish
   * @work: the work to cancel
6e84d644b   Oleg Nesterov   make cancel_rearm...
2633
   *
401a8d048   Tejun Heo   workqueue: cleanu...
2634
2635
2636
2637
   * 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...
2638
   *
401a8d048   Tejun Heo   workqueue: cleanu...
2639
2640
   * 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...
2641
   *
401a8d048   Tejun Heo   workqueue: cleanu...
2642
   * The caller must ensure that the workqueue on which @work was last
6e84d644b   Oleg Nesterov   make cancel_rearm...
2643
   * queued can't be destroyed before this function returns.
401a8d048   Tejun Heo   workqueue: cleanu...
2644
   *
d185af300   Yacine Belkadi   workqueue: fix so...
2645
   * Return:
401a8d048   Tejun Heo   workqueue: cleanu...
2646
   * %true if @work was pending, %false otherwise.
6e84d644b   Oleg Nesterov   make cancel_rearm...
2647
   */
401a8d048   Tejun Heo   workqueue: cleanu...
2648
  bool cancel_work_sync(struct work_struct *work)
6e84d644b   Oleg Nesterov   make cancel_rearm...
2649
  {
36e227d24   Tejun Heo   workqueue: reorga...
2650
  	return __cancel_work_timer(work, false);
b89deed32   Oleg Nesterov   implement flush_w...
2651
  }
28e53bddf   Oleg Nesterov   unify flush_work/...
2652
  EXPORT_SYMBOL_GPL(cancel_work_sync);
b89deed32   Oleg Nesterov   implement flush_w...
2653

6e84d644b   Oleg Nesterov   make cancel_rearm...
2654
  /**
401a8d048   Tejun Heo   workqueue: cleanu...
2655
2656
   * 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...
2657
   *
401a8d048   Tejun Heo   workqueue: cleanu...
2658
2659
2660
   * 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...
2661
   *
d185af300   Yacine Belkadi   workqueue: fix so...
2662
   * Return:
401a8d048   Tejun Heo   workqueue: cleanu...
2663
2664
   * %true if flush_work() waited for the work to finish execution,
   * %false if it was already idle.
6e84d644b   Oleg Nesterov   make cancel_rearm...
2665
   */
401a8d048   Tejun Heo   workqueue: cleanu...
2666
2667
  bool flush_delayed_work(struct delayed_work *dwork)
  {
8930caba3   Tejun Heo   workqueue: disabl...
2668
  	local_irq_disable();
401a8d048   Tejun Heo   workqueue: cleanu...
2669
  	if (del_timer_sync(&dwork->timer))
60c057bca   Lai Jiangshan   workqueue: add de...
2670
  		__queue_work(dwork->cpu, dwork->wq, &dwork->work);
8930caba3   Tejun Heo   workqueue: disabl...
2671
  	local_irq_enable();
401a8d048   Tejun Heo   workqueue: cleanu...
2672
2673
2674
2675
2676
  	return flush_work(&dwork->work);
  }
  EXPORT_SYMBOL(flush_delayed_work);
  
  /**
57b30ae77   Tejun Heo   workqueue: reimpl...
2677
2678
   * cancel_delayed_work - cancel a delayed work
   * @dwork: delayed_work to cancel
09383498c   Tejun Heo   workqueue: implem...
2679
   *
d185af300   Yacine Belkadi   workqueue: fix so...
2680
2681
2682
2683
2684
2685
2686
2687
2688
   * Kill off a pending delayed_work.
   *
   * Return: %true if @dwork was pending and canceled; %false if it wasn't
   * pending.
   *
   * Note:
   * The work callback function may still be running on return, unless
   * it returns %true and the work doesn't re-arm itself.  Explicitly flush or
   * use cancel_delayed_work_sync() to wait on it.
09383498c   Tejun Heo   workqueue: implem...
2689
   *
57b30ae77   Tejun Heo   workqueue: reimpl...
2690
   * This function is safe to call from any context including IRQ handler.
09383498c   Tejun Heo   workqueue: implem...
2691
   */
57b30ae77   Tejun Heo   workqueue: reimpl...
2692
  bool cancel_delayed_work(struct delayed_work *dwork)
09383498c   Tejun Heo   workqueue: implem...
2693
  {
57b30ae77   Tejun Heo   workqueue: reimpl...
2694
2695
2696
2697
2698
2699
2700
2701
2702
  	unsigned long flags;
  	int ret;
  
  	do {
  		ret = try_to_grab_pending(&dwork->work, true, &flags);
  	} while (unlikely(ret == -EAGAIN));
  
  	if (unlikely(ret < 0))
  		return false;
7c3eed5cd   Tejun Heo   workqueue: record...
2703
2704
  	set_work_pool_and_clear_pending(&dwork->work,
  					get_work_pool_id(&dwork->work));
57b30ae77   Tejun Heo   workqueue: reimpl...
2705
  	local_irq_restore(flags);
c0158ca64   Dan Magenheimer   workqueue: cancel...
2706
  	return ret;
09383498c   Tejun Heo   workqueue: implem...
2707
  }
57b30ae77   Tejun Heo   workqueue: reimpl...
2708
  EXPORT_SYMBOL(cancel_delayed_work);
09383498c   Tejun Heo   workqueue: implem...
2709
2710
  
  /**
401a8d048   Tejun Heo   workqueue: cleanu...
2711
2712
2713
2714
2715
   * 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.
   *
d185af300   Yacine Belkadi   workqueue: fix so...
2716
   * Return:
401a8d048   Tejun Heo   workqueue: cleanu...
2717
2718
2719
   * %true if @dwork was pending, %false otherwise.
   */
  bool cancel_delayed_work_sync(struct delayed_work *dwork)
6e84d644b   Oleg Nesterov   make cancel_rearm...
2720
  {
36e227d24   Tejun Heo   workqueue: reorga...
2721
  	return __cancel_work_timer(&dwork->work, true);
6e84d644b   Oleg Nesterov   make cancel_rearm...
2722
  }
f5a421a45   Oleg Nesterov   rename cancel_rea...
2723
  EXPORT_SYMBOL(cancel_delayed_work_sync);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2724

0fcb78c22   Rolf Eike Beer   [PATCH] Add DocBo...
2725
  /**
31ddd871f   Tejun Heo   workqueue: Clarif...
2726
   * schedule_on_each_cpu - execute a function synchronously on each online CPU
b61367732   Andrew Morton   [PATCH] schedule_...
2727
   * @func: the function to call
b61367732   Andrew Morton   [PATCH] schedule_...
2728
   *
31ddd871f   Tejun Heo   workqueue: Clarif...
2729
2730
   * 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_...
2731
   * schedule_on_each_cpu() is very slow.
31ddd871f   Tejun Heo   workqueue: Clarif...
2732
   *
d185af300   Yacine Belkadi   workqueue: fix so...
2733
   * Return:
31ddd871f   Tejun Heo   workqueue: Clarif...
2734
   * 0 on success, -errno on failure.
b61367732   Andrew Morton   [PATCH] schedule_...
2735
   */
65f27f384   David Howells   WorkStruct: Pass ...
2736
  int schedule_on_each_cpu(work_func_t func)
15316ba81   Christoph Lameter   [PATCH] add sched...
2737
2738
  {
  	int cpu;
38f515680   Namhyung Kim   workqueue: add mi...
2739
  	struct work_struct __percpu *works;
15316ba81   Christoph Lameter   [PATCH] add sched...
2740

b61367732   Andrew Morton   [PATCH] schedule_...
2741
2742
  	works = alloc_percpu(struct work_struct);
  	if (!works)
15316ba81   Christoph Lameter   [PATCH] add sched...
2743
  		return -ENOMEM;
b61367732   Andrew Morton   [PATCH] schedule_...
2744

939818009   Tejun Heo   workqueue: fix ra...
2745
  	get_online_cpus();
15316ba81   Christoph Lameter   [PATCH] add sched...
2746
  	for_each_online_cpu(cpu) {
9bfb18392   Ingo Molnar   [PATCH] workqueue...
2747
2748
2749
  		struct work_struct *work = per_cpu_ptr(works, cpu);
  
  		INIT_WORK(work, func);
b71ab8c20   Tejun Heo   workqueue: increa...
2750
  		schedule_work_on(cpu, work);
65a644643   Andi Kleen   HWPOISON: Allow s...
2751
  	}
939818009   Tejun Heo   workqueue: fix ra...
2752
2753
2754
  
  	for_each_online_cpu(cpu)
  		flush_work(per_cpu_ptr(works, cpu));
95402b382   Gautham R Shenoy   cpu-hotplug: repl...
2755
  	put_online_cpus();
b61367732   Andrew Morton   [PATCH] schedule_...
2756
  	free_percpu(works);
15316ba81   Christoph Lameter   [PATCH] add sched...
2757
2758
  	return 0;
  }
eef6a7d5c   Alan Stern   workqueue: warn a...
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
  /**
   * 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
2783
2784
  void flush_scheduled_work(void)
  {
d320c0383   Tejun Heo   workqueue: s/__cr...
2785
  	flush_workqueue(system_wq);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2786
  }
ae90dd5db   Dave Jones   Move workqueue ex...
2787
  EXPORT_SYMBOL(flush_scheduled_work);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2788
2789
  
  /**
1fa44ecad   James Bottomley   [SCSI] add execut...
2790
2791
   * execute_in_process_context - reliably execute the routine with user context
   * @fn:		the function to execute
1fa44ecad   James Bottomley   [SCSI] add execut...
2792
2793
2794
2795
2796
2797
   * @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.
   *
d185af300   Yacine Belkadi   workqueue: fix so...
2798
   * Return:	0 - function was executed
1fa44ecad   James Bottomley   [SCSI] add execut...
2799
2800
   *		1 - function was scheduled for execution
   */
65f27f384   David Howells   WorkStruct: Pass ...
2801
  int execute_in_process_context(work_func_t fn, struct execute_work *ew)
1fa44ecad   James Bottomley   [SCSI] add execut...
2802
2803
  {
  	if (!in_interrupt()) {
65f27f384   David Howells   WorkStruct: Pass ...
2804
  		fn(&ew->work);
1fa44ecad   James Bottomley   [SCSI] add execut...
2805
2806
  		return 0;
  	}
65f27f384   David Howells   WorkStruct: Pass ...
2807
  	INIT_WORK(&ew->work, fn);
1fa44ecad   James Bottomley   [SCSI] add execut...
2808
2809
2810
2811
2812
  	schedule_work(&ew->work);
  
  	return 1;
  }
  EXPORT_SYMBOL_GPL(execute_in_process_context);
226223ab3   Tejun Heo   workqueue: implem...
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
  #ifdef CONFIG_SYSFS
  /*
   * Workqueues with WQ_SYSFS flag set is visible to userland via
   * /sys/bus/workqueue/devices/WQ_NAME.  All visible workqueues have the
   * following attributes.
   *
   *  per_cpu	RO bool	: whether the workqueue is per-cpu or unbound
   *  max_active	RW int	: maximum number of in-flight work items
   *
   * Unbound workqueues have the following extra attributes.
   *
   *  id		RO int	: the associated pool ID
   *  nice	RW int	: nice value of the workers
   *  cpumask	RW mask	: bitmask of allowed CPUs for the workers
   */
  struct wq_device {
  	struct workqueue_struct		*wq;
  	struct device			dev;
  };
  
  static struct workqueue_struct *dev_to_wq(struct device *dev)
  {
  	struct wq_device *wq_dev = container_of(dev, struct wq_device, dev);
  
  	return wq_dev->wq;
  }
1a6661daf   Greg Kroah-Hartman   workqueue: conver...
2839
2840
  static ssize_t per_cpu_show(struct device *dev, struct device_attribute *attr,
  			    char *buf)
226223ab3   Tejun Heo   workqueue: implem...
2841
2842
2843
2844
2845
2846
  {
  	struct workqueue_struct *wq = dev_to_wq(dev);
  
  	return scnprintf(buf, PAGE_SIZE, "%d
  ", (bool)!(wq->flags & WQ_UNBOUND));
  }
1a6661daf   Greg Kroah-Hartman   workqueue: conver...
2847
  static DEVICE_ATTR_RO(per_cpu);
226223ab3   Tejun Heo   workqueue: implem...
2848

1a6661daf   Greg Kroah-Hartman   workqueue: conver...
2849
2850
  static ssize_t max_active_show(struct device *dev,
  			       struct device_attribute *attr, char *buf)
226223ab3   Tejun Heo   workqueue: implem...
2851
2852
2853
2854
2855
2856
  {
  	struct workqueue_struct *wq = dev_to_wq(dev);
  
  	return scnprintf(buf, PAGE_SIZE, "%d
  ", wq->saved_max_active);
  }
1a6661daf   Greg Kroah-Hartman   workqueue: conver...
2857
2858
2859
  static ssize_t max_active_store(struct device *dev,
  				struct device_attribute *attr, const char *buf,
  				size_t count)
226223ab3   Tejun Heo   workqueue: implem...
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
  {
  	struct workqueue_struct *wq = dev_to_wq(dev);
  	int val;
  
  	if (sscanf(buf, "%d", &val) != 1 || val <= 0)
  		return -EINVAL;
  
  	workqueue_set_max_active(wq, val);
  	return count;
  }
1a6661daf   Greg Kroah-Hartman   workqueue: conver...
2870
  static DEVICE_ATTR_RW(max_active);
226223ab3   Tejun Heo   workqueue: implem...
2871

1a6661daf   Greg Kroah-Hartman   workqueue: conver...
2872
2873
2874
2875
  static struct attribute *wq_sysfs_attrs[] = {
  	&dev_attr_per_cpu.attr,
  	&dev_attr_max_active.attr,
  	NULL,
226223ab3   Tejun Heo   workqueue: implem...
2876
  };
1a6661daf   Greg Kroah-Hartman   workqueue: conver...
2877
  ATTRIBUTE_GROUPS(wq_sysfs);
226223ab3   Tejun Heo   workqueue: implem...
2878

d55262c4d   Tejun Heo   workqueue: update...
2879
2880
  static ssize_t wq_pool_ids_show(struct device *dev,
  				struct device_attribute *attr, char *buf)
226223ab3   Tejun Heo   workqueue: implem...
2881
2882
  {
  	struct workqueue_struct *wq = dev_to_wq(dev);
d55262c4d   Tejun Heo   workqueue: update...
2883
2884
  	const char *delim = "";
  	int node, written = 0;
226223ab3   Tejun Heo   workqueue: implem...
2885
2886
  
  	rcu_read_lock_sched();
d55262c4d   Tejun Heo   workqueue: update...
2887
2888
2889
2890
2891
2892
2893
2894
  	for_each_node(node) {
  		written += scnprintf(buf + written, PAGE_SIZE - written,
  				     "%s%d:%d", delim, node,
  				     unbound_pwq_by_node(wq, node)->pool->id);
  		delim = " ";
  	}
  	written += scnprintf(buf + written, PAGE_SIZE - written, "
  ");
226223ab3   Tejun Heo   workqueue: implem...
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
  	rcu_read_unlock_sched();
  
  	return written;
  }
  
  static ssize_t wq_nice_show(struct device *dev, struct device_attribute *attr,
  			    char *buf)
  {
  	struct workqueue_struct *wq = dev_to_wq(dev);
  	int written;
6029a9182   Tejun Heo   workqueue: add wo...
2905
2906
2907
2908
  	mutex_lock(&wq->mutex);
  	written = scnprintf(buf, PAGE_SIZE, "%d
  ", wq->unbound_attrs->nice);
  	mutex_unlock(&wq->mutex);
226223ab3   Tejun Heo   workqueue: implem...
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
  
  	return written;
  }
  
  /* prepare workqueue_attrs for sysfs store operations */
  static struct workqueue_attrs *wq_sysfs_prep_attrs(struct workqueue_struct *wq)
  {
  	struct workqueue_attrs *attrs;
  
  	attrs = alloc_workqueue_attrs(GFP_KERNEL);
  	if (!attrs)
  		return NULL;
6029a9182   Tejun Heo   workqueue: add wo...
2921
2922
2923
  	mutex_lock(&wq->mutex);
  	copy_workqueue_attrs(attrs, wq->unbound_attrs);
  	mutex_unlock(&wq->mutex);
226223ab3   Tejun Heo   workqueue: implem...
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
  	return attrs;
  }
  
  static ssize_t wq_nice_store(struct device *dev, struct device_attribute *attr,
  			     const char *buf, size_t count)
  {
  	struct workqueue_struct *wq = dev_to_wq(dev);
  	struct workqueue_attrs *attrs;
  	int ret;
  
  	attrs = wq_sysfs_prep_attrs(wq);
  	if (!attrs)
  		return -ENOMEM;
  
  	if (sscanf(buf, "%d", &attrs->nice) == 1 &&
144818422   Dongsheng Yang   workqueue: Replac...
2939
  	    attrs->nice >= MIN_NICE && attrs->nice <= MAX_NICE)
226223ab3   Tejun Heo   workqueue: implem...
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
  		ret = apply_workqueue_attrs(wq, attrs);
  	else
  		ret = -EINVAL;
  
  	free_workqueue_attrs(attrs);
  	return ret ?: count;
  }
  
  static ssize_t wq_cpumask_show(struct device *dev,
  			       struct device_attribute *attr, char *buf)
  {
  	struct workqueue_struct *wq = dev_to_wq(dev);
  	int written;
6029a9182   Tejun Heo   workqueue: add wo...
2953
2954
2955
  	mutex_lock(&wq->mutex);
  	written = cpumask_scnprintf(buf, PAGE_SIZE, wq->unbound_attrs->cpumask);
  	mutex_unlock(&wq->mutex);
226223ab3   Tejun Heo   workqueue: implem...
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
  
  	written += scnprintf(buf + written, PAGE_SIZE - written, "
  ");
  	return written;
  }
  
  static ssize_t wq_cpumask_store(struct device *dev,
  				struct device_attribute *attr,
  				const char *buf, size_t count)
  {
  	struct workqueue_struct *wq = dev_to_wq(dev);
  	struct workqueue_attrs *attrs;
  	int ret;
  
  	attrs = wq_sysfs_prep_attrs(wq);
  	if (!attrs)
  		return -ENOMEM;
  
  	ret = cpumask_parse(buf, attrs->cpumask);
  	if (!ret)
  		ret = apply_workqueue_attrs(wq, attrs);
  
  	free_workqueue_attrs(attrs);
  	return ret ?: count;
  }
d55262c4d   Tejun Heo   workqueue: update...
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
  static ssize_t wq_numa_show(struct device *dev, struct device_attribute *attr,
  			    char *buf)
  {
  	struct workqueue_struct *wq = dev_to_wq(dev);
  	int written;
  
  	mutex_lock(&wq->mutex);
  	written = scnprintf(buf, PAGE_SIZE, "%d
  ",
  			    !wq->unbound_attrs->no_numa);
  	mutex_unlock(&wq->mutex);
  
  	return written;
  }
  
  static ssize_t wq_numa_store(struct device *dev, struct device_attribute *attr,
  			     const char *buf, size_t count)
  {
  	struct workqueue_struct *wq = dev_to_wq(dev);
  	struct workqueue_attrs *attrs;
  	int v, ret;
  
  	attrs = wq_sysfs_prep_attrs(wq);
  	if (!attrs)
  		return -ENOMEM;
  
  	ret = -EINVAL;
  	if (sscanf(buf, "%d", &v) == 1) {
  		attrs->no_numa = !v;
  		ret = apply_workqueue_attrs(wq, attrs);
  	}
  
  	free_workqueue_attrs(attrs);
  	return ret ?: count;
  }
226223ab3   Tejun Heo   workqueue: implem...
3016
  static struct device_attribute wq_sysfs_unbound_attrs[] = {
d55262c4d   Tejun Heo   workqueue: update...
3017
  	__ATTR(pool_ids, 0444, wq_pool_ids_show, NULL),
226223ab3   Tejun Heo   workqueue: implem...
3018
3019
  	__ATTR(nice, 0644, wq_nice_show, wq_nice_store),
  	__ATTR(cpumask, 0644, wq_cpumask_show, wq_cpumask_store),
d55262c4d   Tejun Heo   workqueue: update...
3020
  	__ATTR(numa, 0644, wq_numa_show, wq_numa_store),
226223ab3   Tejun Heo   workqueue: implem...
3021
3022
3023
3024
3025
  	__ATTR_NULL,
  };
  
  static struct bus_type wq_subsys = {
  	.name				= "workqueue",
1a6661daf   Greg Kroah-Hartman   workqueue: conver...
3026
  	.dev_groups			= wq_sysfs_groups,
226223ab3   Tejun Heo   workqueue: implem...
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
  };
  
  static int __init wq_sysfs_init(void)
  {
  	return subsys_virtual_register(&wq_subsys, NULL);
  }
  core_initcall(wq_sysfs_init);
  
  static void wq_device_release(struct device *dev)
  {
  	struct wq_device *wq_dev = container_of(dev, struct wq_device, dev);
  
  	kfree(wq_dev);
  }
  
  /**
   * workqueue_sysfs_register - make a workqueue visible in sysfs
   * @wq: the workqueue to register
   *
   * Expose @wq in sysfs under /sys/bus/workqueue/devices.
   * alloc_workqueue*() automatically calls this function if WQ_SYSFS is set
   * which is the preferred method.
   *
   * Workqueue user should use this function directly iff it wants to apply
   * workqueue_attrs before making the workqueue visible in sysfs; otherwise,
   * apply_workqueue_attrs() may race against userland updating the
   * attributes.
   *
d185af300   Yacine Belkadi   workqueue: fix so...
3055
   * Return: 0 on success, -errno on failure.
226223ab3   Tejun Heo   workqueue: implem...
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
   */
  int workqueue_sysfs_register(struct workqueue_struct *wq)
  {
  	struct wq_device *wq_dev;
  	int ret;
  
  	/*
  	 * Adjusting max_active or creating new pwqs by applyting
  	 * attributes breaks ordering guarantee.  Disallow exposing ordered
  	 * workqueues.
  	 */
  	if (WARN_ON(wq->flags & __WQ_ORDERED))
  		return -EINVAL;
  
  	wq->wq_dev = wq_dev = kzalloc(sizeof(*wq_dev), GFP_KERNEL);
  	if (!wq_dev)
  		return -ENOMEM;
  
  	wq_dev->wq = wq;
  	wq_dev->dev.bus = &wq_subsys;
  	wq_dev->dev.init_name = wq->name;
  	wq_dev->dev.release = wq_device_release;
  
  	/*
  	 * unbound_attrs are created separately.  Suppress uevent until
  	 * everything is ready.
  	 */
  	dev_set_uevent_suppress(&wq_dev->dev, true);
  
  	ret = device_register(&wq_dev->dev);
  	if (ret) {
  		kfree(wq_dev);
  		wq->wq_dev = NULL;
  		return ret;
  	}
  
  	if (wq->flags & WQ_UNBOUND) {
  		struct device_attribute *attr;
  
  		for (attr = wq_sysfs_unbound_attrs; attr->attr.name; attr++) {
  			ret = device_create_file(&wq_dev->dev, attr);
  			if (ret) {
  				device_unregister(&wq_dev->dev);
  				wq->wq_dev = NULL;
  				return ret;
  			}
  		}
  	}
bddbceb68   Maxime Bizon   workqueue: fix de...
3104
  	dev_set_uevent_suppress(&wq_dev->dev, false);
226223ab3   Tejun Heo   workqueue: implem...
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
  	kobject_uevent(&wq_dev->dev.kobj, KOBJ_ADD);
  	return 0;
  }
  
  /**
   * workqueue_sysfs_unregister - undo workqueue_sysfs_register()
   * @wq: the workqueue to unregister
   *
   * If @wq is registered to sysfs by workqueue_sysfs_register(), unregister.
   */
  static void workqueue_sysfs_unregister(struct workqueue_struct *wq)
  {
  	struct wq_device *wq_dev = wq->wq_dev;
  
  	if (!wq->wq_dev)
  		return;
  
  	wq->wq_dev = NULL;
  	device_unregister(&wq_dev->dev);
  }
  #else	/* CONFIG_SYSFS */
  static void workqueue_sysfs_unregister(struct workqueue_struct *wq)	{ }
  #endif	/* CONFIG_SYSFS */
7a4e344c5   Tejun Heo   workqueue: introd...
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
  /**
   * free_workqueue_attrs - free a workqueue_attrs
   * @attrs: workqueue_attrs to free
   *
   * Undo alloc_workqueue_attrs().
   */
  void free_workqueue_attrs(struct workqueue_attrs *attrs)
  {
  	if (attrs) {
  		free_cpumask_var(attrs->cpumask);
  		kfree(attrs);
  	}
  }
  
  /**
   * alloc_workqueue_attrs - allocate a workqueue_attrs
   * @gfp_mask: allocation mask to use
   *
   * Allocate a new workqueue_attrs, initialize with default settings and
d185af300   Yacine Belkadi   workqueue: fix so...
3147
3148
3149
   * return it.
   *
   * Return: The allocated new workqueue_attr on success. %NULL on failure.
7a4e344c5   Tejun Heo   workqueue: introd...
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
   */
  struct workqueue_attrs *alloc_workqueue_attrs(gfp_t gfp_mask)
  {
  	struct workqueue_attrs *attrs;
  
  	attrs = kzalloc(sizeof(*attrs), gfp_mask);
  	if (!attrs)
  		goto fail;
  	if (!alloc_cpumask_var(&attrs->cpumask, gfp_mask))
  		goto fail;
13e2e5560   Tejun Heo   workqueue: fix un...
3160
  	cpumask_copy(attrs->cpumask, cpu_possible_mask);
7a4e344c5   Tejun Heo   workqueue: introd...
3161
3162
3163
3164
3165
  	return attrs;
  fail:
  	free_workqueue_attrs(attrs);
  	return NULL;
  }
29c91e991   Tejun Heo   workqueue: implem...
3166
3167
3168
3169
3170
  static void copy_workqueue_attrs(struct workqueue_attrs *to,
  				 const struct workqueue_attrs *from)
  {
  	to->nice = from->nice;
  	cpumask_copy(to->cpumask, from->cpumask);
2865a8fb4   Shaohua Li   workqueue: copy w...
3171
3172
3173
3174
3175
3176
  	/*
  	 * Unlike hash and equality test, this function doesn't ignore
  	 * ->no_numa as it is used for both pool and wq attrs.  Instead,
  	 * get_unbound_pool() explicitly clears ->no_numa after copying.
  	 */
  	to->no_numa = from->no_numa;
29c91e991   Tejun Heo   workqueue: implem...
3177
  }
29c91e991   Tejun Heo   workqueue: implem...
3178
3179
3180
3181
3182
3183
  /* hash value of the content of @attr */
  static u32 wqattrs_hash(const struct workqueue_attrs *attrs)
  {
  	u32 hash = 0;
  
  	hash = jhash_1word(attrs->nice, hash);
13e2e5560   Tejun Heo   workqueue: fix un...
3184
3185
  	hash = jhash(cpumask_bits(attrs->cpumask),
  		     BITS_TO_LONGS(nr_cpumask_bits) * sizeof(long), hash);
29c91e991   Tejun Heo   workqueue: implem...
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
  	return hash;
  }
  
  /* content equality test */
  static bool wqattrs_equal(const struct workqueue_attrs *a,
  			  const struct workqueue_attrs *b)
  {
  	if (a->nice != b->nice)
  		return false;
  	if (!cpumask_equal(a->cpumask, b->cpumask))
  		return false;
  	return true;
  }
7a4e344c5   Tejun Heo   workqueue: introd...
3199
3200
3201
3202
3203
  /**
   * init_worker_pool - initialize a newly zalloc'd worker_pool
   * @pool: worker_pool to initialize
   *
   * Initiailize a newly zalloc'd @pool.  It also allocates @pool->attrs.
d185af300   Yacine Belkadi   workqueue: fix so...
3204
3205
   *
   * Return: 0 on success, -errno on failure.  Even on failure, all fields
29c91e991   Tejun Heo   workqueue: implem...
3206
3207
   * inside @pool proper are initialized and put_unbound_pool() can be called
   * on @pool safely to release it.
7a4e344c5   Tejun Heo   workqueue: introd...
3208
3209
   */
  static int init_worker_pool(struct worker_pool *pool)
4e1a1f9a0   Tejun Heo   workqueue: separa...
3210
3211
  {
  	spin_lock_init(&pool->lock);
29c91e991   Tejun Heo   workqueue: implem...
3212
3213
  	pool->id = -1;
  	pool->cpu = -1;
f3f90ad46   Tejun Heo   workqueue: determ...
3214
  	pool->node = NUMA_NO_NODE;
4e1a1f9a0   Tejun Heo   workqueue: separa...
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
  	pool->flags |= POOL_DISASSOCIATED;
  	INIT_LIST_HEAD(&pool->worklist);
  	INIT_LIST_HEAD(&pool->idle_list);
  	hash_init(pool->busy_hash);
  
  	init_timer_deferrable(&pool->idle_timer);
  	pool->idle_timer.function = idle_worker_timeout;
  	pool->idle_timer.data = (unsigned long)pool;
  
  	setup_timer(&pool->mayday_timer, pool_mayday_timeout,
  		    (unsigned long)pool);
  
  	mutex_init(&pool->manager_arb);
92f9c5c40   Lai Jiangshan   workqueue: rename...
3228
  	mutex_init(&pool->attach_mutex);
da028469b   Lai Jiangshan   workqueue: separa...
3229
  	INIT_LIST_HEAD(&pool->workers);
7a4e344c5   Tejun Heo   workqueue: introd...
3230

7cda9aae0   Lai Jiangshan   workqueue: conver...
3231
  	ida_init(&pool->worker_ida);
29c91e991   Tejun Heo   workqueue: implem...
3232
3233
3234
3235
  	INIT_HLIST_NODE(&pool->hash_node);
  	pool->refcnt = 1;
  
  	/* shouldn't fail above this point */
7a4e344c5   Tejun Heo   workqueue: introd...
3236
3237
3238
3239
  	pool->attrs = alloc_workqueue_attrs(GFP_KERNEL);
  	if (!pool->attrs)
  		return -ENOMEM;
  	return 0;
4e1a1f9a0   Tejun Heo   workqueue: separa...
3240
  }
29c91e991   Tejun Heo   workqueue: implem...
3241
3242
3243
  static void rcu_free_pool(struct rcu_head *rcu)
  {
  	struct worker_pool *pool = container_of(rcu, struct worker_pool, rcu);
7cda9aae0   Lai Jiangshan   workqueue: conver...
3244
  	ida_destroy(&pool->worker_ida);
29c91e991   Tejun Heo   workqueue: implem...
3245
3246
3247
3248
3249
3250
3251
3252
3253
  	free_workqueue_attrs(pool->attrs);
  	kfree(pool);
  }
  
  /**
   * put_unbound_pool - put a worker_pool
   * @pool: worker_pool to put
   *
   * Put @pool.  If its refcnt reaches zero, it gets destroyed in sched-RCU
c5aa87bbf   Tejun Heo   workqueue: update...
3254
3255
3256
   * safe manner.  get_unbound_pool() calls this function on its failure path
   * and this function should be able to release pools which went through,
   * successfully or not, init_worker_pool().
a892cacc7   Tejun Heo   workqueue: move p...
3257
3258
   *
   * Should be called with wq_pool_mutex held.
29c91e991   Tejun Heo   workqueue: implem...
3259
3260
3261
   */
  static void put_unbound_pool(struct worker_pool *pool)
  {
60f5a4bcf   Lai Jiangshan   workqueue: async ...
3262
  	DECLARE_COMPLETION_ONSTACK(detach_completion);
29c91e991   Tejun Heo   workqueue: implem...
3263
  	struct worker *worker;
a892cacc7   Tejun Heo   workqueue: move p...
3264
3265
3266
  	lockdep_assert_held(&wq_pool_mutex);
  
  	if (--pool->refcnt)
29c91e991   Tejun Heo   workqueue: implem...
3267
  		return;
29c91e991   Tejun Heo   workqueue: implem...
3268
3269
  
  	/* sanity checks */
61d0fbb4b   Lai Jiangshan   workqueue: use "p...
3270
  	if (WARN_ON(!(pool->cpu < 0)) ||
a892cacc7   Tejun Heo   workqueue: move p...
3271
  	    WARN_ON(!list_empty(&pool->worklist)))
29c91e991   Tejun Heo   workqueue: implem...
3272
  		return;
29c91e991   Tejun Heo   workqueue: implem...
3273
3274
3275
3276
3277
  
  	/* release id and unhash */
  	if (pool->id >= 0)
  		idr_remove(&worker_pool_idr, pool->id);
  	hash_del(&pool->hash_node);
c5aa87bbf   Tejun Heo   workqueue: update...
3278
3279
3280
  	/*
  	 * Become the manager and destroy all workers.  Grabbing
  	 * manager_arb prevents @pool's workers from blocking on
92f9c5c40   Lai Jiangshan   workqueue: rename...
3281
  	 * attach_mutex.
c5aa87bbf   Tejun Heo   workqueue: update...
3282
  	 */
29c91e991   Tejun Heo   workqueue: implem...
3283
  	mutex_lock(&pool->manager_arb);
29c91e991   Tejun Heo   workqueue: implem...
3284

60f5a4bcf   Lai Jiangshan   workqueue: async ...
3285
  	spin_lock_irq(&pool->lock);
1037de36e   Lai Jiangshan   workqueue: rename...
3286
  	while ((worker = first_idle_worker(pool)))
29c91e991   Tejun Heo   workqueue: implem...
3287
3288
  		destroy_worker(worker);
  	WARN_ON(pool->nr_workers || pool->nr_idle);
29c91e991   Tejun Heo   workqueue: implem...
3289
  	spin_unlock_irq(&pool->lock);
60f5a4bcf   Lai Jiangshan   workqueue: async ...
3290

92f9c5c40   Lai Jiangshan   workqueue: rename...
3291
  	mutex_lock(&pool->attach_mutex);
da028469b   Lai Jiangshan   workqueue: separa...
3292
  	if (!list_empty(&pool->workers))
60f5a4bcf   Lai Jiangshan   workqueue: async ...
3293
  		pool->detach_completion = &detach_completion;
92f9c5c40   Lai Jiangshan   workqueue: rename...
3294
  	mutex_unlock(&pool->attach_mutex);
60f5a4bcf   Lai Jiangshan   workqueue: async ...
3295
3296
3297
  
  	if (pool->detach_completion)
  		wait_for_completion(pool->detach_completion);
29c91e991   Tejun Heo   workqueue: implem...
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
  	mutex_unlock(&pool->manager_arb);
  
  	/* shut down the timers */
  	del_timer_sync(&pool->idle_timer);
  	del_timer_sync(&pool->mayday_timer);
  
  	/* sched-RCU protected to allow dereferences from get_work_pool() */
  	call_rcu_sched(&pool->rcu, rcu_free_pool);
  }
  
  /**
   * get_unbound_pool - get a worker_pool with the specified attributes
   * @attrs: the attributes of the worker_pool to get
   *
   * Obtain a worker_pool which has the same attributes as @attrs, bump the
   * reference count and return it.  If there already is a matching
   * worker_pool, it will be used; otherwise, this function attempts to
d185af300   Yacine Belkadi   workqueue: fix so...
3315
   * create a new one.
a892cacc7   Tejun Heo   workqueue: move p...
3316
3317
   *
   * Should be called with wq_pool_mutex held.
d185af300   Yacine Belkadi   workqueue: fix so...
3318
3319
3320
   *
   * Return: On success, a worker_pool with the same attributes as @attrs.
   * On failure, %NULL.
29c91e991   Tejun Heo   workqueue: implem...
3321
3322
3323
   */
  static struct worker_pool *get_unbound_pool(const struct workqueue_attrs *attrs)
  {
29c91e991   Tejun Heo   workqueue: implem...
3324
3325
  	u32 hash = wqattrs_hash(attrs);
  	struct worker_pool *pool;
f3f90ad46   Tejun Heo   workqueue: determ...
3326
  	int node;
29c91e991   Tejun Heo   workqueue: implem...
3327

a892cacc7   Tejun Heo   workqueue: move p...
3328
  	lockdep_assert_held(&wq_pool_mutex);
29c91e991   Tejun Heo   workqueue: implem...
3329
3330
  
  	/* do we already have a matching pool? */
29c91e991   Tejun Heo   workqueue: implem...
3331
3332
3333
  	hash_for_each_possible(unbound_pool_hash, pool, hash_node, hash) {
  		if (wqattrs_equal(pool->attrs, attrs)) {
  			pool->refcnt++;
3fb1823c0   Lai Jiangshan   workqueue: remove...
3334
  			return pool;
29c91e991   Tejun Heo   workqueue: implem...
3335
3336
  		}
  	}
29c91e991   Tejun Heo   workqueue: implem...
3337
3338
3339
3340
3341
  
  	/* nope, create a new one */
  	pool = kzalloc(sizeof(*pool), GFP_KERNEL);
  	if (!pool || init_worker_pool(pool) < 0)
  		goto fail;
8864b4e59   Tejun Heo   workqueue: implem...
3342
  	lockdep_set_subclass(&pool->lock, 1);	/* see put_pwq() */
29c91e991   Tejun Heo   workqueue: implem...
3343
  	copy_workqueue_attrs(pool->attrs, attrs);
2865a8fb4   Shaohua Li   workqueue: copy w...
3344
3345
3346
3347
3348
  	/*
  	 * no_numa isn't a worker_pool attribute, always clear it.  See
  	 * 'struct workqueue_attrs' comments for detail.
  	 */
  	pool->attrs->no_numa = false;
f3f90ad46   Tejun Heo   workqueue: determ...
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
  	/* if cpumask is contained inside a NUMA node, we belong to that node */
  	if (wq_numa_enabled) {
  		for_each_node(node) {
  			if (cpumask_subset(pool->attrs->cpumask,
  					   wq_numa_possible_cpumask[node])) {
  				pool->node = node;
  				break;
  			}
  		}
  	}
29c91e991   Tejun Heo   workqueue: implem...
3359
3360
3361
3362
  	if (worker_pool_assign_id(pool) < 0)
  		goto fail;
  
  	/* create and start the initial worker */
051e18501   Lai Jiangshan   workqueue: unfold...
3363
  	if (!create_worker(pool))
29c91e991   Tejun Heo   workqueue: implem...
3364
  		goto fail;
29c91e991   Tejun Heo   workqueue: implem...
3365
  	/* install */
29c91e991   Tejun Heo   workqueue: implem...
3366
  	hash_add(unbound_pool_hash, &pool->hash_node, hash);
3fb1823c0   Lai Jiangshan   workqueue: remove...
3367

29c91e991   Tejun Heo   workqueue: implem...
3368
3369
  	return pool;
  fail:
29c91e991   Tejun Heo   workqueue: implem...
3370
3371
3372
3373
  	if (pool)
  		put_unbound_pool(pool);
  	return NULL;
  }
8864b4e59   Tejun Heo   workqueue: implem...
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
  static void rcu_free_pwq(struct rcu_head *rcu)
  {
  	kmem_cache_free(pwq_cache,
  			container_of(rcu, struct pool_workqueue, rcu));
  }
  
  /*
   * Scheduled on system_wq by put_pwq() when an unbound pwq hits zero refcnt
   * and needs to be destroyed.
   */
  static void pwq_unbound_release_workfn(struct work_struct *work)
  {
  	struct pool_workqueue *pwq = container_of(work, struct pool_workqueue,
  						  unbound_release_work);
  	struct workqueue_struct *wq = pwq->wq;
  	struct worker_pool *pool = pwq->pool;
bc0caf099   Tejun Heo   workqueue: fix ra...
3390
  	bool is_last;
8864b4e59   Tejun Heo   workqueue: implem...
3391
3392
3393
  
  	if (WARN_ON_ONCE(!(wq->flags & WQ_UNBOUND)))
  		return;
3c25a55da   Lai Jiangshan   workqueue: rename...
3394
  	mutex_lock(&wq->mutex);
8864b4e59   Tejun Heo   workqueue: implem...
3395
  	list_del_rcu(&pwq->pwqs_node);
bc0caf099   Tejun Heo   workqueue: fix ra...
3396
  	is_last = list_empty(&wq->pwqs);
3c25a55da   Lai Jiangshan   workqueue: rename...
3397
  	mutex_unlock(&wq->mutex);
8864b4e59   Tejun Heo   workqueue: implem...
3398

a892cacc7   Tejun Heo   workqueue: move p...
3399
  	mutex_lock(&wq_pool_mutex);
8864b4e59   Tejun Heo   workqueue: implem...
3400
  	put_unbound_pool(pool);
a892cacc7   Tejun Heo   workqueue: move p...
3401
  	mutex_unlock(&wq_pool_mutex);
8864b4e59   Tejun Heo   workqueue: implem...
3402
3403
3404
3405
3406
3407
  	call_rcu_sched(&pwq->rcu, rcu_free_pwq);
  
  	/*
  	 * If we're the last pwq going away, @wq is already dead and no one
  	 * is gonna access it anymore.  Free it.
  	 */
6029a9182   Tejun Heo   workqueue: add wo...
3408
3409
  	if (is_last) {
  		free_workqueue_attrs(wq->unbound_attrs);
8864b4e59   Tejun Heo   workqueue: implem...
3410
  		kfree(wq);
6029a9182   Tejun Heo   workqueue: add wo...
3411
  	}
8864b4e59   Tejun Heo   workqueue: implem...
3412
  }
0fbd95aa8   Tejun Heo   workqueue: reloca...
3413
  /**
699ce097e   Tejun Heo   workqueue: implem...
3414
   * pwq_adjust_max_active - update a pwq's max_active to the current setting
0fbd95aa8   Tejun Heo   workqueue: reloca...
3415
   * @pwq: target pool_workqueue
0fbd95aa8   Tejun Heo   workqueue: reloca...
3416
   *
699ce097e   Tejun Heo   workqueue: implem...
3417
3418
3419
   * If @pwq isn't freezing, set @pwq->max_active to the associated
   * workqueue's saved_max_active and activate delayed work items
   * accordingly.  If @pwq is freezing, clear @pwq->max_active to zero.
0fbd95aa8   Tejun Heo   workqueue: reloca...
3420
   */
699ce097e   Tejun Heo   workqueue: implem...
3421
  static void pwq_adjust_max_active(struct pool_workqueue *pwq)
0fbd95aa8   Tejun Heo   workqueue: reloca...
3422
  {
699ce097e   Tejun Heo   workqueue: implem...
3423
3424
3425
3426
  	struct workqueue_struct *wq = pwq->wq;
  	bool freezable = wq->flags & WQ_FREEZABLE;
  
  	/* for @wq->saved_max_active */
a357fc032   Lai Jiangshan   workqueue: protec...
3427
  	lockdep_assert_held(&wq->mutex);
699ce097e   Tejun Heo   workqueue: implem...
3428
3429
3430
3431
  
  	/* fast exit for non-freezable wqs */
  	if (!freezable && pwq->max_active == wq->saved_max_active)
  		return;
a357fc032   Lai Jiangshan   workqueue: protec...
3432
  	spin_lock_irq(&pwq->pool->lock);
699ce097e   Tejun Heo   workqueue: implem...
3433

74b414ead   Lai Jiangshan   workqueue: remove...
3434
3435
3436
3437
3438
3439
  	/*
  	 * During [un]freezing, the caller is responsible for ensuring that
  	 * this function is called at least once after @workqueue_freezing
  	 * is updated and visible.
  	 */
  	if (!freezable || !workqueue_freezing) {
699ce097e   Tejun Heo   workqueue: implem...
3440
  		pwq->max_active = wq->saved_max_active;
0fbd95aa8   Tejun Heo   workqueue: reloca...
3441

699ce097e   Tejun Heo   workqueue: implem...
3442
3443
3444
  		while (!list_empty(&pwq->delayed_works) &&
  		       pwq->nr_active < pwq->max_active)
  			pwq_activate_first_delayed(pwq);
951a078a5   Lai Jiangshan   workqueue: kick a...
3445
3446
3447
3448
3449
3450
  
  		/*
  		 * Need to kick a worker after thawed or an unbound wq's
  		 * max_active is bumped.  It's a slow path.  Do it always.
  		 */
  		wake_up_worker(pwq->pool);
699ce097e   Tejun Heo   workqueue: implem...
3451
3452
3453
  	} else {
  		pwq->max_active = 0;
  	}
a357fc032   Lai Jiangshan   workqueue: protec...
3454
  	spin_unlock_irq(&pwq->pool->lock);
0fbd95aa8   Tejun Heo   workqueue: reloca...
3455
  }
e50aba9ae   Tejun Heo   workqueue: use NU...
3456
  /* initialize newly alloced @pwq which is associated with @wq and @pool */
f147f29eb   Tejun Heo   workqueue: break ...
3457
3458
  static void init_pwq(struct pool_workqueue *pwq, struct workqueue_struct *wq,
  		     struct worker_pool *pool)
d2c1d4048   Tejun Heo   workqueue: restru...
3459
3460
  {
  	BUG_ON((unsigned long)pwq & WORK_STRUCT_FLAG_MASK);
e50aba9ae   Tejun Heo   workqueue: use NU...
3461
  	memset(pwq, 0, sizeof(*pwq));
d2c1d4048   Tejun Heo   workqueue: restru...
3462
3463
3464
  	pwq->pool = pool;
  	pwq->wq = wq;
  	pwq->flush_color = -1;
8864b4e59   Tejun Heo   workqueue: implem...
3465
  	pwq->refcnt = 1;
d2c1d4048   Tejun Heo   workqueue: restru...
3466
  	INIT_LIST_HEAD(&pwq->delayed_works);
1befcf307   Tejun Heo   workqueue: introd...
3467
  	INIT_LIST_HEAD(&pwq->pwqs_node);
d2c1d4048   Tejun Heo   workqueue: restru...
3468
  	INIT_LIST_HEAD(&pwq->mayday_node);
8864b4e59   Tejun Heo   workqueue: implem...
3469
  	INIT_WORK(&pwq->unbound_release_work, pwq_unbound_release_workfn);
f147f29eb   Tejun Heo   workqueue: break ...
3470
  }
d2c1d4048   Tejun Heo   workqueue: restru...
3471

f147f29eb   Tejun Heo   workqueue: break ...
3472
  /* sync @pwq with the current state of its associated wq and link it */
1befcf307   Tejun Heo   workqueue: introd...
3473
  static void link_pwq(struct pool_workqueue *pwq)
f147f29eb   Tejun Heo   workqueue: break ...
3474
3475
3476
3477
  {
  	struct workqueue_struct *wq = pwq->wq;
  
  	lockdep_assert_held(&wq->mutex);
75ccf5950   Tejun Heo   workqueue: prepar...
3478

1befcf307   Tejun Heo   workqueue: introd...
3479
3480
3481
  	/* may be called multiple times, ignore if already linked */
  	if (!list_empty(&pwq->pwqs_node))
  		return;
29b1cb416   Lai Jiangshan   workqueue: remove...
3482
  	/* set the matching work_color */
75ccf5950   Tejun Heo   workqueue: prepar...
3483
  	pwq->work_color = wq->work_color;
983ca25e7   Tejun Heo   workqueue: fix ma...
3484
3485
3486
3487
3488
  
  	/* sync max_active to the current setting */
  	pwq_adjust_max_active(pwq);
  
  	/* link in @pwq */
9e8cd2f58   Tejun Heo   workqueue: implem...
3489
  	list_add_rcu(&pwq->pwqs_node, &wq->pwqs);
f147f29eb   Tejun Heo   workqueue: break ...
3490
  }
a357fc032   Lai Jiangshan   workqueue: protec...
3491

f147f29eb   Tejun Heo   workqueue: break ...
3492
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
  /* obtain a pool matching @attr and create a pwq associating the pool and @wq */
  static struct pool_workqueue *alloc_unbound_pwq(struct workqueue_struct *wq,
  					const struct workqueue_attrs *attrs)
  {
  	struct worker_pool *pool;
  	struct pool_workqueue *pwq;
  
  	lockdep_assert_held(&wq_pool_mutex);
  
  	pool = get_unbound_pool(attrs);
  	if (!pool)
  		return NULL;
e50aba9ae   Tejun Heo   workqueue: use NU...
3504
  	pwq = kmem_cache_alloc_node(pwq_cache, GFP_KERNEL, pool->node);
f147f29eb   Tejun Heo   workqueue: break ...
3505
3506
3507
  	if (!pwq) {
  		put_unbound_pool(pool);
  		return NULL;
df2d5ae49   Tejun Heo   workqueue: map an...
3508
  	}
6029a9182   Tejun Heo   workqueue: add wo...
3509

f147f29eb   Tejun Heo   workqueue: break ...
3510
3511
  	init_pwq(pwq, wq, pool);
  	return pwq;
d2c1d4048   Tejun Heo   workqueue: restru...
3512
  }
4c16bd327   Tejun Heo   workqueue: implem...
3513
3514
3515
3516
3517
3518
3519
  /* undo alloc_unbound_pwq(), used only in the error path */
  static void free_unbound_pwq(struct pool_workqueue *pwq)
  {
  	lockdep_assert_held(&wq_pool_mutex);
  
  	if (pwq) {
  		put_unbound_pool(pwq->pool);
cece95dfe   Wei Yongjun   workqueue: use km...
3520
  		kmem_cache_free(pwq_cache, pwq);
4c16bd327   Tejun Heo   workqueue: implem...
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
  	}
  }
  
  /**
   * wq_calc_node_mask - calculate a wq_attrs' cpumask for the specified node
   * @attrs: the wq_attrs of interest
   * @node: the target NUMA node
   * @cpu_going_down: if >= 0, the CPU to consider as offline
   * @cpumask: outarg, the resulting cpumask
   *
   * Calculate the cpumask a workqueue with @attrs should use on @node.  If
   * @cpu_going_down is >= 0, that cpu is considered offline during
d185af300   Yacine Belkadi   workqueue: fix so...
3533
   * calculation.  The result is stored in @cpumask.
4c16bd327   Tejun Heo   workqueue: implem...
3534
3535
3536
3537
3538
3539
3540
3541
   *
   * If NUMA affinity is not enabled, @attrs->cpumask is always used.  If
   * enabled and @node has online CPUs requested by @attrs, the returned
   * cpumask is the intersection of the possible CPUs of @node and
   * @attrs->cpumask.
   *
   * The caller is responsible for ensuring that the cpumask of @node stays
   * stable.
d185af300   Yacine Belkadi   workqueue: fix so...
3542
3543
3544
   *
   * Return: %true if the resulting @cpumask is different from @attrs->cpumask,
   * %false if equal.
4c16bd327   Tejun Heo   workqueue: implem...
3545
3546
3547
3548
   */
  static bool wq_calc_node_cpumask(const struct workqueue_attrs *attrs, int node,
  				 int cpu_going_down, cpumask_t *cpumask)
  {
d55262c4d   Tejun Heo   workqueue: update...
3549
  	if (!wq_numa_enabled || attrs->no_numa)
4c16bd327   Tejun Heo   workqueue: implem...
3550
3551
3552
3553
3554
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564
3565
3566
3567
  		goto use_dfl;
  
  	/* does @node have any online CPUs @attrs wants? */
  	cpumask_and(cpumask, cpumask_of_node(node), attrs->cpumask);
  	if (cpu_going_down >= 0)
  		cpumask_clear_cpu(cpu_going_down, cpumask);
  
  	if (cpumask_empty(cpumask))
  		goto use_dfl;
  
  	/* yeap, return possible CPUs in @node that @attrs wants */
  	cpumask_and(cpumask, attrs->cpumask, wq_numa_possible_cpumask[node]);
  	return !cpumask_equal(cpumask, attrs->cpumask);
  
  use_dfl:
  	cpumask_copy(cpumask, attrs->cpumask);
  	return false;
  }
1befcf307   Tejun Heo   workqueue: introd...
3568
3569
3570
3571
3572
3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583
  /* install @pwq into @wq's numa_pwq_tbl[] for @node and return the old pwq */
  static struct pool_workqueue *numa_pwq_tbl_install(struct workqueue_struct *wq,
  						   int node,
  						   struct pool_workqueue *pwq)
  {
  	struct pool_workqueue *old_pwq;
  
  	lockdep_assert_held(&wq->mutex);
  
  	/* link_pwq() can handle duplicate calls */
  	link_pwq(pwq);
  
  	old_pwq = rcu_access_pointer(wq->numa_pwq_tbl[node]);
  	rcu_assign_pointer(wq->numa_pwq_tbl[node], pwq);
  	return old_pwq;
  }
9e8cd2f58   Tejun Heo   workqueue: implem...
3584
3585
3586
3587
3588
  /**
   * apply_workqueue_attrs - apply new workqueue_attrs to an unbound workqueue
   * @wq: the target workqueue
   * @attrs: the workqueue_attrs to apply, allocated with alloc_workqueue_attrs()
   *
4c16bd327   Tejun Heo   workqueue: implem...
3589
3590
3591
3592
3593
3594
   * Apply @attrs to an unbound workqueue @wq.  Unless disabled, on NUMA
   * machines, this function maps a separate pwq to each NUMA node with
   * possibles CPUs in @attrs->cpumask so that work items are affine to the
   * NUMA node it was issued on.  Older pwqs are released as in-flight work
   * items finish.  Note that a work item which repeatedly requeues itself
   * back-to-back will stay on its current pwq.
9e8cd2f58   Tejun Heo   workqueue: implem...
3595
   *
d185af300   Yacine Belkadi   workqueue: fix so...
3596
3597
3598
   * Performs GFP_KERNEL allocations.
   *
   * Return: 0 on success and -errno on failure.
9e8cd2f58   Tejun Heo   workqueue: implem...
3599
3600
3601
3602
   */
  int apply_workqueue_attrs(struct workqueue_struct *wq,
  			  const struct workqueue_attrs *attrs)
  {
4c16bd327   Tejun Heo   workqueue: implem...
3603
3604
  	struct workqueue_attrs *new_attrs, *tmp_attrs;
  	struct pool_workqueue **pwq_tbl, *dfl_pwq;
f147f29eb   Tejun Heo   workqueue: break ...
3605
  	int node, ret;
9e8cd2f58   Tejun Heo   workqueue: implem...
3606

8719dceae   Tejun Heo   workqueue: reject...
3607
  	/* only unbound workqueues can change attributes */
9e8cd2f58   Tejun Heo   workqueue: implem...
3608
3609
  	if (WARN_ON(!(wq->flags & WQ_UNBOUND)))
  		return -EINVAL;
8719dceae   Tejun Heo   workqueue: reject...
3610
3611
3612
  	/* creating multiple pwqs breaks ordering guarantee */
  	if (WARN_ON((wq->flags & __WQ_ORDERED) && !list_empty(&wq->pwqs)))
  		return -EINVAL;
ddcb57e2e   Lai Jiangshan   workqueue: use nr...
3613
  	pwq_tbl = kzalloc(nr_node_ids * sizeof(pwq_tbl[0]), GFP_KERNEL);
13e2e5560   Tejun Heo   workqueue: fix un...
3614
  	new_attrs = alloc_workqueue_attrs(GFP_KERNEL);
4c16bd327   Tejun Heo   workqueue: implem...
3615
3616
  	tmp_attrs = alloc_workqueue_attrs(GFP_KERNEL);
  	if (!pwq_tbl || !new_attrs || !tmp_attrs)
13e2e5560   Tejun Heo   workqueue: fix un...
3617
  		goto enomem;
4c16bd327   Tejun Heo   workqueue: implem...
3618
  	/* make a copy of @attrs and sanitize it */
13e2e5560   Tejun Heo   workqueue: fix un...
3619
3620
  	copy_workqueue_attrs(new_attrs, attrs);
  	cpumask_and(new_attrs->cpumask, new_attrs->cpumask, cpu_possible_mask);
4c16bd327   Tejun Heo   workqueue: implem...
3621
3622
3623
3624
3625
3626
3627
3628
3629
3630
3631
3632
3633
  	/*
  	 * We may create multiple pwqs with differing cpumasks.  Make a
  	 * copy of @new_attrs which will be modified and used to obtain
  	 * pools.
  	 */
  	copy_workqueue_attrs(tmp_attrs, new_attrs);
  
  	/*
  	 * CPUs should stay stable across pwq creations and installations.
  	 * Pin CPUs, determine the target cpumask for each node and create
  	 * pwqs accordingly.
  	 */
  	get_online_cpus();
a892cacc7   Tejun Heo   workqueue: move p...
3634
  	mutex_lock(&wq_pool_mutex);
4c16bd327   Tejun Heo   workqueue: implem...
3635
3636
3637
3638
3639
3640
3641
3642
3643
3644
3645
3646
3647
3648
3649
3650
3651
3652
3653
3654
  
  	/*
  	 * If something goes wrong during CPU up/down, we'll fall back to
  	 * the default pwq covering whole @attrs->cpumask.  Always create
  	 * it even if we don't use it immediately.
  	 */
  	dfl_pwq = alloc_unbound_pwq(wq, new_attrs);
  	if (!dfl_pwq)
  		goto enomem_pwq;
  
  	for_each_node(node) {
  		if (wq_calc_node_cpumask(attrs, node, -1, tmp_attrs->cpumask)) {
  			pwq_tbl[node] = alloc_unbound_pwq(wq, tmp_attrs);
  			if (!pwq_tbl[node])
  				goto enomem_pwq;
  		} else {
  			dfl_pwq->refcnt++;
  			pwq_tbl[node] = dfl_pwq;
  		}
  	}
f147f29eb   Tejun Heo   workqueue: break ...
3655
  	mutex_unlock(&wq_pool_mutex);
9e8cd2f58   Tejun Heo   workqueue: implem...
3656

4c16bd327   Tejun Heo   workqueue: implem...
3657
  	/* all pwqs have been created successfully, let's install'em */
f147f29eb   Tejun Heo   workqueue: break ...
3658
  	mutex_lock(&wq->mutex);
a892cacc7   Tejun Heo   workqueue: move p...
3659

f147f29eb   Tejun Heo   workqueue: break ...
3660
  	copy_workqueue_attrs(wq->unbound_attrs, new_attrs);
4c16bd327   Tejun Heo   workqueue: implem...
3661
3662
  
  	/* save the previous pwq and install the new one */
f147f29eb   Tejun Heo   workqueue: break ...
3663
  	for_each_node(node)
4c16bd327   Tejun Heo   workqueue: implem...
3664
3665
3666
3667
3668
  		pwq_tbl[node] = numa_pwq_tbl_install(wq, node, pwq_tbl[node]);
  
  	/* @dfl_pwq might not have been used, ensure it's linked */
  	link_pwq(dfl_pwq);
  	swap(wq->dfl_pwq, dfl_pwq);
f147f29eb   Tejun Heo   workqueue: break ...
3669
3670
  
  	mutex_unlock(&wq->mutex);
9e8cd2f58   Tejun Heo   workqueue: implem...
3671

4c16bd327   Tejun Heo   workqueue: implem...
3672
3673
3674
3675
3676
3677
  	/* put the old pwqs */
  	for_each_node(node)
  		put_pwq_unlocked(pwq_tbl[node]);
  	put_pwq_unlocked(dfl_pwq);
  
  	put_online_cpus();
4862125b0   Tejun Heo   workqueue: fix me...
3678
3679
3680
  	ret = 0;
  	/* fall through */
  out_free:
4c16bd327   Tejun Heo   workqueue: implem...
3681
  	free_workqueue_attrs(tmp_attrs);
4862125b0   Tejun Heo   workqueue: fix me...
3682
  	free_workqueue_attrs(new_attrs);
4c16bd327   Tejun Heo   workqueue: implem...
3683
  	kfree(pwq_tbl);
4862125b0   Tejun Heo   workqueue: fix me...
3684
  	return ret;
13e2e5560   Tejun Heo   workqueue: fix un...
3685

4c16bd327   Tejun Heo   workqueue: implem...
3686
3687
3688
3689
3690
3691
3692
  enomem_pwq:
  	free_unbound_pwq(dfl_pwq);
  	for_each_node(node)
  		if (pwq_tbl && pwq_tbl[node] != dfl_pwq)
  			free_unbound_pwq(pwq_tbl[node]);
  	mutex_unlock(&wq_pool_mutex);
  	put_online_cpus();
13e2e5560   Tejun Heo   workqueue: fix un...
3693
  enomem:
4862125b0   Tejun Heo   workqueue: fix me...
3694
3695
  	ret = -ENOMEM;
  	goto out_free;
9e8cd2f58   Tejun Heo   workqueue: implem...
3696
  }
4c16bd327   Tejun Heo   workqueue: implem...
3697
3698
3699
3700
3701
3702
3703
3704
3705
3706
3707
3708
3709
3710
3711
3712
3713
3714
3715
3716
3717
3718
3719
3720
3721
3722
3723
3724
3725
3726
3727
3728
3729
3730
3731
3732
3733
3734
3735
3736
3737
3738
3739
3740
3741
  /**
   * wq_update_unbound_numa - update NUMA affinity of a wq for CPU hot[un]plug
   * @wq: the target workqueue
   * @cpu: the CPU coming up or going down
   * @online: whether @cpu is coming up or going down
   *
   * This function is to be called from %CPU_DOWN_PREPARE, %CPU_ONLINE and
   * %CPU_DOWN_FAILED.  @cpu is being hot[un]plugged, update NUMA affinity of
   * @wq accordingly.
   *
   * If NUMA affinity can't be adjusted due to memory allocation failure, it
   * falls back to @wq->dfl_pwq which may not be optimal but is always
   * correct.
   *
   * Note that when the last allowed CPU of a NUMA node goes offline for a
   * workqueue with a cpumask spanning multiple nodes, the workers which were
   * already executing the work items for the workqueue will lose their CPU
   * affinity and may execute on any CPU.  This is similar to how per-cpu
   * workqueues behave on CPU_DOWN.  If a workqueue user wants strict
   * affinity, it's the user's responsibility to flush the work item from
   * CPU_DOWN_PREPARE.
   */
  static void wq_update_unbound_numa(struct workqueue_struct *wq, int cpu,
  				   bool online)
  {
  	int node = cpu_to_node(cpu);
  	int cpu_off = online ? -1 : cpu;
  	struct pool_workqueue *old_pwq = NULL, *pwq;
  	struct workqueue_attrs *target_attrs;
  	cpumask_t *cpumask;
  
  	lockdep_assert_held(&wq_pool_mutex);
  
  	if (!wq_numa_enabled || !(wq->flags & WQ_UNBOUND))
  		return;
  
  	/*
  	 * We don't wanna alloc/free wq_attrs for each wq for each CPU.
  	 * Let's use a preallocated one.  The following buf is protected by
  	 * CPU hotplug exclusion.
  	 */
  	target_attrs = wq_update_unbound_numa_attrs_buf;
  	cpumask = target_attrs->cpumask;
  
  	mutex_lock(&wq->mutex);
d55262c4d   Tejun Heo   workqueue: update...
3742
3743
  	if (wq->unbound_attrs->no_numa)
  		goto out_unlock;
4c16bd327   Tejun Heo   workqueue: implem...
3744
3745
3746
3747
3748
3749
3750
3751
  
  	copy_workqueue_attrs(target_attrs, wq->unbound_attrs);
  	pwq = unbound_pwq_by_node(wq, node);
  
  	/*
  	 * Let's determine what needs to be done.  If the target cpumask is
  	 * different from wq's, we need to compare it to @pwq's and create
  	 * a new one if they don't match.  If the target cpumask equals
534a3fbb3   Daeseok Youn   workqueue: simpli...
3752
  	 * wq's, the default pwq should be used.
4c16bd327   Tejun Heo   workqueue: implem...
3753
3754
3755
3756
3757
  	 */
  	if (wq_calc_node_cpumask(wq->unbound_attrs, node, cpu_off, cpumask)) {
  		if (cpumask_equal(cpumask, pwq->pool->attrs->cpumask))
  			goto out_unlock;
  	} else {
534a3fbb3   Daeseok Youn   workqueue: simpli...
3758
  		goto use_dfl_pwq;
4c16bd327   Tejun Heo   workqueue: implem...
3759
3760
3761
3762
3763
3764
3765
  	}
  
  	mutex_unlock(&wq->mutex);
  
  	/* create a new pwq */
  	pwq = alloc_unbound_pwq(wq, target_attrs);
  	if (!pwq) {
2d916033a   Fabian Frederick   kernel/workqueue....
3766
3767
3768
  		pr_warn("workqueue: allocation failed while updating NUMA affinity of \"%s\"
  ",
  			wq->name);
77f300b19   Daeseok Youn   workqueue: fix bu...
3769
3770
  		mutex_lock(&wq->mutex);
  		goto use_dfl_pwq;
4c16bd327   Tejun Heo   workqueue: implem...
3771
3772
3773
3774
3775
3776
3777
3778
3779
3780
3781
3782
3783
3784
3785
3786
3787
3788
3789
3790
3791
  	}
  
  	/*
  	 * Install the new pwq.  As this function is called only from CPU
  	 * hotplug callbacks and applying a new attrs is wrapped with
  	 * get/put_online_cpus(), @wq->unbound_attrs couldn't have changed
  	 * inbetween.
  	 */
  	mutex_lock(&wq->mutex);
  	old_pwq = numa_pwq_tbl_install(wq, node, pwq);
  	goto out_unlock;
  
  use_dfl_pwq:
  	spin_lock_irq(&wq->dfl_pwq->pool->lock);
  	get_pwq(wq->dfl_pwq);
  	spin_unlock_irq(&wq->dfl_pwq->pool->lock);
  	old_pwq = numa_pwq_tbl_install(wq, node, wq->dfl_pwq);
  out_unlock:
  	mutex_unlock(&wq->mutex);
  	put_pwq_unlocked(old_pwq);
  }
30cdf2496   Tejun Heo   workqueue: add wo...
3792
  static int alloc_and_link_pwqs(struct workqueue_struct *wq)
0f900049c   Tejun Heo   workqueue: update...
3793
  {
49e3cf44d   Tejun Heo   workqueue: replac...
3794
  	bool highpri = wq->flags & WQ_HIGHPRI;
8a2b75384   Tejun Heo   workqueue: fix or...
3795
  	int cpu, ret;
30cdf2496   Tejun Heo   workqueue: add wo...
3796
3797
  
  	if (!(wq->flags & WQ_UNBOUND)) {
420c0ddb1   Tejun Heo   workqueue: remove...
3798
3799
  		wq->cpu_pwqs = alloc_percpu(struct pool_workqueue);
  		if (!wq->cpu_pwqs)
30cdf2496   Tejun Heo   workqueue: add wo...
3800
3801
3802
  			return -ENOMEM;
  
  		for_each_possible_cpu(cpu) {
7fb98ea79   Tejun Heo   workqueue: replac...
3803
3804
  			struct pool_workqueue *pwq =
  				per_cpu_ptr(wq->cpu_pwqs, cpu);
7a62c2c87   Tejun Heo   workqueue: remove...
3805
  			struct worker_pool *cpu_pools =
f02ae73aa   Tejun Heo   workqueue: drop "...
3806
  				per_cpu(cpu_worker_pools, cpu);
f34217977   Tejun Heo   workqueue: implem...
3807

f147f29eb   Tejun Heo   workqueue: break ...
3808
3809
3810
  			init_pwq(pwq, wq, &cpu_pools[highpri]);
  
  			mutex_lock(&wq->mutex);
1befcf307   Tejun Heo   workqueue: introd...
3811
  			link_pwq(pwq);
f147f29eb   Tejun Heo   workqueue: break ...
3812
  			mutex_unlock(&wq->mutex);
30cdf2496   Tejun Heo   workqueue: add wo...
3813
  		}
9e8cd2f58   Tejun Heo   workqueue: implem...
3814
  		return 0;
8a2b75384   Tejun Heo   workqueue: fix or...
3815
3816
3817
3818
3819
3820
3821
3822
  	} else if (wq->flags & __WQ_ORDERED) {
  		ret = apply_workqueue_attrs(wq, ordered_wq_attrs[highpri]);
  		/* there should only be single pwq for ordering guarantee */
  		WARN(!ret && (wq->pwqs.next != &wq->dfl_pwq->pwqs_node ||
  			      wq->pwqs.prev != &wq->dfl_pwq->pwqs_node),
  		     "ordering guarantee broken for workqueue %s
  ", wq->name);
  		return ret;
30cdf2496   Tejun Heo   workqueue: add wo...
3823
  	} else {
9e8cd2f58   Tejun Heo   workqueue: implem...
3824
  		return apply_workqueue_attrs(wq, unbound_std_wq_attrs[highpri]);
30cdf2496   Tejun Heo   workqueue: add wo...
3825
  	}
0f900049c   Tejun Heo   workqueue: update...
3826
  }
f34217977   Tejun Heo   workqueue: implem...
3827
3828
  static int wq_clamp_max_active(int max_active, unsigned int flags,
  			       const char *name)
b71ab8c20   Tejun Heo   workqueue: increa...
3829
  {
f34217977   Tejun Heo   workqueue: implem...
3830
3831
3832
  	int lim = flags & WQ_UNBOUND ? WQ_UNBOUND_MAX_ACTIVE : WQ_MAX_ACTIVE;
  
  	if (max_active < 1 || max_active > lim)
044c782ce   Valentin Ilie   workqueue: fix ch...
3833
3834
3835
  		pr_warn("workqueue: max_active %d requested for %s is out of range, clamping between %d and %d
  ",
  			max_active, name, 1, lim);
b71ab8c20   Tejun Heo   workqueue: increa...
3836

f34217977   Tejun Heo   workqueue: implem...
3837
  	return clamp_val(max_active, 1, lim);
b71ab8c20   Tejun Heo   workqueue: increa...
3838
  }
b196be89c   Tejun Heo   workqueue: make a...
3839
  struct workqueue_struct *__alloc_workqueue_key(const char *fmt,
d320c0383   Tejun Heo   workqueue: s/__cr...
3840
3841
3842
  					       unsigned int flags,
  					       int max_active,
  					       struct lock_class_key *key,
b196be89c   Tejun Heo   workqueue: make a...
3843
  					       const char *lock_name, ...)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3844
  {
df2d5ae49   Tejun Heo   workqueue: map an...
3845
  	size_t tbl_size = 0;
ecf6881ff   Tejun Heo   workqueue: make w...
3846
  	va_list args;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3847
  	struct workqueue_struct *wq;
49e3cf44d   Tejun Heo   workqueue: replac...
3848
  	struct pool_workqueue *pwq;
b196be89c   Tejun Heo   workqueue: make a...
3849

cee22a150   Viresh Kumar   workqueues: Intro...
3850
3851
3852
  	/* see the comment above the definition of WQ_POWER_EFFICIENT */
  	if ((flags & WQ_POWER_EFFICIENT) && wq_power_efficient)
  		flags |= WQ_UNBOUND;
ecf6881ff   Tejun Heo   workqueue: make w...
3853
  	/* allocate wq and format name */
df2d5ae49   Tejun Heo   workqueue: map an...
3854
  	if (flags & WQ_UNBOUND)
ddcb57e2e   Lai Jiangshan   workqueue: use nr...
3855
  		tbl_size = nr_node_ids * sizeof(wq->numa_pwq_tbl[0]);
df2d5ae49   Tejun Heo   workqueue: map an...
3856
3857
  
  	wq = kzalloc(sizeof(*wq) + tbl_size, GFP_KERNEL);
b196be89c   Tejun Heo   workqueue: make a...
3858
  	if (!wq)
d2c1d4048   Tejun Heo   workqueue: restru...
3859
  		return NULL;
b196be89c   Tejun Heo   workqueue: make a...
3860

6029a9182   Tejun Heo   workqueue: add wo...
3861
3862
3863
3864
3865
  	if (flags & WQ_UNBOUND) {
  		wq->unbound_attrs = alloc_workqueue_attrs(GFP_KERNEL);
  		if (!wq->unbound_attrs)
  			goto err_free_wq;
  	}
ecf6881ff   Tejun Heo   workqueue: make w...
3866
3867
  	va_start(args, lock_name);
  	vsnprintf(wq->name, sizeof(wq->name), fmt, args);
b196be89c   Tejun Heo   workqueue: make a...
3868
  	va_end(args);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3869

d320c0383   Tejun Heo   workqueue: s/__cr...
3870
  	max_active = max_active ?: WQ_DFL_ACTIVE;
b196be89c   Tejun Heo   workqueue: make a...
3871
  	max_active = wq_clamp_max_active(max_active, flags, wq->name);
3af24433e   Oleg Nesterov   workqueue: don't ...
3872

b196be89c   Tejun Heo   workqueue: make a...
3873
  	/* init wq */
97e37d7b9   Tejun Heo   workqueue: merge ...
3874
  	wq->flags = flags;
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
3875
  	wq->saved_max_active = max_active;
3c25a55da   Lai Jiangshan   workqueue: rename...
3876
  	mutex_init(&wq->mutex);
112202d90   Tejun Heo   workqueue: rename...
3877
  	atomic_set(&wq->nr_pwqs_to_flush, 0);
30cdf2496   Tejun Heo   workqueue: add wo...
3878
  	INIT_LIST_HEAD(&wq->pwqs);
73f53c4aa   Tejun Heo   workqueue: reimpl...
3879
3880
  	INIT_LIST_HEAD(&wq->flusher_queue);
  	INIT_LIST_HEAD(&wq->flusher_overflow);
493a1724f   Tejun Heo   workqueue: add wo...
3881
  	INIT_LIST_HEAD(&wq->maydays);
502ca9d81   Tejun Heo   workqueue: make s...
3882

eb13ba873   Johannes Berg   lockdep: fix work...
3883
  	lockdep_init_map(&wq->lockdep_map, lock_name, key, 0);
cce1a1656   Oleg Nesterov   workqueue: introd...
3884
  	INIT_LIST_HEAD(&wq->list);
3af24433e   Oleg Nesterov   workqueue: don't ...
3885

30cdf2496   Tejun Heo   workqueue: add wo...
3886
  	if (alloc_and_link_pwqs(wq) < 0)
d2c1d4048   Tejun Heo   workqueue: restru...
3887
  		goto err_free_wq;
1537663f5   Tejun Heo   workqueue: kill c...
3888

493008a8e   Tejun Heo   workqueue: drop W...
3889
3890
3891
3892
3893
  	/*
  	 * Workqueues which may be used during memory reclaim should
  	 * have a rescuer to guarantee forward progress.
  	 */
  	if (flags & WQ_MEM_RECLAIM) {
e22bee782   Tejun Heo   workqueue: implem...
3894
  		struct worker *rescuer;
f7537df52   Lai Jiangshan   workqueue: alloc ...
3895
  		rescuer = alloc_worker(NUMA_NO_NODE);
e22bee782   Tejun Heo   workqueue: implem...
3896
  		if (!rescuer)
d2c1d4048   Tejun Heo   workqueue: restru...
3897
  			goto err_destroy;
e22bee782   Tejun Heo   workqueue: implem...
3898

111c225a5   Tejun Heo   workqueue: set PF...
3899
3900
  		rescuer->rescue_wq = wq;
  		rescuer->task = kthread_create(rescuer_thread, rescuer, "%s",
b196be89c   Tejun Heo   workqueue: make a...
3901
  					       wq->name);
d2c1d4048   Tejun Heo   workqueue: restru...
3902
3903
3904
3905
  		if (IS_ERR(rescuer->task)) {
  			kfree(rescuer);
  			goto err_destroy;
  		}
e22bee782   Tejun Heo   workqueue: implem...
3906

d2c1d4048   Tejun Heo   workqueue: restru...
3907
  		wq->rescuer = rescuer;
14a40ffcc   Tejun Heo   sched: replace PF...
3908
  		rescuer->task->flags |= PF_NO_SETAFFINITY;
e22bee782   Tejun Heo   workqueue: implem...
3909
  		wake_up_process(rescuer->task);
3af24433e   Oleg Nesterov   workqueue: don't ...
3910
  	}
226223ab3   Tejun Heo   workqueue: implem...
3911
3912
  	if ((wq->flags & WQ_SYSFS) && workqueue_sysfs_register(wq))
  		goto err_destroy;
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
3913
  	/*
68e13a67d   Lai Jiangshan   workqueue: rename...
3914
3915
3916
  	 * wq_pool_mutex protects global freeze state and workqueues list.
  	 * Grab it, adjust max_active and add the new @wq to workqueues
  	 * list.
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
3917
  	 */
68e13a67d   Lai Jiangshan   workqueue: rename...
3918
  	mutex_lock(&wq_pool_mutex);
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
3919

a357fc032   Lai Jiangshan   workqueue: protec...
3920
  	mutex_lock(&wq->mutex);
699ce097e   Tejun Heo   workqueue: implem...
3921
3922
  	for_each_pwq(pwq, wq)
  		pwq_adjust_max_active(pwq);
a357fc032   Lai Jiangshan   workqueue: protec...
3923
  	mutex_unlock(&wq->mutex);
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
3924

1537663f5   Tejun Heo   workqueue: kill c...
3925
  	list_add(&wq->list, &workqueues);
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
3926

68e13a67d   Lai Jiangshan   workqueue: rename...
3927
  	mutex_unlock(&wq_pool_mutex);
1537663f5   Tejun Heo   workqueue: kill c...
3928

3af24433e   Oleg Nesterov   workqueue: don't ...
3929
  	return wq;
d2c1d4048   Tejun Heo   workqueue: restru...
3930
3931
  
  err_free_wq:
6029a9182   Tejun Heo   workqueue: add wo...
3932
  	free_workqueue_attrs(wq->unbound_attrs);
d2c1d4048   Tejun Heo   workqueue: restru...
3933
3934
3935
3936
  	kfree(wq);
  	return NULL;
  err_destroy:
  	destroy_workqueue(wq);
4690c4ab5   Tejun Heo   workqueue: misc/c...
3937
  	return NULL;
3af24433e   Oleg Nesterov   workqueue: don't ...
3938
  }
d320c0383   Tejun Heo   workqueue: s/__cr...
3939
  EXPORT_SYMBOL_GPL(__alloc_workqueue_key);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3940

3af24433e   Oleg Nesterov   workqueue: don't ...
3941
3942
3943
3944
3945
3946
3947
3948
  /**
   * 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)
  {
49e3cf44d   Tejun Heo   workqueue: replac...
3949
  	struct pool_workqueue *pwq;
4c16bd327   Tejun Heo   workqueue: implem...
3950
  	int node;
3af24433e   Oleg Nesterov   workqueue: don't ...
3951

9c5a2ba70   Tejun Heo   workqueue: separa...
3952
3953
  	/* drain it before proceeding with destruction */
  	drain_workqueue(wq);
c8efcc258   Tejun Heo   workqueue: allow ...
3954

6183c009f   Tejun Heo   workqueue: make s...
3955
  	/* sanity checks */
b09f4fd39   Lai Jiangshan   workqueue: protec...
3956
  	mutex_lock(&wq->mutex);
49e3cf44d   Tejun Heo   workqueue: replac...
3957
  	for_each_pwq(pwq, wq) {
6183c009f   Tejun Heo   workqueue: make s...
3958
  		int i;
76af4d936   Tejun Heo   workqueue: update...
3959
3960
  		for (i = 0; i < WORK_NR_COLORS; i++) {
  			if (WARN_ON(pwq->nr_in_flight[i])) {
b09f4fd39   Lai Jiangshan   workqueue: protec...
3961
  				mutex_unlock(&wq->mutex);
6183c009f   Tejun Heo   workqueue: make s...
3962
  				return;
76af4d936   Tejun Heo   workqueue: update...
3963
3964
  			}
  		}
5c529597e   Lai Jiangshan   workqueue: avoid ...
3965
  		if (WARN_ON((pwq != wq->dfl_pwq) && (pwq->refcnt > 1)) ||
8864b4e59   Tejun Heo   workqueue: implem...
3966
  		    WARN_ON(pwq->nr_active) ||
76af4d936   Tejun Heo   workqueue: update...
3967
  		    WARN_ON(!list_empty(&pwq->delayed_works))) {
b09f4fd39   Lai Jiangshan   workqueue: protec...
3968
  			mutex_unlock(&wq->mutex);
6183c009f   Tejun Heo   workqueue: make s...
3969
  			return;
76af4d936   Tejun Heo   workqueue: update...
3970
  		}
6183c009f   Tejun Heo   workqueue: make s...
3971
  	}
b09f4fd39   Lai Jiangshan   workqueue: protec...
3972
  	mutex_unlock(&wq->mutex);
6183c009f   Tejun Heo   workqueue: make s...
3973

a0a1a5fd4   Tejun Heo   workqueue: reimpl...
3974
3975
3976
3977
  	/*
  	 * wq list is used to freeze wq, remove from list after
  	 * flushing is complete in case freeze races us.
  	 */
68e13a67d   Lai Jiangshan   workqueue: rename...
3978
  	mutex_lock(&wq_pool_mutex);
d2c1d4048   Tejun Heo   workqueue: restru...
3979
  	list_del_init(&wq->list);
68e13a67d   Lai Jiangshan   workqueue: rename...
3980
  	mutex_unlock(&wq_pool_mutex);
3af24433e   Oleg Nesterov   workqueue: don't ...
3981

226223ab3   Tejun Heo   workqueue: implem...
3982
  	workqueue_sysfs_unregister(wq);
493008a8e   Tejun Heo   workqueue: drop W...
3983
  	if (wq->rescuer) {
e22bee782   Tejun Heo   workqueue: implem...
3984
  		kthread_stop(wq->rescuer->task);
8d9df9f08   Xiaotian Feng   workqueue: free r...
3985
  		kfree(wq->rescuer);
493008a8e   Tejun Heo   workqueue: drop W...
3986
  		wq->rescuer = NULL;
e22bee782   Tejun Heo   workqueue: implem...
3987
  	}
8864b4e59   Tejun Heo   workqueue: implem...
3988
3989
3990
3991
3992
3993
3994
3995
3996
3997
  	if (!(wq->flags & WQ_UNBOUND)) {
  		/*
  		 * The base ref is never dropped on per-cpu pwqs.  Directly
  		 * free the pwqs and wq.
  		 */
  		free_percpu(wq->cpu_pwqs);
  		kfree(wq);
  	} else {
  		/*
  		 * We're the sole accessor of @wq at this point.  Directly
4c16bd327   Tejun Heo   workqueue: implem...
3998
3999
  		 * access numa_pwq_tbl[] and dfl_pwq to put the base refs.
  		 * @wq will be freed when the last pwq is released.
8864b4e59   Tejun Heo   workqueue: implem...
4000
  		 */
4c16bd327   Tejun Heo   workqueue: implem...
4001
4002
4003
4004
4005
4006
4007
4008
4009
4010
4011
4012
  		for_each_node(node) {
  			pwq = rcu_access_pointer(wq->numa_pwq_tbl[node]);
  			RCU_INIT_POINTER(wq->numa_pwq_tbl[node], NULL);
  			put_pwq_unlocked(pwq);
  		}
  
  		/*
  		 * Put dfl_pwq.  @wq may be freed any time after dfl_pwq is
  		 * put.  Don't access it afterwards.
  		 */
  		pwq = wq->dfl_pwq;
  		wq->dfl_pwq = NULL;
dce90d47c   Tejun Heo   workqueue: introd...
4013
  		put_pwq_unlocked(pwq);
29c91e991   Tejun Heo   workqueue: implem...
4014
  	}
3af24433e   Oleg Nesterov   workqueue: don't ...
4015
4016
  }
  EXPORT_SYMBOL_GPL(destroy_workqueue);
dcd989cb7   Tejun Heo   workqueue: implem...
4017
4018
4019
4020
4021
4022
4023
4024
4025
4026
4027
4028
  /**
   * 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)
  {
49e3cf44d   Tejun Heo   workqueue: replac...
4029
  	struct pool_workqueue *pwq;
dcd989cb7   Tejun Heo   workqueue: implem...
4030

8719dceae   Tejun Heo   workqueue: reject...
4031
4032
4033
  	/* disallow meddling with max_active for ordered workqueues */
  	if (WARN_ON(wq->flags & __WQ_ORDERED))
  		return;
f34217977   Tejun Heo   workqueue: implem...
4034
  	max_active = wq_clamp_max_active(max_active, wq->flags, wq->name);
dcd989cb7   Tejun Heo   workqueue: implem...
4035

a357fc032   Lai Jiangshan   workqueue: protec...
4036
  	mutex_lock(&wq->mutex);
dcd989cb7   Tejun Heo   workqueue: implem...
4037
4038
  
  	wq->saved_max_active = max_active;
699ce097e   Tejun Heo   workqueue: implem...
4039
4040
  	for_each_pwq(pwq, wq)
  		pwq_adjust_max_active(pwq);
939818009   Tejun Heo   workqueue: fix ra...
4041

a357fc032   Lai Jiangshan   workqueue: protec...
4042
  	mutex_unlock(&wq->mutex);
15316ba81   Christoph Lameter   [PATCH] add sched...
4043
  }
dcd989cb7   Tejun Heo   workqueue: implem...
4044
  EXPORT_SYMBOL_GPL(workqueue_set_max_active);
15316ba81   Christoph Lameter   [PATCH] add sched...
4045

eef6a7d5c   Alan Stern   workqueue: warn a...
4046
  /**
e62676169   Tejun Heo   workqueue: implem...
4047
4048
4049
4050
   * current_is_workqueue_rescuer - is %current workqueue rescuer?
   *
   * Determine whether %current is a workqueue rescuer.  Can be used from
   * work functions to determine whether it's being run off the rescuer task.
d185af300   Yacine Belkadi   workqueue: fix so...
4051
4052
   *
   * Return: %true if %current is a workqueue rescuer. %false otherwise.
e62676169   Tejun Heo   workqueue: implem...
4053
4054
4055
4056
   */
  bool current_is_workqueue_rescuer(void)
  {
  	struct worker *worker = current_wq_worker();
6a092dfd5   Lai Jiangshan   workqueue: simpli...
4057
  	return worker && worker->rescue_wq;
e62676169   Tejun Heo   workqueue: implem...
4058
4059
4060
  }
  
  /**
dcd989cb7   Tejun Heo   workqueue: implem...
4061
4062
4063
   * workqueue_congested - test whether a workqueue is congested
   * @cpu: CPU in question
   * @wq: target workqueue
eef6a7d5c   Alan Stern   workqueue: warn a...
4064
   *
dcd989cb7   Tejun Heo   workqueue: implem...
4065
4066
4067
   * 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...
4068
   *
d32518591   Tejun Heo   workqueue: workqu...
4069
4070
4071
4072
4073
4074
   * If @cpu is WORK_CPU_UNBOUND, the test is performed on the local CPU.
   * Note that both per-cpu and unbound workqueues may be associated with
   * multiple pool_workqueues which have separate congested states.  A
   * workqueue being congested on one CPU doesn't mean the workqueue is also
   * contested on other CPUs / NUMA nodes.
   *
d185af300   Yacine Belkadi   workqueue: fix so...
4075
   * Return:
dcd989cb7   Tejun Heo   workqueue: implem...
4076
   * %true if congested, %false otherwise.
eef6a7d5c   Alan Stern   workqueue: warn a...
4077
   */
d84ff0512   Tejun Heo   workqueue: consis...
4078
  bool workqueue_congested(int cpu, struct workqueue_struct *wq)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4079
  {
7fb98ea79   Tejun Heo   workqueue: replac...
4080
  	struct pool_workqueue *pwq;
76af4d936   Tejun Heo   workqueue: update...
4081
  	bool ret;
881094532   Lai Jiangshan   workqueue: use rc...
4082
  	rcu_read_lock_sched();
7fb98ea79   Tejun Heo   workqueue: replac...
4083

d32518591   Tejun Heo   workqueue: workqu...
4084
4085
  	if (cpu == WORK_CPU_UNBOUND)
  		cpu = smp_processor_id();
7fb98ea79   Tejun Heo   workqueue: replac...
4086
4087
4088
  	if (!(wq->flags & WQ_UNBOUND))
  		pwq = per_cpu_ptr(wq->cpu_pwqs, cpu);
  	else
df2d5ae49   Tejun Heo   workqueue: map an...
4089
  		pwq = unbound_pwq_by_node(wq, cpu_to_node(cpu));
dcd989cb7   Tejun Heo   workqueue: implem...
4090

76af4d936   Tejun Heo   workqueue: update...
4091
  	ret = !list_empty(&pwq->delayed_works);
881094532   Lai Jiangshan   workqueue: use rc...
4092
  	rcu_read_unlock_sched();
76af4d936   Tejun Heo   workqueue: update...
4093
4094
  
  	return ret;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4095
  }
dcd989cb7   Tejun Heo   workqueue: implem...
4096
  EXPORT_SYMBOL_GPL(workqueue_congested);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4097
4098
  
  /**
dcd989cb7   Tejun Heo   workqueue: implem...
4099
4100
4101
4102
4103
4104
   * 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.
dcd989cb7   Tejun Heo   workqueue: implem...
4105
   *
d185af300   Yacine Belkadi   workqueue: fix so...
4106
   * Return:
dcd989cb7   Tejun Heo   workqueue: implem...
4107
4108
4109
   * OR'd bitmask of WORK_BUSY_* bits.
   */
  unsigned int work_busy(struct work_struct *work)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4110
  {
fa1b54e69   Tejun Heo   workqueue: update...
4111
  	struct worker_pool *pool;
dcd989cb7   Tejun Heo   workqueue: implem...
4112
4113
  	unsigned long flags;
  	unsigned int ret = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4114

dcd989cb7   Tejun Heo   workqueue: implem...
4115
4116
  	if (work_pending(work))
  		ret |= WORK_BUSY_PENDING;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4117

fa1b54e69   Tejun Heo   workqueue: update...
4118
4119
  	local_irq_save(flags);
  	pool = get_work_pool(work);
038366c5c   Lai Jiangshan   workqueue: make w...
4120
  	if (pool) {
fa1b54e69   Tejun Heo   workqueue: update...
4121
  		spin_lock(&pool->lock);
038366c5c   Lai Jiangshan   workqueue: make w...
4122
4123
  		if (find_worker_executing_work(pool, work))
  			ret |= WORK_BUSY_RUNNING;
fa1b54e69   Tejun Heo   workqueue: update...
4124
  		spin_unlock(&pool->lock);
038366c5c   Lai Jiangshan   workqueue: make w...
4125
  	}
fa1b54e69   Tejun Heo   workqueue: update...
4126
  	local_irq_restore(flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4127

dcd989cb7   Tejun Heo   workqueue: implem...
4128
  	return ret;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4129
  }
dcd989cb7   Tejun Heo   workqueue: implem...
4130
  EXPORT_SYMBOL_GPL(work_busy);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4131

3d1cb2059   Tejun Heo   workqueue: includ...
4132
4133
4134
4135
4136
4137
4138
4139
4140
4141
4142
4143
4144
4145
4146
4147
4148
4149
4150
4151
4152
4153
4154
4155
4156
4157
4158
4159
4160
4161
4162
4163
4164
4165
4166
4167
4168
4169
4170
4171
4172
4173
4174
4175
4176
4177
4178
4179
4180
4181
4182
4183
4184
4185
4186
4187
4188
4189
4190
4191
4192
4193
4194
4195
4196
4197
4198
4199
4200
4201
4202
4203
4204
4205
4206
4207
4208
  /**
   * set_worker_desc - set description for the current work item
   * @fmt: printf-style format string
   * @...: arguments for the format string
   *
   * This function can be called by a running work function to describe what
   * the work item is about.  If the worker task gets dumped, this
   * information will be printed out together to help debugging.  The
   * description can be at most WORKER_DESC_LEN including the trailing '\0'.
   */
  void set_worker_desc(const char *fmt, ...)
  {
  	struct worker *worker = current_wq_worker();
  	va_list args;
  
  	if (worker) {
  		va_start(args, fmt);
  		vsnprintf(worker->desc, sizeof(worker->desc), fmt, args);
  		va_end(args);
  		worker->desc_valid = true;
  	}
  }
  
  /**
   * print_worker_info - print out worker information and description
   * @log_lvl: the log level to use when printing
   * @task: target task
   *
   * If @task is a worker and currently executing a work item, print out the
   * name of the workqueue being serviced and worker description set with
   * set_worker_desc() by the currently executing work item.
   *
   * This function can be safely called on any task as long as the
   * task_struct itself is accessible.  While safe, this function isn't
   * synchronized and may print out mixups or garbages of limited length.
   */
  void print_worker_info(const char *log_lvl, struct task_struct *task)
  {
  	work_func_t *fn = NULL;
  	char name[WQ_NAME_LEN] = { };
  	char desc[WORKER_DESC_LEN] = { };
  	struct pool_workqueue *pwq = NULL;
  	struct workqueue_struct *wq = NULL;
  	bool desc_valid = false;
  	struct worker *worker;
  
  	if (!(task->flags & PF_WQ_WORKER))
  		return;
  
  	/*
  	 * This function is called without any synchronization and @task
  	 * could be in any state.  Be careful with dereferences.
  	 */
  	worker = probe_kthread_data(task);
  
  	/*
  	 * Carefully copy the associated workqueue's workfn and name.  Keep
  	 * the original last '\0' in case the original contains garbage.
  	 */
  	probe_kernel_read(&fn, &worker->current_func, sizeof(fn));
  	probe_kernel_read(&pwq, &worker->current_pwq, sizeof(pwq));
  	probe_kernel_read(&wq, &pwq->wq, sizeof(wq));
  	probe_kernel_read(name, wq->name, sizeof(name) - 1);
  
  	/* copy worker description */
  	probe_kernel_read(&desc_valid, &worker->desc_valid, sizeof(desc_valid));
  	if (desc_valid)
  		probe_kernel_read(desc, worker->desc, sizeof(desc) - 1);
  
  	if (fn || name[0] || desc[0]) {
  		printk("%sWorkqueue: %s %pf", log_lvl, name, fn);
  		if (desc[0])
  			pr_cont(" (%s)", desc);
  		pr_cont("
  ");
  	}
  }
db7bccf45   Tejun Heo   workqueue: reimpl...
4209
4210
4211
  /*
   * CPU hotplug.
   *
e22bee782   Tejun Heo   workqueue: implem...
4212
   * There are two challenges in supporting CPU hotplug.  Firstly, there
112202d90   Tejun Heo   workqueue: rename...
4213
   * are a lot of assumptions on strong associations among work, pwq and
706026c21   Tejun Heo   workqueue: post g...
4214
   * pool which make migrating pending and scheduled works very
e22bee782   Tejun Heo   workqueue: implem...
4215
   * difficult to implement without impacting hot paths.  Secondly,
94cf58bb2   Tejun Heo   workqueue: make h...
4216
   * worker pools serve mix of short, long and very long running works making
e22bee782   Tejun Heo   workqueue: implem...
4217
4218
   * blocked draining impractical.
   *
246475708   Tejun Heo   workqueue: make G...
4219
   * This is solved by allowing the pools to be disassociated from the CPU
628c78e7e   Tejun Heo   workqueue: remove...
4220
4221
   * running as an unbound one and allowing it to be reattached later if the
   * cpu comes back online.
db7bccf45   Tejun Heo   workqueue: reimpl...
4222
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4223

706026c21   Tejun Heo   workqueue: post g...
4224
  static void wq_unbind_fn(struct work_struct *work)
3af24433e   Oleg Nesterov   workqueue: don't ...
4225
  {
38db41d98   Tejun Heo   workqueue: replac...
4226
  	int cpu = smp_processor_id();
4ce62e9e3   Tejun Heo   workqueue: introd...
4227
  	struct worker_pool *pool;
db7bccf45   Tejun Heo   workqueue: reimpl...
4228
  	struct worker *worker;
3af24433e   Oleg Nesterov   workqueue: don't ...
4229

f02ae73aa   Tejun Heo   workqueue: drop "...
4230
  	for_each_cpu_worker_pool(pool, cpu) {
92f9c5c40   Lai Jiangshan   workqueue: rename...
4231
  		mutex_lock(&pool->attach_mutex);
94cf58bb2   Tejun Heo   workqueue: make h...
4232
  		spin_lock_irq(&pool->lock);
3af24433e   Oleg Nesterov   workqueue: don't ...
4233

94cf58bb2   Tejun Heo   workqueue: make h...
4234
  		/*
92f9c5c40   Lai Jiangshan   workqueue: rename...
4235
  		 * We've blocked all attach/detach operations. Make all workers
94cf58bb2   Tejun Heo   workqueue: make h...
4236
4237
4238
4239
4240
  		 * unbound and set DISASSOCIATED.  Before this, 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 may become diasporas.
  		 */
da028469b   Lai Jiangshan   workqueue: separa...
4241
  		for_each_pool_worker(worker, pool)
c9e7cf273   Tejun Heo   workqueue: move b...
4242
  			worker->flags |= WORKER_UNBOUND;
06ba38a9a   Oleg Nesterov   workqueues: shift...
4243

246475708   Tejun Heo   workqueue: make G...
4244
  		pool->flags |= POOL_DISASSOCIATED;
f2d5a0ee0   Tejun Heo   workqueue: drop C...
4245

94cf58bb2   Tejun Heo   workqueue: make h...
4246
  		spin_unlock_irq(&pool->lock);
92f9c5c40   Lai Jiangshan   workqueue: rename...
4247
  		mutex_unlock(&pool->attach_mutex);
628c78e7e   Tejun Heo   workqueue: remove...
4248

eb2834285   Lai Jiangshan   workqueue: fix po...
4249
4250
4251
4252
4253
4254
4255
  		/*
  		 * Call schedule() so that we cross rq->lock and thus can
  		 * guarantee sched callbacks see the %WORKER_UNBOUND flag.
  		 * This is necessary as scheduler callbacks may be invoked
  		 * from other cpus.
  		 */
  		schedule();
06ba38a9a   Oleg Nesterov   workqueues: shift...
4256

eb2834285   Lai Jiangshan   workqueue: fix po...
4257
4258
4259
4260
4261
4262
4263
4264
  		/*
  		 * 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.  This pool now behaves as an
  		 * unbound (in terms of concurrency management) pool which
  		 * are served by workers tied to the pool.
  		 */
e19e397a8   Tejun Heo   workqueue: move n...
4265
  		atomic_set(&pool->nr_running, 0);
eb2834285   Lai Jiangshan   workqueue: fix po...
4266
4267
4268
4269
4270
4271
4272
4273
4274
4275
  
  		/*
  		 * With concurrency management just turned off, a busy
  		 * worker blocking could lead to lengthy stalls.  Kick off
  		 * unbound chain execution of currently pending work items.
  		 */
  		spin_lock_irq(&pool->lock);
  		wake_up_worker(pool);
  		spin_unlock_irq(&pool->lock);
  	}
3af24433e   Oleg Nesterov   workqueue: don't ...
4276
  }
3af24433e   Oleg Nesterov   workqueue: don't ...
4277

bd7c089eb   Tejun Heo   workqueue: reloca...
4278
4279
4280
4281
  /**
   * rebind_workers - rebind all workers of a pool to the associated CPU
   * @pool: pool of interest
   *
a9ab775bc   Tejun Heo   workqueue: direct...
4282
   * @pool->cpu is coming online.  Rebind all workers to the CPU.
bd7c089eb   Tejun Heo   workqueue: reloca...
4283
4284
4285
   */
  static void rebind_workers(struct worker_pool *pool)
  {
a9ab775bc   Tejun Heo   workqueue: direct...
4286
  	struct worker *worker;
bd7c089eb   Tejun Heo   workqueue: reloca...
4287

92f9c5c40   Lai Jiangshan   workqueue: rename...
4288
  	lockdep_assert_held(&pool->attach_mutex);
bd7c089eb   Tejun Heo   workqueue: reloca...
4289

a9ab775bc   Tejun Heo   workqueue: direct...
4290
4291
4292
4293
4294
4295
4296
  	/*
  	 * Restore CPU affinity of all workers.  As all idle workers should
  	 * be on the run-queue of the associated CPU before any local
  	 * wake-ups for concurrency management happen, restore CPU affinty
  	 * of all workers first and then clear UNBOUND.  As we're called
  	 * from CPU_ONLINE, the following shouldn't fail.
  	 */
da028469b   Lai Jiangshan   workqueue: separa...
4297
  	for_each_pool_worker(worker, pool)
a9ab775bc   Tejun Heo   workqueue: direct...
4298
4299
  		WARN_ON_ONCE(set_cpus_allowed_ptr(worker->task,
  						  pool->attrs->cpumask) < 0);
bd7c089eb   Tejun Heo   workqueue: reloca...
4300

a9ab775bc   Tejun Heo   workqueue: direct...
4301
  	spin_lock_irq(&pool->lock);
3de5e8848   Lai Jiangshan   workqueue: clear ...
4302
  	pool->flags &= ~POOL_DISASSOCIATED;
bd7c089eb   Tejun Heo   workqueue: reloca...
4303

da028469b   Lai Jiangshan   workqueue: separa...
4304
  	for_each_pool_worker(worker, pool) {
a9ab775bc   Tejun Heo   workqueue: direct...
4305
  		unsigned int worker_flags = worker->flags;
bd7c089eb   Tejun Heo   workqueue: reloca...
4306
4307
  
  		/*
a9ab775bc   Tejun Heo   workqueue: direct...
4308
4309
4310
4311
4312
4313
  		 * A bound idle worker should actually be on the runqueue
  		 * of the associated CPU for local wake-ups targeting it to
  		 * work.  Kick all idle workers so that they migrate to the
  		 * associated CPU.  Doing this in the same loop as
  		 * replacing UNBOUND with REBOUND is safe as no worker will
  		 * be bound before @pool->lock is released.
bd7c089eb   Tejun Heo   workqueue: reloca...
4314
  		 */
a9ab775bc   Tejun Heo   workqueue: direct...
4315
4316
  		if (worker_flags & WORKER_IDLE)
  			wake_up_process(worker->task);
bd7c089eb   Tejun Heo   workqueue: reloca...
4317

a9ab775bc   Tejun Heo   workqueue: direct...
4318
4319
4320
4321
4322
4323
4324
4325
4326
4327
4328
4329
4330
4331
4332
4333
4334
4335
4336
  		/*
  		 * We want to clear UNBOUND but can't directly call
  		 * worker_clr_flags() or adjust nr_running.  Atomically
  		 * replace UNBOUND with another NOT_RUNNING flag REBOUND.
  		 * @worker will clear REBOUND using worker_clr_flags() when
  		 * it initiates the next execution cycle thus restoring
  		 * concurrency management.  Note that when or whether
  		 * @worker clears REBOUND doesn't affect correctness.
  		 *
  		 * ACCESS_ONCE() is necessary because @worker->flags may be
  		 * tested without holding any lock in
  		 * wq_worker_waking_up().  Without it, NOT_RUNNING test may
  		 * fail incorrectly leading to premature concurrency
  		 * management operations.
  		 */
  		WARN_ON_ONCE(!(worker_flags & WORKER_UNBOUND));
  		worker_flags |= WORKER_REBOUND;
  		worker_flags &= ~WORKER_UNBOUND;
  		ACCESS_ONCE(worker->flags) = worker_flags;
bd7c089eb   Tejun Heo   workqueue: reloca...
4337
  	}
a9ab775bc   Tejun Heo   workqueue: direct...
4338
4339
  
  	spin_unlock_irq(&pool->lock);
bd7c089eb   Tejun Heo   workqueue: reloca...
4340
  }
7dbc725e4   Tejun Heo   workqueue: restor...
4341
4342
4343
4344
4345
4346
4347
4348
4349
4350
4351
4352
4353
4354
  /**
   * restore_unbound_workers_cpumask - restore cpumask of unbound workers
   * @pool: unbound pool of interest
   * @cpu: the CPU which is coming up
   *
   * An unbound pool may end up with a cpumask which doesn't have any online
   * CPUs.  When a worker of such pool get scheduled, the scheduler resets
   * its cpus_allowed.  If @cpu is in @pool's cpumask which didn't have any
   * online CPU before, cpus_allowed of all its workers should be restored.
   */
  static void restore_unbound_workers_cpumask(struct worker_pool *pool, int cpu)
  {
  	static cpumask_t cpumask;
  	struct worker *worker;
7dbc725e4   Tejun Heo   workqueue: restor...
4355

92f9c5c40   Lai Jiangshan   workqueue: rename...
4356
  	lockdep_assert_held(&pool->attach_mutex);
7dbc725e4   Tejun Heo   workqueue: restor...
4357
4358
4359
4360
4361
4362
4363
4364
4365
4366
4367
  
  	/* is @cpu allowed for @pool? */
  	if (!cpumask_test_cpu(cpu, pool->attrs->cpumask))
  		return;
  
  	/* is @cpu the only online CPU? */
  	cpumask_and(&cpumask, pool->attrs->cpumask, cpu_online_mask);
  	if (cpumask_weight(&cpumask) != 1)
  		return;
  
  	/* as we're called from CPU_ONLINE, the following shouldn't fail */
da028469b   Lai Jiangshan   workqueue: separa...
4368
  	for_each_pool_worker(worker, pool)
7dbc725e4   Tejun Heo   workqueue: restor...
4369
4370
4371
  		WARN_ON_ONCE(set_cpus_allowed_ptr(worker->task,
  						  pool->attrs->cpumask) < 0);
  }
8db25e789   Tejun Heo   workqueue: simpli...
4372
4373
4374
4375
  /*
   * Workqueues should be brought up before normal priority CPU notifiers.
   * This will be registered high priority CPU notifier.
   */
0db0628d9   Paul Gortmaker   kernel: delete __...
4376
  static int workqueue_cpu_up_callback(struct notifier_block *nfb,
8db25e789   Tejun Heo   workqueue: simpli...
4377
4378
  					       unsigned long action,
  					       void *hcpu)
3af24433e   Oleg Nesterov   workqueue: don't ...
4379
  {
d84ff0512   Tejun Heo   workqueue: consis...
4380
  	int cpu = (unsigned long)hcpu;
4ce62e9e3   Tejun Heo   workqueue: introd...
4381
  	struct worker_pool *pool;
4c16bd327   Tejun Heo   workqueue: implem...
4382
  	struct workqueue_struct *wq;
7dbc725e4   Tejun Heo   workqueue: restor...
4383
  	int pi;
3ce633773   Tejun Heo   workqueue: don't ...
4384

8db25e789   Tejun Heo   workqueue: simpli...
4385
  	switch (action & ~CPU_TASKS_FROZEN) {
3af24433e   Oleg Nesterov   workqueue: don't ...
4386
  	case CPU_UP_PREPARE:
f02ae73aa   Tejun Heo   workqueue: drop "...
4387
  		for_each_cpu_worker_pool(pool, cpu) {
3ce633773   Tejun Heo   workqueue: don't ...
4388
4389
  			if (pool->nr_workers)
  				continue;
051e18501   Lai Jiangshan   workqueue: unfold...
4390
  			if (!create_worker(pool))
3ce633773   Tejun Heo   workqueue: don't ...
4391
  				return NOTIFY_BAD;
3af24433e   Oleg Nesterov   workqueue: don't ...
4392
  		}
8db25e789   Tejun Heo   workqueue: simpli...
4393
  		break;
3af24433e   Oleg Nesterov   workqueue: don't ...
4394

db7bccf45   Tejun Heo   workqueue: reimpl...
4395
4396
  	case CPU_DOWN_FAILED:
  	case CPU_ONLINE:
68e13a67d   Lai Jiangshan   workqueue: rename...
4397
  		mutex_lock(&wq_pool_mutex);
7dbc725e4   Tejun Heo   workqueue: restor...
4398
4399
  
  		for_each_pool(pool, pi) {
92f9c5c40   Lai Jiangshan   workqueue: rename...
4400
  			mutex_lock(&pool->attach_mutex);
94cf58bb2   Tejun Heo   workqueue: make h...
4401

f05b558d7   Lai Jiangshan   workqueue: clear ...
4402
  			if (pool->cpu == cpu)
7dbc725e4   Tejun Heo   workqueue: restor...
4403
  				rebind_workers(pool);
f05b558d7   Lai Jiangshan   workqueue: clear ...
4404
  			else if (pool->cpu < 0)
7dbc725e4   Tejun Heo   workqueue: restor...
4405
  				restore_unbound_workers_cpumask(pool, cpu);
94cf58bb2   Tejun Heo   workqueue: make h...
4406

92f9c5c40   Lai Jiangshan   workqueue: rename...
4407
  			mutex_unlock(&pool->attach_mutex);
94cf58bb2   Tejun Heo   workqueue: make h...
4408
  		}
7dbc725e4   Tejun Heo   workqueue: restor...
4409

4c16bd327   Tejun Heo   workqueue: implem...
4410
4411
4412
  		/* update NUMA affinity of unbound workqueues */
  		list_for_each_entry(wq, &workqueues, list)
  			wq_update_unbound_numa(wq, cpu, true);
68e13a67d   Lai Jiangshan   workqueue: rename...
4413
  		mutex_unlock(&wq_pool_mutex);
db7bccf45   Tejun Heo   workqueue: reimpl...
4414
  		break;
00dfcaf74   Oleg Nesterov   workqueues: shrin...
4415
  	}
657582022   Tejun Heo   workqueue: perfor...
4416
4417
4418
4419
4420
4421
4422
  	return NOTIFY_OK;
  }
  
  /*
   * Workqueues should be brought down after normal priority CPU notifiers.
   * This will be registered as low priority CPU notifier.
   */
0db0628d9   Paul Gortmaker   kernel: delete __...
4423
  static int workqueue_cpu_down_callback(struct notifier_block *nfb,
657582022   Tejun Heo   workqueue: perfor...
4424
4425
4426
  						 unsigned long action,
  						 void *hcpu)
  {
d84ff0512   Tejun Heo   workqueue: consis...
4427
  	int cpu = (unsigned long)hcpu;
8db25e789   Tejun Heo   workqueue: simpli...
4428
  	struct work_struct unbind_work;
4c16bd327   Tejun Heo   workqueue: implem...
4429
  	struct workqueue_struct *wq;
8db25e789   Tejun Heo   workqueue: simpli...
4430

657582022   Tejun Heo   workqueue: perfor...
4431
4432
  	switch (action & ~CPU_TASKS_FROZEN) {
  	case CPU_DOWN_PREPARE:
4c16bd327   Tejun Heo   workqueue: implem...
4433
  		/* unbinding per-cpu workers should happen on the local CPU */
706026c21   Tejun Heo   workqueue: post g...
4434
  		INIT_WORK_ONSTACK(&unbind_work, wq_unbind_fn);
7635d2fd7   Joonsoo Kim   workqueue: use sy...
4435
  		queue_work_on(cpu, system_highpri_wq, &unbind_work);
4c16bd327   Tejun Heo   workqueue: implem...
4436
4437
4438
4439
4440
4441
4442
4443
  
  		/* update NUMA affinity of unbound workqueues */
  		mutex_lock(&wq_pool_mutex);
  		list_for_each_entry(wq, &workqueues, list)
  			wq_update_unbound_numa(wq, cpu, false);
  		mutex_unlock(&wq_pool_mutex);
  
  		/* wait for per-cpu unbinding to finish */
8db25e789   Tejun Heo   workqueue: simpli...
4444
  		flush_work(&unbind_work);
440a11360   Chuansheng Liu   workqueue: Callin...
4445
  		destroy_work_on_stack(&unbind_work);
8db25e789   Tejun Heo   workqueue: simpli...
4446
  		break;
657582022   Tejun Heo   workqueue: perfor...
4447
4448
4449
  	}
  	return NOTIFY_OK;
  }
2d3854a37   Rusty Russell   cpumask: introduc...
4450
  #ifdef CONFIG_SMP
8ccad40df   Rusty Russell   work_on_cpu: Use ...
4451

2d3854a37   Rusty Russell   cpumask: introduc...
4452
  struct work_for_cpu {
ed48ece27   Tejun Heo   workqueue: reimpl...
4453
  	struct work_struct work;
2d3854a37   Rusty Russell   cpumask: introduc...
4454
4455
4456
4457
  	long (*fn)(void *);
  	void *arg;
  	long ret;
  };
ed48ece27   Tejun Heo   workqueue: reimpl...
4458
  static void work_for_cpu_fn(struct work_struct *work)
2d3854a37   Rusty Russell   cpumask: introduc...
4459
  {
ed48ece27   Tejun Heo   workqueue: reimpl...
4460
  	struct work_for_cpu *wfc = container_of(work, struct work_for_cpu, work);
2d3854a37   Rusty Russell   cpumask: introduc...
4461
4462
4463
4464
4465
4466
4467
4468
4469
  	wfc->ret = wfc->fn(wfc->arg);
  }
  
  /**
   * 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'...
4470
   * It is up to the caller to ensure that the cpu doesn't go offline.
6b44003e5   Andrew Morton   work_on_cpu(): re...
4471
   * The caller must not hold any locks which would prevent @fn from completing.
d185af300   Yacine Belkadi   workqueue: fix so...
4472
4473
   *
   * Return: The value @fn returns.
2d3854a37   Rusty Russell   cpumask: introduc...
4474
   */
d84ff0512   Tejun Heo   workqueue: consis...
4475
  long work_on_cpu(int cpu, long (*fn)(void *), void *arg)
2d3854a37   Rusty Russell   cpumask: introduc...
4476
  {
ed48ece27   Tejun Heo   workqueue: reimpl...
4477
  	struct work_for_cpu wfc = { .fn = fn, .arg = arg };
6b44003e5   Andrew Morton   work_on_cpu(): re...
4478

ed48ece27   Tejun Heo   workqueue: reimpl...
4479
4480
  	INIT_WORK_ONSTACK(&wfc.work, work_for_cpu_fn);
  	schedule_work_on(cpu, &wfc.work);
12997d1a9   Bjorn Helgaas   Revert "workqueue...
4481
  	flush_work(&wfc.work);
440a11360   Chuansheng Liu   workqueue: Callin...
4482
  	destroy_work_on_stack(&wfc.work);
2d3854a37   Rusty Russell   cpumask: introduc...
4483
4484
4485
4486
  	return wfc.ret;
  }
  EXPORT_SYMBOL_GPL(work_on_cpu);
  #endif /* CONFIG_SMP */
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
4487
4488
4489
4490
4491
  #ifdef CONFIG_FREEZER
  
  /**
   * freeze_workqueues_begin - begin freezing workqueues
   *
58a69cb47   Tejun Heo   workqueue, freeze...
4492
   * Start freezing workqueues.  After this function returns, all freezable
c5aa87bbf   Tejun Heo   workqueue: update...
4493
   * workqueues will queue new works to their delayed_works list instead of
706026c21   Tejun Heo   workqueue: post g...
4494
   * pool->worklist.
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
4495
4496
   *
   * CONTEXT:
a357fc032   Lai Jiangshan   workqueue: protec...
4497
   * Grabs and releases wq_pool_mutex, wq->mutex and pool->lock's.
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
4498
4499
4500
   */
  void freeze_workqueues_begin(void)
  {
24b8a8471   Tejun Heo   workqueue: restru...
4501
4502
  	struct workqueue_struct *wq;
  	struct pool_workqueue *pwq;
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
4503

68e13a67d   Lai Jiangshan   workqueue: rename...
4504
  	mutex_lock(&wq_pool_mutex);
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
4505

6183c009f   Tejun Heo   workqueue: make s...
4506
  	WARN_ON_ONCE(workqueue_freezing);
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
4507
  	workqueue_freezing = true;
24b8a8471   Tejun Heo   workqueue: restru...
4508
  	list_for_each_entry(wq, &workqueues, list) {
a357fc032   Lai Jiangshan   workqueue: protec...
4509
  		mutex_lock(&wq->mutex);
699ce097e   Tejun Heo   workqueue: implem...
4510
4511
  		for_each_pwq(pwq, wq)
  			pwq_adjust_max_active(pwq);
a357fc032   Lai Jiangshan   workqueue: protec...
4512
  		mutex_unlock(&wq->mutex);
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
4513
  	}
5bcab3355   Tejun Heo   workqueue: separa...
4514

68e13a67d   Lai Jiangshan   workqueue: rename...
4515
  	mutex_unlock(&wq_pool_mutex);
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
4516
4517
4518
  }
  
  /**
58a69cb47   Tejun Heo   workqueue, freeze...
4519
   * freeze_workqueues_busy - are freezable workqueues still busy?
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
4520
4521
4522
4523
4524
   *
   * Check whether freezing is complete.  This function must be called
   * between freeze_workqueues_begin() and thaw_workqueues().
   *
   * CONTEXT:
68e13a67d   Lai Jiangshan   workqueue: rename...
4525
   * Grabs and releases wq_pool_mutex.
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
4526
   *
d185af300   Yacine Belkadi   workqueue: fix so...
4527
   * Return:
58a69cb47   Tejun Heo   workqueue, freeze...
4528
4529
   * %true if some freezable workqueues are still busy.  %false if freezing
   * is complete.
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
4530
4531
4532
   */
  bool freeze_workqueues_busy(void)
  {
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
4533
  	bool busy = false;
24b8a8471   Tejun Heo   workqueue: restru...
4534
4535
  	struct workqueue_struct *wq;
  	struct pool_workqueue *pwq;
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
4536

68e13a67d   Lai Jiangshan   workqueue: rename...
4537
  	mutex_lock(&wq_pool_mutex);
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
4538

6183c009f   Tejun Heo   workqueue: make s...
4539
  	WARN_ON_ONCE(!workqueue_freezing);
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
4540

24b8a8471   Tejun Heo   workqueue: restru...
4541
4542
4543
  	list_for_each_entry(wq, &workqueues, list) {
  		if (!(wq->flags & WQ_FREEZABLE))
  			continue;
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
4544
4545
4546
4547
  		/*
  		 * nr_active is monotonically decreasing.  It's safe
  		 * to peek without lock.
  		 */
881094532   Lai Jiangshan   workqueue: use rc...
4548
  		rcu_read_lock_sched();
24b8a8471   Tejun Heo   workqueue: restru...
4549
  		for_each_pwq(pwq, wq) {
6183c009f   Tejun Heo   workqueue: make s...
4550
  			WARN_ON_ONCE(pwq->nr_active < 0);
112202d90   Tejun Heo   workqueue: rename...
4551
  			if (pwq->nr_active) {
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
4552
  				busy = true;
881094532   Lai Jiangshan   workqueue: use rc...
4553
  				rcu_read_unlock_sched();
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
4554
4555
4556
  				goto out_unlock;
  			}
  		}
881094532   Lai Jiangshan   workqueue: use rc...
4557
  		rcu_read_unlock_sched();
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
4558
4559
  	}
  out_unlock:
68e13a67d   Lai Jiangshan   workqueue: rename...
4560
  	mutex_unlock(&wq_pool_mutex);
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
4561
4562
4563
4564
4565
4566
4567
  	return busy;
  }
  
  /**
   * thaw_workqueues - thaw workqueues
   *
   * Thaw workqueues.  Normal queueing is restored and all collected
706026c21   Tejun Heo   workqueue: post g...
4568
   * frozen works are transferred to their respective pool worklists.
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
4569
4570
   *
   * CONTEXT:
a357fc032   Lai Jiangshan   workqueue: protec...
4571
   * Grabs and releases wq_pool_mutex, wq->mutex and pool->lock's.
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
4572
4573
4574
   */
  void thaw_workqueues(void)
  {
24b8a8471   Tejun Heo   workqueue: restru...
4575
4576
  	struct workqueue_struct *wq;
  	struct pool_workqueue *pwq;
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
4577

68e13a67d   Lai Jiangshan   workqueue: rename...
4578
  	mutex_lock(&wq_pool_mutex);
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
4579
4580
4581
  
  	if (!workqueue_freezing)
  		goto out_unlock;
74b414ead   Lai Jiangshan   workqueue: remove...
4582
  	workqueue_freezing = false;
8b03ae3cd   Tejun Heo   workqueue: introd...
4583

24b8a8471   Tejun Heo   workqueue: restru...
4584
4585
  	/* restore max_active and repopulate worklist */
  	list_for_each_entry(wq, &workqueues, list) {
a357fc032   Lai Jiangshan   workqueue: protec...
4586
  		mutex_lock(&wq->mutex);
699ce097e   Tejun Heo   workqueue: implem...
4587
4588
  		for_each_pwq(pwq, wq)
  			pwq_adjust_max_active(pwq);
a357fc032   Lai Jiangshan   workqueue: protec...
4589
  		mutex_unlock(&wq->mutex);
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
4590
  	}
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
4591
  out_unlock:
68e13a67d   Lai Jiangshan   workqueue: rename...
4592
  	mutex_unlock(&wq_pool_mutex);
a0a1a5fd4   Tejun Heo   workqueue: reimpl...
4593
4594
  }
  #endif /* CONFIG_FREEZER */
bce903809   Tejun Heo   workqueue: add wq...
4595
4596
4597
4598
  static void __init wq_numa_init(void)
  {
  	cpumask_var_t *tbl;
  	int node, cpu;
bce903809   Tejun Heo   workqueue: add wq...
4599
4600
  	if (num_possible_nodes() <= 1)
  		return;
d55262c4d   Tejun Heo   workqueue: update...
4601
4602
4603
4604
4605
  	if (wq_disable_numa) {
  		pr_info("workqueue: NUMA affinity support disabled
  ");
  		return;
  	}
4c16bd327   Tejun Heo   workqueue: implem...
4606
4607
  	wq_update_unbound_numa_attrs_buf = alloc_workqueue_attrs(GFP_KERNEL);
  	BUG_ON(!wq_update_unbound_numa_attrs_buf);
bce903809   Tejun Heo   workqueue: add wq...
4608
4609
4610
4611
4612
  	/*
  	 * We want masks of possible CPUs of each node which isn't readily
  	 * available.  Build one from cpu_to_node() which should have been
  	 * fully initialized by now.
  	 */
ddcb57e2e   Lai Jiangshan   workqueue: use nr...
4613
  	tbl = kzalloc(nr_node_ids * sizeof(tbl[0]), GFP_KERNEL);
bce903809   Tejun Heo   workqueue: add wq...
4614
4615
4616
  	BUG_ON(!tbl);
  
  	for_each_node(node)
5a6024f16   Yasuaki Ishimatsu   workqueue: zero c...
4617
  		BUG_ON(!zalloc_cpumask_var_node(&tbl[node], GFP_KERNEL,
1be0c25da   Tejun Heo   workqueue: don't ...
4618
  				node_online(node) ? node : NUMA_NO_NODE));
bce903809   Tejun Heo   workqueue: add wq...
4619
4620
4621
4622
4623
4624
4625
4626
4627
4628
4629
4630
4631
4632
4633
  
  	for_each_possible_cpu(cpu) {
  		node = cpu_to_node(cpu);
  		if (WARN_ON(node == NUMA_NO_NODE)) {
  			pr_warn("workqueue: NUMA node mapping not available for cpu%d, disabling NUMA support
  ", cpu);
  			/* happens iff arch is bonkers, let's just proceed */
  			return;
  		}
  		cpumask_set_cpu(cpu, tbl[node]);
  	}
  
  	wq_numa_possible_cpumask = tbl;
  	wq_numa_enabled = true;
  }
6ee0578b4   Suresh Siddha   workqueue: mark i...
4634
  static int __init init_workqueues(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4635
  {
7a4e344c5   Tejun Heo   workqueue: introd...
4636
4637
  	int std_nice[NR_STD_WORKER_POOLS] = { 0, HIGHPRI_NICE_LEVEL };
  	int i, cpu;
c34056a3f   Tejun Heo   workqueue: introd...
4638

e904e6c26   Tejun Heo   workqueue: introd...
4639
4640
4641
  	WARN_ON(__alignof__(struct pool_workqueue) < __alignof__(long long));
  
  	pwq_cache = KMEM_CACHE(pool_workqueue, SLAB_PANIC);
657582022   Tejun Heo   workqueue: perfor...
4642
  	cpu_notifier(workqueue_cpu_up_callback, CPU_PRI_WORKQUEUE_UP);
a5b4e57d7   Lai Jiangshan   workqueue: use ho...
4643
  	hotcpu_notifier(workqueue_cpu_down_callback, CPU_PRI_WORKQUEUE_DOWN);
8b03ae3cd   Tejun Heo   workqueue: introd...
4644

bce903809   Tejun Heo   workqueue: add wq...
4645
  	wq_numa_init();
706026c21   Tejun Heo   workqueue: post g...
4646
  	/* initialize CPU pools */
29c91e991   Tejun Heo   workqueue: implem...
4647
  	for_each_possible_cpu(cpu) {
4ce62e9e3   Tejun Heo   workqueue: introd...
4648
  		struct worker_pool *pool;
8b03ae3cd   Tejun Heo   workqueue: introd...
4649

7a4e344c5   Tejun Heo   workqueue: introd...
4650
  		i = 0;
f02ae73aa   Tejun Heo   workqueue: drop "...
4651
  		for_each_cpu_worker_pool(pool, cpu) {
7a4e344c5   Tejun Heo   workqueue: introd...
4652
  			BUG_ON(init_worker_pool(pool));
ec22ca5ea   Tejun Heo   workqueue: move g...
4653
  			pool->cpu = cpu;
29c91e991   Tejun Heo   workqueue: implem...
4654
  			cpumask_copy(pool->attrs->cpumask, cpumask_of(cpu));
7a4e344c5   Tejun Heo   workqueue: introd...
4655
  			pool->attrs->nice = std_nice[i++];
f3f90ad46   Tejun Heo   workqueue: determ...
4656
  			pool->node = cpu_to_node(cpu);
7a4e344c5   Tejun Heo   workqueue: introd...
4657

9daf9e678   Tejun Heo   workqueue: add wo...
4658
  			/* alloc pool ID */
68e13a67d   Lai Jiangshan   workqueue: rename...
4659
  			mutex_lock(&wq_pool_mutex);
9daf9e678   Tejun Heo   workqueue: add wo...
4660
  			BUG_ON(worker_pool_assign_id(pool));
68e13a67d   Lai Jiangshan   workqueue: rename...
4661
  			mutex_unlock(&wq_pool_mutex);
4ce62e9e3   Tejun Heo   workqueue: introd...
4662
  		}
8b03ae3cd   Tejun Heo   workqueue: introd...
4663
  	}
e22bee782   Tejun Heo   workqueue: implem...
4664
  	/* create the initial worker */
29c91e991   Tejun Heo   workqueue: implem...
4665
  	for_each_online_cpu(cpu) {
4ce62e9e3   Tejun Heo   workqueue: introd...
4666
  		struct worker_pool *pool;
e22bee782   Tejun Heo   workqueue: implem...
4667

f02ae73aa   Tejun Heo   workqueue: drop "...
4668
  		for_each_cpu_worker_pool(pool, cpu) {
29c91e991   Tejun Heo   workqueue: implem...
4669
  			pool->flags &= ~POOL_DISASSOCIATED;
051e18501   Lai Jiangshan   workqueue: unfold...
4670
  			BUG_ON(!create_worker(pool));
4ce62e9e3   Tejun Heo   workqueue: introd...
4671
  		}
e22bee782   Tejun Heo   workqueue: implem...
4672
  	}
8a2b75384   Tejun Heo   workqueue: fix or...
4673
  	/* create default unbound and ordered wq attrs */
29c91e991   Tejun Heo   workqueue: implem...
4674
4675
4676
4677
  	for (i = 0; i < NR_STD_WORKER_POOLS; i++) {
  		struct workqueue_attrs *attrs;
  
  		BUG_ON(!(attrs = alloc_workqueue_attrs(GFP_KERNEL)));
29c91e991   Tejun Heo   workqueue: implem...
4678
  		attrs->nice = std_nice[i];
29c91e991   Tejun Heo   workqueue: implem...
4679
  		unbound_std_wq_attrs[i] = attrs;
8a2b75384   Tejun Heo   workqueue: fix or...
4680
4681
4682
4683
4684
4685
4686
4687
4688
4689
  
  		/*
  		 * An ordered wq should have only one pwq as ordering is
  		 * guaranteed by max_active which is enforced by pwqs.
  		 * Turn off NUMA so that dfl_pwq is used for all nodes.
  		 */
  		BUG_ON(!(attrs = alloc_workqueue_attrs(GFP_KERNEL)));
  		attrs->nice = std_nice[i];
  		attrs->no_numa = true;
  		ordered_wq_attrs[i] = attrs;
29c91e991   Tejun Heo   workqueue: implem...
4690
  	}
d320c0383   Tejun Heo   workqueue: s/__cr...
4691
  	system_wq = alloc_workqueue("events", 0, 0);
1aabe902c   Joonsoo Kim   workqueue: introd...
4692
  	system_highpri_wq = alloc_workqueue("events_highpri", WQ_HIGHPRI, 0);
d320c0383   Tejun Heo   workqueue: s/__cr...
4693
  	system_long_wq = alloc_workqueue("events_long", 0, 0);
f34217977   Tejun Heo   workqueue: implem...
4694
4695
  	system_unbound_wq = alloc_workqueue("events_unbound", WQ_UNBOUND,
  					    WQ_UNBOUND_MAX_ACTIVE);
24d51add7   Tejun Heo   workqueue: fix bu...
4696
4697
  	system_freezable_wq = alloc_workqueue("events_freezable",
  					      WQ_FREEZABLE, 0);
0668106ca   Viresh Kumar   workqueue: Add sy...
4698
4699
4700
4701
4702
  	system_power_efficient_wq = alloc_workqueue("events_power_efficient",
  					      WQ_POWER_EFFICIENT, 0);
  	system_freezable_power_efficient_wq = alloc_workqueue("events_freezable_power_efficient",
  					      WQ_FREEZABLE | WQ_POWER_EFFICIENT,
  					      0);
1aabe902c   Joonsoo Kim   workqueue: introd...
4703
  	BUG_ON(!system_wq || !system_highpri_wq || !system_long_wq ||
0668106ca   Viresh Kumar   workqueue: Add sy...
4704
4705
4706
  	       !system_unbound_wq || !system_freezable_wq ||
  	       !system_power_efficient_wq ||
  	       !system_freezable_power_efficient_wq);
6ee0578b4   Suresh Siddha   workqueue: mark i...
4707
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4708
  }
6ee0578b4   Suresh Siddha   workqueue: mark i...
4709
  early_initcall(init_workqueues);