Blame view

kernel/padata.c 25.4 KB
16295bec6   Steffen Klassert   padata: Generic p...
1
2
3
  /*
   * padata.c - generic interface to process data streams in parallel
   *
107f8bdac   Steffen Klassert   padata: Add a ref...
4
5
   * See Documentation/padata.txt for an api documentation.
   *
16295bec6   Steffen Klassert   padata: Generic p...
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
   * Copyright (C) 2008, 2009 secunet Security Networks AG
   * Copyright (C) 2008, 2009 Steffen Klassert <steffen.klassert@secunet.com>
   *
   * This program is free software; you can redistribute it and/or modify it
   * under the terms and conditions of the GNU General Public License,
   * version 2, as published by the Free Software Foundation.
   *
   * This program is distributed in the hope it will be useful, but WITHOUT
   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
   * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
   * more details.
   *
   * You should have received a copy of the GNU General Public License along with
   * this program; if not, write to the Free Software Foundation, Inc.,
   * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
   */
9984de1a5   Paul Gortmaker   kernel: Map most ...
22
  #include <linux/export.h>
16295bec6   Steffen Klassert   padata: Generic p...
23
24
25
26
27
28
  #include <linux/cpumask.h>
  #include <linux/err.h>
  #include <linux/cpu.h>
  #include <linux/padata.h>
  #include <linux/mutex.h>
  #include <linux/sched.h>
5a0e3ad6a   Tejun Heo   include cleanup: ...
29
  #include <linux/slab.h>
5e017dc3f   Dan Kruchinin   padata: Added sys...
30
  #include <linux/sysfs.h>
16295bec6   Steffen Klassert   padata: Generic p...
31
  #include <linux/rcupdate.h>
30e92153b   Sebastian Andrzej Siewior   padata: Convert t...
32
  #include <linux/module.h>
16295bec6   Steffen Klassert   padata: Generic p...
33

97e3d94aa   Steffen Klassert   padata: Dont scal...
34
  #define MAX_OBJ_NUM 1000
16295bec6   Steffen Klassert   padata: Generic p...
35
36
37
38
  
  static int padata_index_to_cpu(struct parallel_data *pd, int cpu_index)
  {
  	int cpu, target_cpu;
e15bacbeb   Dan Kruchinin   padata: Make two ...
39
  	target_cpu = cpumask_first(pd->cpumask.pcpu);
16295bec6   Steffen Klassert   padata: Generic p...
40
  	for (cpu = 0; cpu < cpu_index; cpu++)
e15bacbeb   Dan Kruchinin   padata: Make two ...
41
  		target_cpu = cpumask_next(target_cpu, pd->cpumask.pcpu);
16295bec6   Steffen Klassert   padata: Generic p...
42
43
44
  
  	return target_cpu;
  }
2dc9b5dbd   Steffen Klassert   padata: Fix race ...
45
  static int padata_cpu_hash(struct parallel_data *pd)
16295bec6   Steffen Klassert   padata: Generic p...
46
  {
0b6b098ef   Mathias Krause   padata: make the ...
47
  	unsigned int seq_nr;
16295bec6   Steffen Klassert   padata: Generic p...
48
  	int cpu_index;
16295bec6   Steffen Klassert   padata: Generic p...
49
50
51
52
53
  
  	/*
  	 * Hash the sequence numbers to the cpus by taking
  	 * seq_nr mod. number of cpus in use.
  	 */
2dc9b5dbd   Steffen Klassert   padata: Fix race ...
54

0b6b098ef   Mathias Krause   padata: make the ...
55
56
  	seq_nr = atomic_inc_return(&pd->seq_nr);
  	cpu_index = seq_nr % cpumask_weight(pd->cpumask.pcpu);
16295bec6   Steffen Klassert   padata: Generic p...
57
58
59
  
  	return padata_index_to_cpu(pd, cpu_index);
  }
e15bacbeb   Dan Kruchinin   padata: Make two ...
60
  static void padata_parallel_worker(struct work_struct *parallel_work)
16295bec6   Steffen Klassert   padata: Generic p...
61
  {
e15bacbeb   Dan Kruchinin   padata: Make two ...
62
  	struct padata_parallel_queue *pqueue;
16295bec6   Steffen Klassert   padata: Generic p...
63
64
65
66
67
  	struct parallel_data *pd;
  	struct padata_instance *pinst;
  	LIST_HEAD(local_list);
  
  	local_bh_disable();
e15bacbeb   Dan Kruchinin   padata: Make two ...
68
69
70
  	pqueue = container_of(parallel_work,
  			      struct padata_parallel_queue, work);
  	pd = pqueue->pd;
16295bec6   Steffen Klassert   padata: Generic p...
71
  	pinst = pd->pinst;
e15bacbeb   Dan Kruchinin   padata: Make two ...
72
73
74
  	spin_lock(&pqueue->parallel.lock);
  	list_replace_init(&pqueue->parallel.list, &local_list);
  	spin_unlock(&pqueue->parallel.lock);
16295bec6   Steffen Klassert   padata: Generic p...
75
76
77
78
79
80
81
82
83
84
85
86
87
88
  
  	while (!list_empty(&local_list)) {
  		struct padata_priv *padata;
  
  		padata = list_entry(local_list.next,
  				    struct padata_priv, list);
  
  		list_del_init(&padata->list);
  
  		padata->parallel(padata);
  	}
  
  	local_bh_enable();
  }
0198ffd13   Steffen Klassert   padata: Add some ...
89
  /**
16295bec6   Steffen Klassert   padata: Generic p...
90
91
92
93
94
   * padata_do_parallel - padata parallelization function
   *
   * @pinst: padata instance
   * @padata: object to be parallelized
   * @cb_cpu: cpu the serialization callback function will run on,
e15bacbeb   Dan Kruchinin   padata: Make two ...
95
   *          must be in the serial cpumask of padata(i.e. cpumask.cbcpu).
16295bec6   Steffen Klassert   padata: Generic p...
96
97
98
99
100
101
102
103
104
   *
   * The parallelization callback function will run with BHs off.
   * Note: Every object which is parallelized by padata_do_parallel
   * must be seen by padata_do_serial.
   */
  int padata_do_parallel(struct padata_instance *pinst,
  		       struct padata_priv *padata, int cb_cpu)
  {
  	int target_cpu, err;
e15bacbeb   Dan Kruchinin   padata: Make two ...
105
  	struct padata_parallel_queue *queue;
16295bec6   Steffen Klassert   padata: Generic p...
106
107
108
  	struct parallel_data *pd;
  
  	rcu_read_lock_bh();
c0e656b7a   Mathias Krause   padata: Fix wrong...
109
  	pd = rcu_dereference_bh(pinst->pd);
16295bec6   Steffen Klassert   padata: Generic p...
110

83f619f3c   Steffen Klassert   padata: make pada...
111
  	err = -EINVAL;
7424713b8   Steffen Klassert   padata: Check for...
112
  	if (!(pinst->flags & PADATA_INIT) || pinst->flags & PADATA_INVALID)
16295bec6   Steffen Klassert   padata: Generic p...
113
  		goto out;
e15bacbeb   Dan Kruchinin   padata: Make two ...
114
  	if (!cpumask_test_cpu(cb_cpu, pd->cpumask.cbcpu))
16295bec6   Steffen Klassert   padata: Generic p...
115
116
117
118
119
120
121
122
  		goto out;
  
  	err =  -EBUSY;
  	if ((pinst->flags & PADATA_RESET))
  		goto out;
  
  	if (atomic_read(&pd->refcnt) >= MAX_OBJ_NUM)
  		goto out;
83f619f3c   Steffen Klassert   padata: make pada...
123
  	err = 0;
16295bec6   Steffen Klassert   padata: Generic p...
124
125
126
  	atomic_inc(&pd->refcnt);
  	padata->pd = pd;
  	padata->cb_cpu = cb_cpu;
2dc9b5dbd   Steffen Klassert   padata: Fix race ...
127
  	target_cpu = padata_cpu_hash(pd);
e15bacbeb   Dan Kruchinin   padata: Make two ...
128
  	queue = per_cpu_ptr(pd->pqueue, target_cpu);
16295bec6   Steffen Klassert   padata: Generic p...
129
130
131
132
  
  	spin_lock(&queue->parallel.lock);
  	list_add_tail(&padata->list, &queue->parallel.list);
  	spin_unlock(&queue->parallel.lock);
e15bacbeb   Dan Kruchinin   padata: Make two ...
133
  	queue_work_on(target_cpu, pinst->wq, &queue->work);
16295bec6   Steffen Klassert   padata: Generic p...
134
135
136
137
138
139
140
  
  out:
  	rcu_read_unlock_bh();
  
  	return err;
  }
  EXPORT_SYMBOL(padata_do_parallel);
0198ffd13   Steffen Klassert   padata: Add some ...
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
  /*
   * padata_get_next - Get the next object that needs serialization.
   *
   * Return values are:
   *
   * A pointer to the control struct of the next object that needs
   * serialization, if present in one of the percpu reorder queues.
   *
   * NULL, if all percpu reorder queues are empty.
   *
   * -EINPROGRESS, if the next object that needs serialization will
   *  be parallel processed by another cpu and is not yet present in
   *  the cpu's reorder queue.
   *
   * -ENODATA, if this cpu has to do the parallel processing for
   *  the next object.
   */
16295bec6   Steffen Klassert   padata: Generic p...
158
159
  static struct padata_priv *padata_get_next(struct parallel_data *pd)
  {
5f1a8c1bc   Steffen Klassert   padata: simplify ...
160
  	int cpu, num_cpus;
2dc9b5dbd   Steffen Klassert   padata: Fix race ...
161
  	unsigned int next_nr, next_index;
f0fcf2002   Shan Wei   padata: use __thi...
162
  	struct padata_parallel_queue *next_queue;
16295bec6   Steffen Klassert   padata: Generic p...
163
164
  	struct padata_priv *padata;
  	struct padata_list *reorder;
e15bacbeb   Dan Kruchinin   padata: Make two ...
165
  	num_cpus = cpumask_weight(pd->cpumask.pcpu);
16295bec6   Steffen Klassert   padata: Generic p...
166

5f1a8c1bc   Steffen Klassert   padata: simplify ...
167
168
169
170
171
172
173
  	/*
  	 * Calculate the percpu reorder queue and the sequence
  	 * number of the next object.
  	 */
  	next_nr = pd->processed;
  	next_index = next_nr % num_cpus;
  	cpu = padata_index_to_cpu(pd, next_index);
e15bacbeb   Dan Kruchinin   padata: Make two ...
174
  	next_queue = per_cpu_ptr(pd->pqueue, cpu);
5f1a8c1bc   Steffen Klassert   padata: simplify ...
175

16295bec6   Steffen Klassert   padata: Generic p...
176
  	padata = NULL;
16295bec6   Steffen Klassert   padata: Generic p...
177
178
179
180
181
  	reorder = &next_queue->reorder;
  
  	if (!list_empty(&reorder->list)) {
  		padata = list_entry(reorder->list.next,
  				    struct padata_priv, list);
16295bec6   Steffen Klassert   padata: Generic p...
182
183
184
185
  		spin_lock(&reorder->lock);
  		list_del_init(&padata->list);
  		atomic_dec(&pd->reorder_objects);
  		spin_unlock(&reorder->lock);
5f1a8c1bc   Steffen Klassert   padata: simplify ...
186
  		pd->processed++;
16295bec6   Steffen Klassert   padata: Generic p...
187
188
189
  
  		goto out;
  	}
f0fcf2002   Shan Wei   padata: use __thi...
190
  	if (__this_cpu_read(pd->pqueue->cpu_index) == next_queue->cpu_index) {
16295bec6   Steffen Klassert   padata: Generic p...
191
192
193
194
195
196
197
198
199
200
201
  		padata = ERR_PTR(-ENODATA);
  		goto out;
  	}
  
  	padata = ERR_PTR(-EINPROGRESS);
  out:
  	return padata;
  }
  
  static void padata_reorder(struct parallel_data *pd)
  {
3047817b8   Steffen Klassert   padata: Fix race ...
202
  	int cb_cpu;
16295bec6   Steffen Klassert   padata: Generic p...
203
  	struct padata_priv *padata;
e15bacbeb   Dan Kruchinin   padata: Make two ...
204
  	struct padata_serial_queue *squeue;
16295bec6   Steffen Klassert   padata: Generic p...
205
  	struct padata_instance *pinst = pd->pinst;
0198ffd13   Steffen Klassert   padata: Add some ...
206
207
208
209
210
211
212
213
214
215
  	/*
  	 * We need to ensure that only one cpu can work on dequeueing of
  	 * the reorder queue the time. Calculating in which percpu reorder
  	 * queue the next object will arrive takes some time. A spinlock
  	 * would be highly contended. Also it is not clear in which order
  	 * the objects arrive to the reorder queues. So a cpu could wait to
  	 * get the lock just to notice that there is nothing to do at the
  	 * moment. Therefore we use a trylock and let the holder of the lock
  	 * care for all the objects enqueued during the holdtime of the lock.
  	 */
16295bec6   Steffen Klassert   padata: Generic p...
216
  	if (!spin_trylock_bh(&pd->lock))
d46a5ac7a   Steffen Klassert   padata: Use a tim...
217
  		return;
16295bec6   Steffen Klassert   padata: Generic p...
218
219
220
  
  	while (1) {
  		padata = padata_get_next(pd);
0198ffd13   Steffen Klassert   padata: Add some ...
221
222
223
224
225
226
  		/*
  		 * All reorder queues are empty, or the next object that needs
  		 * serialization is parallel processed by another cpu and is
  		 * still on it's way to the cpu's reorder queue, nothing to
  		 * do for now.
  		 */
16295bec6   Steffen Klassert   padata: Generic p...
227
228
  		if (!padata || PTR_ERR(padata) == -EINPROGRESS)
  			break;
0198ffd13   Steffen Klassert   padata: Add some ...
229
230
231
  		/*
  		 * This cpu has to do the parallel processing of the next
  		 * object. It's waiting in the cpu's parallelization queue,
25985edce   Lucas De Marchi   Fix common misspe...
232
  		 * so exit immediately.
0198ffd13   Steffen Klassert   padata: Add some ...
233
  		 */
16295bec6   Steffen Klassert   padata: Generic p...
234
  		if (PTR_ERR(padata) == -ENODATA) {
d46a5ac7a   Steffen Klassert   padata: Use a tim...
235
  			del_timer(&pd->timer);
16295bec6   Steffen Klassert   padata: Generic p...
236
  			spin_unlock_bh(&pd->lock);
d46a5ac7a   Steffen Klassert   padata: Use a tim...
237
  			return;
16295bec6   Steffen Klassert   padata: Generic p...
238
  		}
3047817b8   Steffen Klassert   padata: Fix race ...
239
240
  		cb_cpu = padata->cb_cpu;
  		squeue = per_cpu_ptr(pd->squeue, cb_cpu);
16295bec6   Steffen Klassert   padata: Generic p...
241

e15bacbeb   Dan Kruchinin   padata: Make two ...
242
243
244
  		spin_lock(&squeue->serial.lock);
  		list_add_tail(&padata->list, &squeue->serial.list);
  		spin_unlock(&squeue->serial.lock);
16295bec6   Steffen Klassert   padata: Generic p...
245

3047817b8   Steffen Klassert   padata: Fix race ...
246
  		queue_work_on(cb_cpu, pinst->wq, &squeue->work);
16295bec6   Steffen Klassert   padata: Generic p...
247
248
249
  	}
  
  	spin_unlock_bh(&pd->lock);
0198ffd13   Steffen Klassert   padata: Add some ...
250
251
252
  	/*
  	 * The next object that needs serialization might have arrived to
  	 * the reorder queues in the meantime, we will be called again
25985edce   Lucas De Marchi   Fix common misspe...
253
  	 * from the timer function if no one else cares for it.
0198ffd13   Steffen Klassert   padata: Add some ...
254
  	 */
d46a5ac7a   Steffen Klassert   padata: Use a tim...
255
256
257
258
259
  	if (atomic_read(&pd->reorder_objects)
  			&& !(pinst->flags & PADATA_RESET))
  		mod_timer(&pd->timer, jiffies + HZ);
  	else
  		del_timer(&pd->timer);
16295bec6   Steffen Klassert   padata: Generic p...
260

16295bec6   Steffen Klassert   padata: Generic p...
261
262
  	return;
  }
d46a5ac7a   Steffen Klassert   padata: Use a tim...
263
264
265
266
267
268
  static void padata_reorder_timer(unsigned long arg)
  {
  	struct parallel_data *pd = (struct parallel_data *)arg;
  
  	padata_reorder(pd);
  }
e15bacbeb   Dan Kruchinin   padata: Make two ...
269
  static void padata_serial_worker(struct work_struct *serial_work)
16295bec6   Steffen Klassert   padata: Generic p...
270
  {
e15bacbeb   Dan Kruchinin   padata: Make two ...
271
  	struct padata_serial_queue *squeue;
16295bec6   Steffen Klassert   padata: Generic p...
272
273
274
275
  	struct parallel_data *pd;
  	LIST_HEAD(local_list);
  
  	local_bh_disable();
e15bacbeb   Dan Kruchinin   padata: Make two ...
276
277
  	squeue = container_of(serial_work, struct padata_serial_queue, work);
  	pd = squeue->pd;
16295bec6   Steffen Klassert   padata: Generic p...
278

e15bacbeb   Dan Kruchinin   padata: Make two ...
279
280
281
  	spin_lock(&squeue->serial.lock);
  	list_replace_init(&squeue->serial.list, &local_list);
  	spin_unlock(&squeue->serial.lock);
16295bec6   Steffen Klassert   padata: Generic p...
282
283
284
285
286
287
288
289
290
291
292
293
294
295
  
  	while (!list_empty(&local_list)) {
  		struct padata_priv *padata;
  
  		padata = list_entry(local_list.next,
  				    struct padata_priv, list);
  
  		list_del_init(&padata->list);
  
  		padata->serial(padata);
  		atomic_dec(&pd->refcnt);
  	}
  	local_bh_enable();
  }
0198ffd13   Steffen Klassert   padata: Add some ...
296
  /**
16295bec6   Steffen Klassert   padata: Generic p...
297
298
299
300
301
302
303
304
305
306
   * padata_do_serial - padata serialization function
   *
   * @padata: object to be serialized.
   *
   * padata_do_serial must be called for every parallelized object.
   * The serialization callback function will run with BHs off.
   */
  void padata_do_serial(struct padata_priv *padata)
  {
  	int cpu;
e15bacbeb   Dan Kruchinin   padata: Make two ...
307
  	struct padata_parallel_queue *pqueue;
16295bec6   Steffen Klassert   padata: Generic p...
308
309
310
311
312
  	struct parallel_data *pd;
  
  	pd = padata->pd;
  
  	cpu = get_cpu();
e15bacbeb   Dan Kruchinin   padata: Make two ...
313
  	pqueue = per_cpu_ptr(pd->pqueue, cpu);
16295bec6   Steffen Klassert   padata: Generic p...
314

e15bacbeb   Dan Kruchinin   padata: Make two ...
315
  	spin_lock(&pqueue->reorder.lock);
16295bec6   Steffen Klassert   padata: Generic p...
316
  	atomic_inc(&pd->reorder_objects);
e15bacbeb   Dan Kruchinin   padata: Make two ...
317
318
  	list_add_tail(&padata->list, &pqueue->reorder.list);
  	spin_unlock(&pqueue->reorder.lock);
16295bec6   Steffen Klassert   padata: Generic p...
319
320
321
322
323
324
  
  	put_cpu();
  
  	padata_reorder(pd);
  }
  EXPORT_SYMBOL(padata_do_serial);
e15bacbeb   Dan Kruchinin   padata: Make two ...
325
326
327
  static int padata_setup_cpumasks(struct parallel_data *pd,
  				 const struct cpumask *pcpumask,
  				 const struct cpumask *cbcpumask)
16295bec6   Steffen Klassert   padata: Generic p...
328
  {
e15bacbeb   Dan Kruchinin   padata: Make two ...
329
330
  	if (!alloc_cpumask_var(&pd->cpumask.pcpu, GFP_KERNEL))
  		return -ENOMEM;
16295bec6   Steffen Klassert   padata: Generic p...
331

13614e0fb   Steffen Klassert   padata: Use the o...
332
  	cpumask_and(pd->cpumask.pcpu, pcpumask, cpu_online_mask);
e15bacbeb   Dan Kruchinin   padata: Make two ...
333
334
335
336
  	if (!alloc_cpumask_var(&pd->cpumask.cbcpu, GFP_KERNEL)) {
  		free_cpumask_var(pd->cpumask.cbcpu);
  		return -ENOMEM;
  	}
16295bec6   Steffen Klassert   padata: Generic p...
337

13614e0fb   Steffen Klassert   padata: Use the o...
338
  	cpumask_and(pd->cpumask.cbcpu, cbcpumask, cpu_online_mask);
e15bacbeb   Dan Kruchinin   padata: Make two ...
339
340
  	return 0;
  }
16295bec6   Steffen Klassert   padata: Generic p...
341

e15bacbeb   Dan Kruchinin   padata: Make two ...
342
343
344
345
346
  static void __padata_list_init(struct padata_list *pd_list)
  {
  	INIT_LIST_HEAD(&pd_list->list);
  	spin_lock_init(&pd_list->lock);
  }
16295bec6   Steffen Klassert   padata: Generic p...
347

e15bacbeb   Dan Kruchinin   padata: Make two ...
348
349
350
351
352
  /* Initialize all percpu queues used by serial workers */
  static void padata_init_squeues(struct parallel_data *pd)
  {
  	int cpu;
  	struct padata_serial_queue *squeue;
7b389b2cc   Steffen Klassert   padata: Initializ...
353

e15bacbeb   Dan Kruchinin   padata: Make two ...
354
355
356
357
358
359
360
  	for_each_cpu(cpu, pd->cpumask.cbcpu) {
  		squeue = per_cpu_ptr(pd->squeue, cpu);
  		squeue->pd = pd;
  		__padata_list_init(&squeue->serial);
  		INIT_WORK(&squeue->work, padata_serial_worker);
  	}
  }
16295bec6   Steffen Klassert   padata: Generic p...
361

e15bacbeb   Dan Kruchinin   padata: Make two ...
362
363
364
  /* Initialize all percpu queues used by parallel workers */
  static void padata_init_pqueues(struct parallel_data *pd)
  {
2dc9b5dbd   Steffen Klassert   padata: Fix race ...
365
  	int cpu_index, cpu;
e15bacbeb   Dan Kruchinin   padata: Make two ...
366
  	struct padata_parallel_queue *pqueue;
16295bec6   Steffen Klassert   padata: Generic p...
367

e15bacbeb   Dan Kruchinin   padata: Make two ...
368
369
370
371
372
  	cpu_index = 0;
  	for_each_cpu(cpu, pd->cpumask.pcpu) {
  		pqueue = per_cpu_ptr(pd->pqueue, cpu);
  		pqueue->pd = pd;
  		pqueue->cpu_index = cpu_index;
7b389b2cc   Steffen Klassert   padata: Initializ...
373
  		cpu_index++;
16295bec6   Steffen Klassert   padata: Generic p...
374

e15bacbeb   Dan Kruchinin   padata: Make two ...
375
376
377
378
  		__padata_list_init(&pqueue->reorder);
  		__padata_list_init(&pqueue->parallel);
  		INIT_WORK(&pqueue->work, padata_parallel_worker);
  		atomic_set(&pqueue->num_obj, 0);
16295bec6   Steffen Klassert   padata: Generic p...
379
  	}
e15bacbeb   Dan Kruchinin   padata: Make two ...
380
  }
16295bec6   Steffen Klassert   padata: Generic p...
381

e15bacbeb   Dan Kruchinin   padata: Make two ...
382
383
384
385
386
387
  /* Allocate and initialize the internal cpumask dependend resources. */
  static struct parallel_data *padata_alloc_pd(struct padata_instance *pinst,
  					     const struct cpumask *pcpumask,
  					     const struct cpumask *cbcpumask)
  {
  	struct parallel_data *pd;
16295bec6   Steffen Klassert   padata: Generic p...
388

e15bacbeb   Dan Kruchinin   padata: Make two ...
389
390
391
  	pd = kzalloc(sizeof(struct parallel_data), GFP_KERNEL);
  	if (!pd)
  		goto err;
16295bec6   Steffen Klassert   padata: Generic p...
392

e15bacbeb   Dan Kruchinin   padata: Make two ...
393
394
395
396
397
398
399
400
401
  	pd->pqueue = alloc_percpu(struct padata_parallel_queue);
  	if (!pd->pqueue)
  		goto err_free_pd;
  
  	pd->squeue = alloc_percpu(struct padata_serial_queue);
  	if (!pd->squeue)
  		goto err_free_pqueue;
  	if (padata_setup_cpumasks(pd, pcpumask, cbcpumask) < 0)
  		goto err_free_squeue;
16295bec6   Steffen Klassert   padata: Generic p...
402

e15bacbeb   Dan Kruchinin   padata: Make two ...
403
404
  	padata_init_pqueues(pd);
  	padata_init_squeues(pd);
d46a5ac7a   Steffen Klassert   padata: Use a tim...
405
  	setup_timer(&pd->timer, padata_reorder_timer, (unsigned long)pd);
0b6b098ef   Mathias Krause   padata: make the ...
406
  	atomic_set(&pd->seq_nr, -1);
16295bec6   Steffen Klassert   padata: Generic p...
407
408
409
410
411
412
  	atomic_set(&pd->reorder_objects, 0);
  	atomic_set(&pd->refcnt, 0);
  	pd->pinst = pinst;
  	spin_lock_init(&pd->lock);
  
  	return pd;
e15bacbeb   Dan Kruchinin   padata: Make two ...
413
414
415
416
  err_free_squeue:
  	free_percpu(pd->squeue);
  err_free_pqueue:
  	free_percpu(pd->pqueue);
16295bec6   Steffen Klassert   padata: Generic p...
417
418
419
420
421
422
423
424
  err_free_pd:
  	kfree(pd);
  err:
  	return NULL;
  }
  
  static void padata_free_pd(struct parallel_data *pd)
  {
e15bacbeb   Dan Kruchinin   padata: Make two ...
425
426
427
428
  	free_cpumask_var(pd->cpumask.pcpu);
  	free_cpumask_var(pd->cpumask.cbcpu);
  	free_percpu(pd->pqueue);
  	free_percpu(pd->squeue);
16295bec6   Steffen Klassert   padata: Generic p...
429
430
  	kfree(pd);
  }
0198ffd13   Steffen Klassert   padata: Add some ...
431
  /* Flush all objects out of the padata queues. */
2b73b07ab   Steffen Klassert   padata: Flush the...
432
433
434
  static void padata_flush_queues(struct parallel_data *pd)
  {
  	int cpu;
e15bacbeb   Dan Kruchinin   padata: Make two ...
435
436
  	struct padata_parallel_queue *pqueue;
  	struct padata_serial_queue *squeue;
2b73b07ab   Steffen Klassert   padata: Flush the...
437

e15bacbeb   Dan Kruchinin   padata: Make two ...
438
439
440
  	for_each_cpu(cpu, pd->cpumask.pcpu) {
  		pqueue = per_cpu_ptr(pd->pqueue, cpu);
  		flush_work(&pqueue->work);
2b73b07ab   Steffen Klassert   padata: Flush the...
441
442
443
444
445
446
  	}
  
  	del_timer_sync(&pd->timer);
  
  	if (atomic_read(&pd->reorder_objects))
  		padata_reorder(pd);
e15bacbeb   Dan Kruchinin   padata: Make two ...
447
448
449
  	for_each_cpu(cpu, pd->cpumask.cbcpu) {
  		squeue = per_cpu_ptr(pd->squeue, cpu);
  		flush_work(&squeue->work);
2b73b07ab   Steffen Klassert   padata: Flush the...
450
451
452
453
  	}
  
  	BUG_ON(atomic_read(&pd->refcnt) != 0);
  }
4c8791702   Steffen Klassert   padata: Check for...
454
455
456
457
  static void __padata_start(struct padata_instance *pinst)
  {
  	pinst->flags |= PADATA_INIT;
  }
ee8365551   Steffen Klassert   padata: Block unt...
458
459
460
461
462
463
464
465
466
467
468
469
470
  static void __padata_stop(struct padata_instance *pinst)
  {
  	if (!(pinst->flags & PADATA_INIT))
  		return;
  
  	pinst->flags &= ~PADATA_INIT;
  
  	synchronize_rcu();
  
  	get_online_cpus();
  	padata_flush_queues(pinst->pd);
  	put_online_cpus();
  }
25985edce   Lucas De Marchi   Fix common misspe...
471
  /* Replace the internal control structure with a new one. */
16295bec6   Steffen Klassert   padata: Generic p...
472
473
474
475
  static void padata_replace(struct padata_instance *pinst,
  			   struct parallel_data *pd_new)
  {
  	struct parallel_data *pd_old = pinst->pd;
e15bacbeb   Dan Kruchinin   padata: Make two ...
476
  	int notification_mask = 0;
16295bec6   Steffen Klassert   padata: Generic p...
477
478
479
480
481
482
  
  	pinst->flags |= PADATA_RESET;
  
  	rcu_assign_pointer(pinst->pd, pd_new);
  
  	synchronize_rcu();
e15bacbeb   Dan Kruchinin   padata: Make two ...
483
484
485
486
  	if (!cpumask_equal(pd_old->cpumask.pcpu, pd_new->cpumask.pcpu))
  		notification_mask |= PADATA_CPU_PARALLEL;
  	if (!cpumask_equal(pd_old->cpumask.cbcpu, pd_new->cpumask.cbcpu))
  		notification_mask |= PADATA_CPU_SERIAL;
2b73b07ab   Steffen Klassert   padata: Flush the...
487
  	padata_flush_queues(pd_old);
16295bec6   Steffen Klassert   padata: Generic p...
488
  	padata_free_pd(pd_old);
e15bacbeb   Dan Kruchinin   padata: Make two ...
489
490
  	if (notification_mask)
  		blocking_notifier_call_chain(&pinst->cpumask_change_notifier,
c635696c7   Steffen Klassert   padata: Pass the ...
491
492
  					     notification_mask,
  					     &pd_new->cpumask);
16295bec6   Steffen Klassert   padata: Generic p...
493
494
495
  
  	pinst->flags &= ~PADATA_RESET;
  }
0198ffd13   Steffen Klassert   padata: Add some ...
496
  /**
e15bacbeb   Dan Kruchinin   padata: Make two ...
497
498
   * padata_register_cpumask_notifier - Registers a notifier that will be called
   *                             if either pcpu or cbcpu or both cpumasks change.
16295bec6   Steffen Klassert   padata: Generic p...
499
   *
e15bacbeb   Dan Kruchinin   padata: Make two ...
500
501
   * @pinst: A poineter to padata instance
   * @nblock: A pointer to notifier block.
16295bec6   Steffen Klassert   padata: Generic p...
502
   */
e15bacbeb   Dan Kruchinin   padata: Make two ...
503
504
  int padata_register_cpumask_notifier(struct padata_instance *pinst,
  				     struct notifier_block *nblock)
16295bec6   Steffen Klassert   padata: Generic p...
505
  {
e15bacbeb   Dan Kruchinin   padata: Make two ...
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
  	return blocking_notifier_chain_register(&pinst->cpumask_change_notifier,
  						nblock);
  }
  EXPORT_SYMBOL(padata_register_cpumask_notifier);
  
  /**
   * padata_unregister_cpumask_notifier - Unregisters cpumask notifier
   *        registered earlier  using padata_register_cpumask_notifier
   *
   * @pinst: A pointer to data instance.
   * @nlock: A pointer to notifier block.
   */
  int padata_unregister_cpumask_notifier(struct padata_instance *pinst,
  				       struct notifier_block *nblock)
  {
  	return blocking_notifier_chain_unregister(
  		&pinst->cpumask_change_notifier,
  		nblock);
  }
  EXPORT_SYMBOL(padata_unregister_cpumask_notifier);
33e544506   Steffen Klassert   padata: Handle em...
526
527
528
529
  /* If cpumask contains no active cpu, we mark the instance as invalid. */
  static bool padata_validate_cpumask(struct padata_instance *pinst,
  				    const struct cpumask *cpumask)
  {
13614e0fb   Steffen Klassert   padata: Use the o...
530
  	if (!cpumask_intersects(cpumask, cpu_online_mask)) {
33e544506   Steffen Klassert   padata: Handle em...
531
532
533
534
535
536
537
  		pinst->flags |= PADATA_INVALID;
  		return false;
  	}
  
  	pinst->flags &= ~PADATA_INVALID;
  	return true;
  }
65ff577e6   Steffen Klassert   padata: Rearrange...
538
539
540
541
542
  static int __padata_set_cpumasks(struct padata_instance *pinst,
  				 cpumask_var_t pcpumask,
  				 cpumask_var_t cbcpumask)
  {
  	int valid;
16295bec6   Steffen Klassert   padata: Generic p...
543
  	struct parallel_data *pd;
65ff577e6   Steffen Klassert   padata: Rearrange...
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
  
  	valid = padata_validate_cpumask(pinst, pcpumask);
  	if (!valid) {
  		__padata_stop(pinst);
  		goto out_replace;
  	}
  
  	valid = padata_validate_cpumask(pinst, cbcpumask);
  	if (!valid)
  		__padata_stop(pinst);
  
  out_replace:
  	pd = padata_alloc_pd(pinst, pcpumask, cbcpumask);
  	if (!pd)
  		return -ENOMEM;
  
  	cpumask_copy(pinst->cpumask.pcpu, pcpumask);
  	cpumask_copy(pinst->cpumask.cbcpu, cbcpumask);
  
  	padata_replace(pinst, pd);
  
  	if (valid)
  		__padata_start(pinst);
  
  	return 0;
  }
  
  /**
e15bacbeb   Dan Kruchinin   padata: Make two ...
572
573
   * padata_set_cpumask: Sets specified by @cpumask_type cpumask to the value
   *                     equivalent to @cpumask.
16295bec6   Steffen Klassert   padata: Generic p...
574
575
   *
   * @pinst: padata instance
e15bacbeb   Dan Kruchinin   padata: Make two ...
576
577
   * @cpumask_type: PADATA_CPU_SERIAL or PADATA_CPU_PARALLEL corresponding
   *                to parallel and serial cpumasks respectively.
16295bec6   Steffen Klassert   padata: Generic p...
578
579
   * @cpumask: the cpumask to use
   */
e15bacbeb   Dan Kruchinin   padata: Make two ...
580
581
582
583
  int padata_set_cpumask(struct padata_instance *pinst, int cpumask_type,
  		       cpumask_var_t cpumask)
  {
  	struct cpumask *serial_mask, *parallel_mask;
65ff577e6   Steffen Klassert   padata: Rearrange...
584
585
586
  	int err = -EINVAL;
  
  	mutex_lock(&pinst->lock);
6751fb3c0   Steffen Klassert   padata: Use get_o...
587
  	get_online_cpus();
e15bacbeb   Dan Kruchinin   padata: Make two ...
588
589
590
591
592
593
594
595
596
597
  	switch (cpumask_type) {
  	case PADATA_CPU_PARALLEL:
  		serial_mask = pinst->cpumask.cbcpu;
  		parallel_mask = cpumask;
  		break;
  	case PADATA_CPU_SERIAL:
  		parallel_mask = pinst->cpumask.pcpu;
  		serial_mask = cpumask;
  		break;
  	default:
65ff577e6   Steffen Klassert   padata: Rearrange...
598
  		 goto out;
16295bec6   Steffen Klassert   padata: Generic p...
599
  	}
65ff577e6   Steffen Klassert   padata: Rearrange...
600
  	err =  __padata_set_cpumasks(pinst, parallel_mask, serial_mask);
16295bec6   Steffen Klassert   padata: Generic p...
601
602
  
  out:
6751fb3c0   Steffen Klassert   padata: Use get_o...
603
  	put_online_cpus();
16295bec6   Steffen Klassert   padata: Generic p...
604
605
606
607
608
  	mutex_unlock(&pinst->lock);
  
  	return err;
  }
  EXPORT_SYMBOL(padata_set_cpumask);
19d795b67   Arnd Bergmann   kernel/padata.c: ...
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
  /**
   * padata_start - start the parallel processing
   *
   * @pinst: padata instance to start
   */
  int padata_start(struct padata_instance *pinst)
  {
  	int err = 0;
  
  	mutex_lock(&pinst->lock);
  
  	if (pinst->flags & PADATA_INVALID)
  		err = -EINVAL;
  
  	 __padata_start(pinst);
  
  	mutex_unlock(&pinst->lock);
  
  	return err;
  }
  EXPORT_SYMBOL(padata_start);
  
  /**
   * padata_stop - stop the parallel processing
   *
   * @pinst: padata instance to stop
   */
  void padata_stop(struct padata_instance *pinst)
  {
  	mutex_lock(&pinst->lock);
  	__padata_stop(pinst);
  	mutex_unlock(&pinst->lock);
  }
  EXPORT_SYMBOL(padata_stop);
  
  #ifdef CONFIG_HOTPLUG_CPU
16295bec6   Steffen Klassert   padata: Generic p...
645
646
647
  static int __padata_add_cpu(struct padata_instance *pinst, int cpu)
  {
  	struct parallel_data *pd;
13614e0fb   Steffen Klassert   padata: Use the o...
648
  	if (cpumask_test_cpu(cpu, cpu_online_mask)) {
e15bacbeb   Dan Kruchinin   padata: Make two ...
649
650
  		pd = padata_alloc_pd(pinst, pinst->cpumask.pcpu,
  				     pinst->cpumask.cbcpu);
16295bec6   Steffen Klassert   padata: Generic p...
651
652
653
654
  		if (!pd)
  			return -ENOMEM;
  
  		padata_replace(pinst, pd);
33e544506   Steffen Klassert   padata: Handle em...
655

e15bacbeb   Dan Kruchinin   padata: Make two ...
656
657
  		if (padata_validate_cpumask(pinst, pinst->cpumask.pcpu) &&
  		    padata_validate_cpumask(pinst, pinst->cpumask.cbcpu))
33e544506   Steffen Klassert   padata: Handle em...
658
  			__padata_start(pinst);
16295bec6   Steffen Klassert   padata: Generic p...
659
660
661
662
  	}
  
  	return 0;
  }
16295bec6   Steffen Klassert   padata: Generic p...
663
664
  static int __padata_remove_cpu(struct padata_instance *pinst, int cpu)
  {
33e544506   Steffen Klassert   padata: Handle em...
665
  	struct parallel_data *pd = NULL;
16295bec6   Steffen Klassert   padata: Generic p...
666
667
  
  	if (cpumask_test_cpu(cpu, cpu_online_mask)) {
33e544506   Steffen Klassert   padata: Handle em...
668

e15bacbeb   Dan Kruchinin   padata: Make two ...
669
  		if (!padata_validate_cpumask(pinst, pinst->cpumask.pcpu) ||
b89661dff   Steffen Klassert   padata: Allocate ...
670
  		    !padata_validate_cpumask(pinst, pinst->cpumask.cbcpu))
33e544506   Steffen Klassert   padata: Handle em...
671
  			__padata_stop(pinst);
33e544506   Steffen Klassert   padata: Handle em...
672

e15bacbeb   Dan Kruchinin   padata: Make two ...
673
674
  		pd = padata_alloc_pd(pinst, pinst->cpumask.pcpu,
  				     pinst->cpumask.cbcpu);
16295bec6   Steffen Klassert   padata: Generic p...
675
676
677
678
  		if (!pd)
  			return -ENOMEM;
  
  		padata_replace(pinst, pd);
961209052   Steffen Klassert   padata: Fix cpu h...
679
680
681
  
  		cpumask_clear_cpu(cpu, pd->cpumask.cbcpu);
  		cpumask_clear_cpu(cpu, pd->cpumask.pcpu);
16295bec6   Steffen Klassert   padata: Generic p...
682
683
684
685
  	}
  
  	return 0;
  }
e15bacbeb   Dan Kruchinin   padata: Make two ...
686
   /**
25985edce   Lucas De Marchi   Fix common misspe...
687
   * padata_remove_cpu - remove a cpu from the one or both(serial and parallel)
e15bacbeb   Dan Kruchinin   padata: Make two ...
688
   *                     padata cpumasks.
16295bec6   Steffen Klassert   padata: Generic p...
689
690
691
   *
   * @pinst: padata instance
   * @cpu: cpu to remove
e15bacbeb   Dan Kruchinin   padata: Make two ...
692
693
694
695
   * @mask: bitmask specifying from which cpumask @cpu should be removed
   *        The @mask may be any combination of the following flags:
   *          PADATA_CPU_SERIAL   - serial cpumask
   *          PADATA_CPU_PARALLEL - parallel cpumask
16295bec6   Steffen Klassert   padata: Generic p...
696
   */
e15bacbeb   Dan Kruchinin   padata: Make two ...
697
  int padata_remove_cpu(struct padata_instance *pinst, int cpu, int mask)
16295bec6   Steffen Klassert   padata: Generic p...
698
699
  {
  	int err;
e15bacbeb   Dan Kruchinin   padata: Make two ...
700
701
  	if (!(mask & (PADATA_CPU_SERIAL | PADATA_CPU_PARALLEL)))
  		return -EINVAL;
16295bec6   Steffen Klassert   padata: Generic p...
702
  	mutex_lock(&pinst->lock);
6751fb3c0   Steffen Klassert   padata: Use get_o...
703
  	get_online_cpus();
e15bacbeb   Dan Kruchinin   padata: Make two ...
704
705
706
707
  	if (mask & PADATA_CPU_SERIAL)
  		cpumask_clear_cpu(cpu, pinst->cpumask.cbcpu);
  	if (mask & PADATA_CPU_PARALLEL)
  		cpumask_clear_cpu(cpu, pinst->cpumask.pcpu);
16295bec6   Steffen Klassert   padata: Generic p...
708
  	err = __padata_remove_cpu(pinst, cpu);
6751fb3c0   Steffen Klassert   padata: Use get_o...
709
  	put_online_cpus();
16295bec6   Steffen Klassert   padata: Generic p...
710
711
712
713
714
715
  
  	mutex_unlock(&pinst->lock);
  
  	return err;
  }
  EXPORT_SYMBOL(padata_remove_cpu);
e15bacbeb   Dan Kruchinin   padata: Make two ...
716
717
718
719
720
  static inline int pinst_has_cpu(struct padata_instance *pinst, int cpu)
  {
  	return cpumask_test_cpu(cpu, pinst->cpumask.pcpu) ||
  		cpumask_test_cpu(cpu, pinst->cpumask.cbcpu);
  }
30e92153b   Sebastian Andrzej Siewior   padata: Convert t...
721
  static int padata_cpu_online(unsigned int cpu, struct hlist_node *node)
16295bec6   Steffen Klassert   padata: Generic p...
722
  {
16295bec6   Steffen Klassert   padata: Generic p...
723
  	struct padata_instance *pinst;
30e92153b   Sebastian Andrzej Siewior   padata: Convert t...
724
  	int ret;
16295bec6   Steffen Klassert   padata: Generic p...
725

30e92153b   Sebastian Andrzej Siewior   padata: Convert t...
726
727
728
  	pinst = hlist_entry_safe(node, struct padata_instance, node);
  	if (!pinst_has_cpu(pinst, cpu))
  		return 0;
16295bec6   Steffen Klassert   padata: Generic p...
729

30e92153b   Sebastian Andrzej Siewior   padata: Convert t...
730
731
732
733
734
  	mutex_lock(&pinst->lock);
  	ret = __padata_add_cpu(pinst, cpu);
  	mutex_unlock(&pinst->lock);
  	return ret;
  }
16295bec6   Steffen Klassert   padata: Generic p...
735

30e92153b   Sebastian Andrzej Siewior   padata: Convert t...
736
737
738
739
740
741
742
743
  static int padata_cpu_prep_down(unsigned int cpu, struct hlist_node *node)
  {
  	struct padata_instance *pinst;
  	int ret;
  
  	pinst = hlist_entry_safe(node, struct padata_instance, node);
  	if (!pinst_has_cpu(pinst, cpu))
  		return 0;
16295bec6   Steffen Klassert   padata: Generic p...
744

30e92153b   Sebastian Andrzej Siewior   padata: Convert t...
745
746
747
748
  	mutex_lock(&pinst->lock);
  	ret = __padata_remove_cpu(pinst, cpu);
  	mutex_unlock(&pinst->lock);
  	return ret;
16295bec6   Steffen Klassert   padata: Generic p...
749
  }
30e92153b   Sebastian Andrzej Siewior   padata: Convert t...
750
751
  
  static enum cpuhp_state hp_online;
e2cb2f1c2   Steffen Klassert   padata: cpu hotpl...
752
  #endif
16295bec6   Steffen Klassert   padata: Generic p...
753

5e017dc3f   Dan Kruchinin   padata: Added sys...
754
755
756
  static void __padata_free(struct padata_instance *pinst)
  {
  #ifdef CONFIG_HOTPLUG_CPU
30e92153b   Sebastian Andrzej Siewior   padata: Convert t...
757
  	cpuhp_state_remove_instance_nocalls(hp_online, &pinst->node);
5e017dc3f   Dan Kruchinin   padata: Added sys...
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
  #endif
  
  	padata_stop(pinst);
  	padata_free_pd(pinst->pd);
  	free_cpumask_var(pinst->cpumask.pcpu);
  	free_cpumask_var(pinst->cpumask.cbcpu);
  	kfree(pinst);
  }
  
  #define kobj2pinst(_kobj)					\
  	container_of(_kobj, struct padata_instance, kobj)
  #define attr2pentry(_attr)					\
  	container_of(_attr, struct padata_sysfs_entry, attr)
  
  static void padata_sysfs_release(struct kobject *kobj)
  {
  	struct padata_instance *pinst = kobj2pinst(kobj);
  	__padata_free(pinst);
  }
  
  struct padata_sysfs_entry {
  	struct attribute attr;
  	ssize_t (*show)(struct padata_instance *, struct attribute *, char *);
  	ssize_t (*store)(struct padata_instance *, struct attribute *,
  			 const char *, size_t);
  };
  
  static ssize_t show_cpumask(struct padata_instance *pinst,
  			    struct attribute *attr,  char *buf)
  {
  	struct cpumask *cpumask;
  	ssize_t len;
  
  	mutex_lock(&pinst->lock);
  	if (!strcmp(attr->name, "serial_cpumask"))
  		cpumask = pinst->cpumask.cbcpu;
  	else
  		cpumask = pinst->cpumask.pcpu;
4497da6f9   Tejun Heo   padata: use %*pb[...
796
797
798
  	len = snprintf(buf, PAGE_SIZE, "%*pb
  ",
  		       nr_cpu_ids, cpumask_bits(cpumask));
5e017dc3f   Dan Kruchinin   padata: Added sys...
799
  	mutex_unlock(&pinst->lock);
4497da6f9   Tejun Heo   padata: use %*pb[...
800
  	return len < PAGE_SIZE ? len : -EINVAL;
5e017dc3f   Dan Kruchinin   padata: Added sys...
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
  }
  
  static ssize_t store_cpumask(struct padata_instance *pinst,
  			     struct attribute *attr,
  			     const char *buf, size_t count)
  {
  	cpumask_var_t new_cpumask;
  	ssize_t ret;
  	int mask_type;
  
  	if (!alloc_cpumask_var(&new_cpumask, GFP_KERNEL))
  		return -ENOMEM;
  
  	ret = bitmap_parse(buf, count, cpumask_bits(new_cpumask),
  			   nr_cpumask_bits);
  	if (ret < 0)
  		goto out;
  
  	mask_type = !strcmp(attr->name, "serial_cpumask") ?
  		PADATA_CPU_SERIAL : PADATA_CPU_PARALLEL;
  	ret = padata_set_cpumask(pinst, mask_type, new_cpumask);
  	if (!ret)
  		ret = count;
  
  out:
  	free_cpumask_var(new_cpumask);
  	return ret;
  }
  
  #define PADATA_ATTR_RW(_name, _show_name, _store_name)		\
  	static struct padata_sysfs_entry _name##_attr =		\
  		__ATTR(_name, 0644, _show_name, _store_name)
  #define PADATA_ATTR_RO(_name, _show_name)		\
  	static struct padata_sysfs_entry _name##_attr = \
  		__ATTR(_name, 0400, _show_name, NULL)
  
  PADATA_ATTR_RW(serial_cpumask, show_cpumask, store_cpumask);
  PADATA_ATTR_RW(parallel_cpumask, show_cpumask, store_cpumask);
  
  /*
   * Padata sysfs provides the following objects:
   * serial_cpumask   [RW] - cpumask for serial workers
   * parallel_cpumask [RW] - cpumask for parallel workers
   */
  static struct attribute *padata_default_attrs[] = {
  	&serial_cpumask_attr.attr,
  	&parallel_cpumask_attr.attr,
  	NULL,
  };
  
  static ssize_t padata_sysfs_show(struct kobject *kobj,
  				 struct attribute *attr, char *buf)
  {
  	struct padata_instance *pinst;
  	struct padata_sysfs_entry *pentry;
  	ssize_t ret = -EIO;
  
  	pinst = kobj2pinst(kobj);
  	pentry = attr2pentry(attr);
  	if (pentry->show)
  		ret = pentry->show(pinst, attr, buf);
  
  	return ret;
  }
  
  static ssize_t padata_sysfs_store(struct kobject *kobj, struct attribute *attr,
  				  const char *buf, size_t count)
  {
  	struct padata_instance *pinst;
  	struct padata_sysfs_entry *pentry;
  	ssize_t ret = -EIO;
  
  	pinst = kobj2pinst(kobj);
  	pentry = attr2pentry(attr);
  	if (pentry->show)
  		ret = pentry->store(pinst, attr, buf, count);
  
  	return ret;
  }
  
  static const struct sysfs_ops padata_sysfs_ops = {
  	.show = padata_sysfs_show,
  	.store = padata_sysfs_store,
  };
  
  static struct kobj_type padata_attr_type = {
  	.sysfs_ops = &padata_sysfs_ops,
  	.default_attrs = padata_default_attrs,
  	.release = padata_sysfs_release,
  };
0198ffd13   Steffen Klassert   padata: Add some ...
891
  /**
e6cc11707   Steffen Klassert   padata: Rename pa...
892
893
894
   * padata_alloc_possible - Allocate and initialize padata instance.
   *                         Use the cpu_possible_mask for serial and
   *                         parallel workers.
16295bec6   Steffen Klassert   padata: Generic p...
895
   *
16295bec6   Steffen Klassert   padata: Generic p...
896
897
   * @wq: workqueue to use for the allocated padata instance
   */
e6cc11707   Steffen Klassert   padata: Rename pa...
898
  struct padata_instance *padata_alloc_possible(struct workqueue_struct *wq)
e15bacbeb   Dan Kruchinin   padata: Make two ...
899
  {
e6cc11707   Steffen Klassert   padata: Rename pa...
900
  	return padata_alloc(wq, cpu_possible_mask, cpu_possible_mask);
e15bacbeb   Dan Kruchinin   padata: Make two ...
901
  }
e6cc11707   Steffen Klassert   padata: Rename pa...
902
  EXPORT_SYMBOL(padata_alloc_possible);
e15bacbeb   Dan Kruchinin   padata: Make two ...
903
904
  
  /**
e6cc11707   Steffen Klassert   padata: Rename pa...
905
906
   * padata_alloc - allocate and initialize a padata instance and specify
   *                cpumasks for serial and parallel workers.
16295bec6   Steffen Klassert   padata: Generic p...
907
   *
16295bec6   Steffen Klassert   padata: Generic p...
908
   * @wq: workqueue to use for the allocated padata instance
e15bacbeb   Dan Kruchinin   padata: Make two ...
909
910
   * @pcpumask: cpumask that will be used for padata parallelization
   * @cbcpumask: cpumask that will be used for padata serialization
16295bec6   Steffen Klassert   padata: Generic p...
911
   */
e6cc11707   Steffen Klassert   padata: Rename pa...
912
913
914
  struct padata_instance *padata_alloc(struct workqueue_struct *wq,
  				     const struct cpumask *pcpumask,
  				     const struct cpumask *cbcpumask)
16295bec6   Steffen Klassert   padata: Generic p...
915
  {
16295bec6   Steffen Klassert   padata: Generic p...
916
  	struct padata_instance *pinst;
33e544506   Steffen Klassert   padata: Handle em...
917
  	struct parallel_data *pd = NULL;
16295bec6   Steffen Klassert   padata: Generic p...
918
919
920
921
  
  	pinst = kzalloc(sizeof(struct padata_instance), GFP_KERNEL);
  	if (!pinst)
  		goto err;
6751fb3c0   Steffen Klassert   padata: Use get_o...
922
  	get_online_cpus();
e15bacbeb   Dan Kruchinin   padata: Make two ...
923
  	if (!alloc_cpumask_var(&pinst->cpumask.pcpu, GFP_KERNEL))
16295bec6   Steffen Klassert   padata: Generic p...
924
  		goto err_free_inst;
e15bacbeb   Dan Kruchinin   padata: Make two ...
925
926
  	if (!alloc_cpumask_var(&pinst->cpumask.cbcpu, GFP_KERNEL)) {
  		free_cpumask_var(pinst->cpumask.pcpu);
16295bec6   Steffen Klassert   padata: Generic p...
927
  		goto err_free_inst;
33e544506   Steffen Klassert   padata: Handle em...
928
  	}
e15bacbeb   Dan Kruchinin   padata: Make two ...
929
930
931
  	if (!padata_validate_cpumask(pinst, pcpumask) ||
  	    !padata_validate_cpumask(pinst, cbcpumask))
  		goto err_free_masks;
16295bec6   Steffen Klassert   padata: Generic p...
932

e15bacbeb   Dan Kruchinin   padata: Make two ...
933
934
935
  	pd = padata_alloc_pd(pinst, pcpumask, cbcpumask);
  	if (!pd)
  		goto err_free_masks;
747813878   Steffen Klassert   padata: Allocate ...
936

16295bec6   Steffen Klassert   padata: Generic p...
937
938
939
  	rcu_assign_pointer(pinst->pd, pd);
  
  	pinst->wq = wq;
e15bacbeb   Dan Kruchinin   padata: Make two ...
940
941
  	cpumask_copy(pinst->cpumask.pcpu, pcpumask);
  	cpumask_copy(pinst->cpumask.cbcpu, cbcpumask);
16295bec6   Steffen Klassert   padata: Generic p...
942
943
  
  	pinst->flags = 0;
6751fb3c0   Steffen Klassert   padata: Use get_o...
944
  	put_online_cpus();
e15bacbeb   Dan Kruchinin   padata: Make two ...
945
  	BLOCKING_INIT_NOTIFIER_HEAD(&pinst->cpumask_change_notifier);
5e017dc3f   Dan Kruchinin   padata: Added sys...
946
  	kobject_init(&pinst->kobj, &padata_attr_type);
16295bec6   Steffen Klassert   padata: Generic p...
947
  	mutex_init(&pinst->lock);
b8b4a4166   Richard Weinberger   padata - Register...
948
  #ifdef CONFIG_HOTPLUG_CPU
30e92153b   Sebastian Andrzej Siewior   padata: Convert t...
949
  	cpuhp_state_add_instance_nocalls(hp_online, &pinst->node);
b8b4a4166   Richard Weinberger   padata - Register...
950
  #endif
16295bec6   Steffen Klassert   padata: Generic p...
951
  	return pinst;
e15bacbeb   Dan Kruchinin   padata: Make two ...
952
953
954
  err_free_masks:
  	free_cpumask_var(pinst->cpumask.pcpu);
  	free_cpumask_var(pinst->cpumask.cbcpu);
16295bec6   Steffen Klassert   padata: Generic p...
955
956
  err_free_inst:
  	kfree(pinst);
6751fb3c0   Steffen Klassert   padata: Use get_o...
957
  	put_online_cpus();
16295bec6   Steffen Klassert   padata: Generic p...
958
959
960
  err:
  	return NULL;
  }
16295bec6   Steffen Klassert   padata: Generic p...
961

0198ffd13   Steffen Klassert   padata: Add some ...
962
  /**
16295bec6   Steffen Klassert   padata: Generic p...
963
964
   * padata_free - free a padata instance
   *
0198ffd13   Steffen Klassert   padata: Add some ...
965
   * @padata_inst: padata instance to free
16295bec6   Steffen Klassert   padata: Generic p...
966
967
968
   */
  void padata_free(struct padata_instance *pinst)
  {
5e017dc3f   Dan Kruchinin   padata: Added sys...
969
  	kobject_put(&pinst->kobj);
16295bec6   Steffen Klassert   padata: Generic p...
970
971
  }
  EXPORT_SYMBOL(padata_free);
30e92153b   Sebastian Andrzej Siewior   padata: Convert t...
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
  
  #ifdef CONFIG_HOTPLUG_CPU
  
  static __init int padata_driver_init(void)
  {
  	int ret;
  
  	ret = cpuhp_setup_state_multi(CPUHP_AP_ONLINE_DYN, "padata:online",
  				      padata_cpu_online,
  				      padata_cpu_prep_down);
  	if (ret < 0)
  		return ret;
  	hp_online = ret;
  	return 0;
  }
  module_init(padata_driver_init);
  
  static __exit void padata_driver_exit(void)
  {
  	cpuhp_remove_multi_state(hp_online);
  }
  module_exit(padata_driver_exit);
  #endif