Blame view

kernel/padata.c 27.5 KB
16295bec6   Steffen Klassert   padata: Generic p...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
  /*
   * padata.c - generic interface to process data streams in parallel
   *
   * 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.
   */
  
  #include <linux/module.h>
  #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: ...
28
  #include <linux/slab.h>
5e017dc3f   Dan Kruchinin   padata: Added sys...
29
  #include <linux/sysfs.h>
16295bec6   Steffen Klassert   padata: Generic p...
30
  #include <linux/rcupdate.h>
749d811f1   Dan Carpenter   padata: add paren...
31
  #define MAX_SEQ_NR (INT_MAX - NR_CPUS)
97e3d94aa   Steffen Klassert   padata: Dont scal...
32
  #define MAX_OBJ_NUM 1000
16295bec6   Steffen Klassert   padata: Generic p...
33
34
35
36
  
  static int padata_index_to_cpu(struct parallel_data *pd, int cpu_index)
  {
  	int cpu, target_cpu;
e15bacbeb   Dan Kruchinin   padata: Make two ...
37
  	target_cpu = cpumask_first(pd->cpumask.pcpu);
16295bec6   Steffen Klassert   padata: Generic p...
38
  	for (cpu = 0; cpu < cpu_index; cpu++)
e15bacbeb   Dan Kruchinin   padata: Make two ...
39
  		target_cpu = cpumask_next(target_cpu, pd->cpumask.pcpu);
16295bec6   Steffen Klassert   padata: Generic p...
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
  
  	return target_cpu;
  }
  
  static int padata_cpu_hash(struct padata_priv *padata)
  {
  	int cpu_index;
  	struct parallel_data *pd;
  
  	pd =  padata->pd;
  
  	/*
  	 * Hash the sequence numbers to the cpus by taking
  	 * seq_nr mod. number of cpus in use.
  	 */
e15bacbeb   Dan Kruchinin   padata: Make two ...
55
  	cpu_index =  padata->seq_nr % cpumask_weight(pd->cpumask.pcpu);
16295bec6   Steffen Klassert   padata: Generic p...
56
57
58
  
  	return padata_index_to_cpu(pd, cpu_index);
  }
e15bacbeb   Dan Kruchinin   padata: Make two ...
59
  static void padata_parallel_worker(struct work_struct *parallel_work)
16295bec6   Steffen Klassert   padata: Generic p...
60
  {
e15bacbeb   Dan Kruchinin   padata: Make two ...
61
  	struct padata_parallel_queue *pqueue;
16295bec6   Steffen Klassert   padata: Generic p...
62
63
64
65
66
  	struct parallel_data *pd;
  	struct padata_instance *pinst;
  	LIST_HEAD(local_list);
  
  	local_bh_disable();
e15bacbeb   Dan Kruchinin   padata: Make two ...
67
68
69
  	pqueue = container_of(parallel_work,
  			      struct padata_parallel_queue, work);
  	pd = pqueue->pd;
16295bec6   Steffen Klassert   padata: Generic p...
70
  	pinst = pd->pinst;
e15bacbeb   Dan Kruchinin   padata: Make two ...
71
72
73
  	spin_lock(&pqueue->parallel.lock);
  	list_replace_init(&pqueue->parallel.list, &local_list);
  	spin_unlock(&pqueue->parallel.lock);
16295bec6   Steffen Klassert   padata: Generic p...
74
75
76
77
78
79
80
81
82
83
84
85
86
87
  
  	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 ...
88
  /**
16295bec6   Steffen Klassert   padata: Generic p...
89
90
91
92
93
   * 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 ...
94
   *          must be in the serial cpumask of padata(i.e. cpumask.cbcpu).
16295bec6   Steffen Klassert   padata: Generic p...
95
96
97
98
99
100
101
102
103
   *
   * 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 ...
104
  	struct padata_parallel_queue *queue;
16295bec6   Steffen Klassert   padata: Generic p...
105
106
107
108
109
  	struct parallel_data *pd;
  
  	rcu_read_lock_bh();
  
  	pd = rcu_dereference(pinst->pd);
83f619f3c   Steffen Klassert   padata: make pada...
110
  	err = -EINVAL;
7424713b8   Steffen Klassert   padata: Check for...
111
  	if (!(pinst->flags & PADATA_INIT) || pinst->flags & PADATA_INVALID)
16295bec6   Steffen Klassert   padata: Generic p...
112
  		goto out;
e15bacbeb   Dan Kruchinin   padata: Make two ...
113
  	if (!cpumask_test_cpu(cb_cpu, pd->cpumask.cbcpu))
16295bec6   Steffen Klassert   padata: Generic p...
114
115
116
117
118
119
120
121
  		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...
122
  	err = 0;
16295bec6   Steffen Klassert   padata: Generic p...
123
124
125
126
127
128
129
130
131
132
  	atomic_inc(&pd->refcnt);
  	padata->pd = pd;
  	padata->cb_cpu = cb_cpu;
  
  	if (unlikely(atomic_read(&pd->seq_nr) == pd->max_seq_nr))
  		atomic_set(&pd->seq_nr, -1);
  
  	padata->seq_nr = atomic_inc_return(&pd->seq_nr);
  
  	target_cpu = padata_cpu_hash(padata);
e15bacbeb   Dan Kruchinin   padata: Make two ...
133
  	queue = per_cpu_ptr(pd->pqueue, target_cpu);
16295bec6   Steffen Klassert   padata: Generic p...
134
135
136
137
  
  	spin_lock(&queue->parallel.lock);
  	list_add_tail(&padata->list, &queue->parallel.list);
  	spin_unlock(&queue->parallel.lock);
e15bacbeb   Dan Kruchinin   padata: Make two ...
138
  	queue_work_on(target_cpu, pinst->wq, &queue->work);
16295bec6   Steffen Klassert   padata: Generic p...
139
140
141
142
143
144
145
  
  out:
  	rcu_read_unlock_bh();
  
  	return err;
  }
  EXPORT_SYMBOL(padata_do_parallel);
0198ffd13   Steffen Klassert   padata: Add some ...
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
  /*
   * 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...
163
164
  static struct padata_priv *padata_get_next(struct parallel_data *pd)
  {
5f1a8c1bc   Steffen Klassert   padata: simplify ...
165
166
  	int cpu, num_cpus;
  	int next_nr, next_index;
e15bacbeb   Dan Kruchinin   padata: Make two ...
167
  	struct padata_parallel_queue *queue, *next_queue;
16295bec6   Steffen Klassert   padata: Generic p...
168
169
  	struct padata_priv *padata;
  	struct padata_list *reorder;
e15bacbeb   Dan Kruchinin   padata: Make two ...
170
  	num_cpus = cpumask_weight(pd->cpumask.pcpu);
16295bec6   Steffen Klassert   padata: Generic p...
171

5f1a8c1bc   Steffen Klassert   padata: simplify ...
172
173
174
175
176
177
178
  	/*
  	 * 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 ...
179
  	next_queue = per_cpu_ptr(pd->pqueue, cpu);
5f1a8c1bc   Steffen Klassert   padata: simplify ...
180
181
182
183
184
  
  	if (unlikely(next_nr > pd->max_seq_nr)) {
  		next_nr = next_nr - pd->max_seq_nr - 1;
  		next_index = next_nr % num_cpus;
  		cpu = padata_index_to_cpu(pd, next_index);
e15bacbeb   Dan Kruchinin   padata: Make two ...
185
  		next_queue = per_cpu_ptr(pd->pqueue, cpu);
5f1a8c1bc   Steffen Klassert   padata: simplify ...
186
  		pd->processed = 0;
16295bec6   Steffen Klassert   padata: Generic p...
187
188
189
  	}
  
  	padata = NULL;
16295bec6   Steffen Klassert   padata: Generic p...
190
191
192
193
194
  	reorder = &next_queue->reorder;
  
  	if (!list_empty(&reorder->list)) {
  		padata = list_entry(reorder->list.next,
  				    struct padata_priv, list);
5f1a8c1bc   Steffen Klassert   padata: simplify ...
195
  		BUG_ON(next_nr != padata->seq_nr);
16295bec6   Steffen Klassert   padata: Generic p...
196
197
198
199
200
  
  		spin_lock(&reorder->lock);
  		list_del_init(&padata->list);
  		atomic_dec(&pd->reorder_objects);
  		spin_unlock(&reorder->lock);
5f1a8c1bc   Steffen Klassert   padata: simplify ...
201
  		pd->processed++;
16295bec6   Steffen Klassert   padata: Generic p...
202
203
204
  
  		goto out;
  	}
e15bacbeb   Dan Kruchinin   padata: Make two ...
205
  	queue = per_cpu_ptr(pd->pqueue, smp_processor_id());
d46a5ac7a   Steffen Klassert   padata: Use a tim...
206
  	if (queue->cpu_index == next_queue->cpu_index) {
16295bec6   Steffen Klassert   padata: Generic p...
207
208
209
210
211
212
213
214
215
216
217
218
  		padata = ERR_PTR(-ENODATA);
  		goto out;
  	}
  
  	padata = ERR_PTR(-EINPROGRESS);
  out:
  	return padata;
  }
  
  static void padata_reorder(struct parallel_data *pd)
  {
  	struct padata_priv *padata;
e15bacbeb   Dan Kruchinin   padata: Make two ...
219
  	struct padata_serial_queue *squeue;
16295bec6   Steffen Klassert   padata: Generic p...
220
  	struct padata_instance *pinst = pd->pinst;
0198ffd13   Steffen Klassert   padata: Add some ...
221
222
223
224
225
226
227
228
229
230
  	/*
  	 * 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...
231
  	if (!spin_trylock_bh(&pd->lock))
d46a5ac7a   Steffen Klassert   padata: Use a tim...
232
  		return;
16295bec6   Steffen Klassert   padata: Generic p...
233
234
235
  
  	while (1) {
  		padata = padata_get_next(pd);
0198ffd13   Steffen Klassert   padata: Add some ...
236
237
238
239
240
241
  		/*
  		 * 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...
242
243
  		if (!padata || PTR_ERR(padata) == -EINPROGRESS)
  			break;
0198ffd13   Steffen Klassert   padata: Add some ...
244
245
246
  		/*
  		 * 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...
247
  		 * so exit immediately.
0198ffd13   Steffen Klassert   padata: Add some ...
248
  		 */
16295bec6   Steffen Klassert   padata: Generic p...
249
  		if (PTR_ERR(padata) == -ENODATA) {
d46a5ac7a   Steffen Klassert   padata: Use a tim...
250
  			del_timer(&pd->timer);
16295bec6   Steffen Klassert   padata: Generic p...
251
  			spin_unlock_bh(&pd->lock);
d46a5ac7a   Steffen Klassert   padata: Use a tim...
252
  			return;
16295bec6   Steffen Klassert   padata: Generic p...
253
  		}
e15bacbeb   Dan Kruchinin   padata: Make two ...
254
  		squeue = per_cpu_ptr(pd->squeue, padata->cb_cpu);
16295bec6   Steffen Klassert   padata: Generic p...
255

e15bacbeb   Dan Kruchinin   padata: Make two ...
256
257
258
  		spin_lock(&squeue->serial.lock);
  		list_add_tail(&padata->list, &squeue->serial.list);
  		spin_unlock(&squeue->serial.lock);
16295bec6   Steffen Klassert   padata: Generic p...
259

e15bacbeb   Dan Kruchinin   padata: Make two ...
260
  		queue_work_on(padata->cb_cpu, pinst->wq, &squeue->work);
16295bec6   Steffen Klassert   padata: Generic p...
261
262
263
  	}
  
  	spin_unlock_bh(&pd->lock);
0198ffd13   Steffen Klassert   padata: Add some ...
264
265
266
  	/*
  	 * 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...
267
  	 * from the timer function if no one else cares for it.
0198ffd13   Steffen Klassert   padata: Add some ...
268
  	 */
d46a5ac7a   Steffen Klassert   padata: Use a tim...
269
270
271
272
273
  	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...
274

16295bec6   Steffen Klassert   padata: Generic p...
275
276
  	return;
  }
d46a5ac7a   Steffen Klassert   padata: Use a tim...
277
278
279
280
281
282
  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 ...
283
  static void padata_serial_worker(struct work_struct *serial_work)
16295bec6   Steffen Klassert   padata: Generic p...
284
  {
e15bacbeb   Dan Kruchinin   padata: Make two ...
285
  	struct padata_serial_queue *squeue;
16295bec6   Steffen Klassert   padata: Generic p...
286
287
288
289
  	struct parallel_data *pd;
  	LIST_HEAD(local_list);
  
  	local_bh_disable();
e15bacbeb   Dan Kruchinin   padata: Make two ...
290
291
  	squeue = container_of(serial_work, struct padata_serial_queue, work);
  	pd = squeue->pd;
16295bec6   Steffen Klassert   padata: Generic p...
292

e15bacbeb   Dan Kruchinin   padata: Make two ...
293
294
295
  	spin_lock(&squeue->serial.lock);
  	list_replace_init(&squeue->serial.list, &local_list);
  	spin_unlock(&squeue->serial.lock);
16295bec6   Steffen Klassert   padata: Generic p...
296
297
298
299
300
301
302
303
304
305
306
307
308
309
  
  	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 ...
310
  /**
16295bec6   Steffen Klassert   padata: Generic p...
311
312
313
314
315
316
317
318
319
320
   * 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 ...
321
  	struct padata_parallel_queue *pqueue;
16295bec6   Steffen Klassert   padata: Generic p...
322
323
324
325
326
  	struct parallel_data *pd;
  
  	pd = padata->pd;
  
  	cpu = get_cpu();
e15bacbeb   Dan Kruchinin   padata: Make two ...
327
  	pqueue = per_cpu_ptr(pd->pqueue, cpu);
16295bec6   Steffen Klassert   padata: Generic p...
328

e15bacbeb   Dan Kruchinin   padata: Make two ...
329
  	spin_lock(&pqueue->reorder.lock);
16295bec6   Steffen Klassert   padata: Generic p...
330
  	atomic_inc(&pd->reorder_objects);
e15bacbeb   Dan Kruchinin   padata: Make two ...
331
332
  	list_add_tail(&padata->list, &pqueue->reorder.list);
  	spin_unlock(&pqueue->reorder.lock);
16295bec6   Steffen Klassert   padata: Generic p...
333
334
335
336
337
338
  
  	put_cpu();
  
  	padata_reorder(pd);
  }
  EXPORT_SYMBOL(padata_do_serial);
e15bacbeb   Dan Kruchinin   padata: Make two ...
339
340
341
  static int padata_setup_cpumasks(struct parallel_data *pd,
  				 const struct cpumask *pcpumask,
  				 const struct cpumask *cbcpumask)
16295bec6   Steffen Klassert   padata: Generic p...
342
  {
e15bacbeb   Dan Kruchinin   padata: Make two ...
343
344
  	if (!alloc_cpumask_var(&pd->cpumask.pcpu, GFP_KERNEL))
  		return -ENOMEM;
16295bec6   Steffen Klassert   padata: Generic p...
345

e15bacbeb   Dan Kruchinin   padata: Make two ...
346
347
348
349
350
  	cpumask_and(pd->cpumask.pcpu, pcpumask, cpu_active_mask);
  	if (!alloc_cpumask_var(&pd->cpumask.cbcpu, GFP_KERNEL)) {
  		free_cpumask_var(pd->cpumask.cbcpu);
  		return -ENOMEM;
  	}
16295bec6   Steffen Klassert   padata: Generic p...
351

e15bacbeb   Dan Kruchinin   padata: Make two ...
352
353
354
  	cpumask_and(pd->cpumask.cbcpu, cbcpumask, cpu_active_mask);
  	return 0;
  }
16295bec6   Steffen Klassert   padata: Generic p...
355

e15bacbeb   Dan Kruchinin   padata: Make two ...
356
357
358
359
360
  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...
361

e15bacbeb   Dan Kruchinin   padata: Make two ...
362
363
364
365
366
  /* 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...
367

e15bacbeb   Dan Kruchinin   padata: Make two ...
368
369
370
371
372
373
374
  	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...
375

e15bacbeb   Dan Kruchinin   padata: Make two ...
376
377
378
379
380
  /* Initialize all percpu queues used by parallel workers */
  static void padata_init_pqueues(struct parallel_data *pd)
  {
  	int cpu_index, num_cpus, cpu;
  	struct padata_parallel_queue *pqueue;
16295bec6   Steffen Klassert   padata: Generic p...
381

e15bacbeb   Dan Kruchinin   padata: Make two ...
382
383
384
385
386
  	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...
387
  		cpu_index++;
16295bec6   Steffen Klassert   padata: Generic p...
388

e15bacbeb   Dan Kruchinin   padata: Make two ...
389
390
391
392
  		__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...
393
  	}
e15bacbeb   Dan Kruchinin   padata: Make two ...
394
  	num_cpus = cpumask_weight(pd->cpumask.pcpu);
b89661dff   Steffen Klassert   padata: Allocate ...
395
  	pd->max_seq_nr = num_cpus ? (MAX_SEQ_NR / num_cpus) * num_cpus - 1 : 0;
e15bacbeb   Dan Kruchinin   padata: Make two ...
396
  }
16295bec6   Steffen Klassert   padata: Generic p...
397

e15bacbeb   Dan Kruchinin   padata: Make two ...
398
399
400
401
402
403
  /* 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...
404

e15bacbeb   Dan Kruchinin   padata: Make two ...
405
406
407
  	pd = kzalloc(sizeof(struct parallel_data), GFP_KERNEL);
  	if (!pd)
  		goto err;
16295bec6   Steffen Klassert   padata: Generic p...
408

e15bacbeb   Dan Kruchinin   padata: Make two ...
409
410
411
412
413
414
415
416
417
  	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...
418

e15bacbeb   Dan Kruchinin   padata: Make two ...
419
420
  	padata_init_pqueues(pd);
  	padata_init_squeues(pd);
d46a5ac7a   Steffen Klassert   padata: Use a tim...
421
  	setup_timer(&pd->timer, padata_reorder_timer, (unsigned long)pd);
16295bec6   Steffen Klassert   padata: Generic p...
422
423
424
425
426
427
428
  	atomic_set(&pd->seq_nr, -1);
  	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 ...
429
430
431
432
  err_free_squeue:
  	free_percpu(pd->squeue);
  err_free_pqueue:
  	free_percpu(pd->pqueue);
16295bec6   Steffen Klassert   padata: Generic p...
433
434
435
436
437
438
439
440
  err_free_pd:
  	kfree(pd);
  err:
  	return NULL;
  }
  
  static void padata_free_pd(struct parallel_data *pd)
  {
e15bacbeb   Dan Kruchinin   padata: Make two ...
441
442
443
444
  	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...
445
446
  	kfree(pd);
  }
0198ffd13   Steffen Klassert   padata: Add some ...
447
  /* Flush all objects out of the padata queues. */
2b73b07ab   Steffen Klassert   padata: Flush the...
448
449
450
  static void padata_flush_queues(struct parallel_data *pd)
  {
  	int cpu;
e15bacbeb   Dan Kruchinin   padata: Make two ...
451
452
  	struct padata_parallel_queue *pqueue;
  	struct padata_serial_queue *squeue;
2b73b07ab   Steffen Klassert   padata: Flush the...
453

e15bacbeb   Dan Kruchinin   padata: Make two ...
454
455
456
  	for_each_cpu(cpu, pd->cpumask.pcpu) {
  		pqueue = per_cpu_ptr(pd->pqueue, cpu);
  		flush_work(&pqueue->work);
2b73b07ab   Steffen Klassert   padata: Flush the...
457
458
459
460
461
462
  	}
  
  	del_timer_sync(&pd->timer);
  
  	if (atomic_read(&pd->reorder_objects))
  		padata_reorder(pd);
e15bacbeb   Dan Kruchinin   padata: Make two ...
463
464
465
  	for_each_cpu(cpu, pd->cpumask.cbcpu) {
  		squeue = per_cpu_ptr(pd->squeue, cpu);
  		flush_work(&squeue->work);
2b73b07ab   Steffen Klassert   padata: Flush the...
466
467
468
469
  	}
  
  	BUG_ON(atomic_read(&pd->refcnt) != 0);
  }
4c8791702   Steffen Klassert   padata: Check for...
470
471
472
473
  static void __padata_start(struct padata_instance *pinst)
  {
  	pinst->flags |= PADATA_INIT;
  }
ee8365551   Steffen Klassert   padata: Block unt...
474
475
476
477
478
479
480
481
482
483
484
485
486
  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...
487
  /* Replace the internal control structure with a new one. */
16295bec6   Steffen Klassert   padata: Generic p...
488
489
490
491
  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 ...
492
  	int notification_mask = 0;
16295bec6   Steffen Klassert   padata: Generic p...
493
494
495
496
497
498
  
  	pinst->flags |= PADATA_RESET;
  
  	rcu_assign_pointer(pinst->pd, pd_new);
  
  	synchronize_rcu();
e15bacbeb   Dan Kruchinin   padata: Make two ...
499
500
501
502
  	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...
503
  	padata_flush_queues(pd_old);
16295bec6   Steffen Klassert   padata: Generic p...
504
  	padata_free_pd(pd_old);
e15bacbeb   Dan Kruchinin   padata: Make two ...
505
506
  	if (notification_mask)
  		blocking_notifier_call_chain(&pinst->cpumask_change_notifier,
c635696c7   Steffen Klassert   padata: Pass the ...
507
508
  					     notification_mask,
  					     &pd_new->cpumask);
16295bec6   Steffen Klassert   padata: Generic p...
509
510
511
  
  	pinst->flags &= ~PADATA_RESET;
  }
0198ffd13   Steffen Klassert   padata: Add some ...
512
  /**
e15bacbeb   Dan Kruchinin   padata: Make two ...
513
514
   * 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...
515
   *
e15bacbeb   Dan Kruchinin   padata: Make two ...
516
517
   * @pinst: A poineter to padata instance
   * @nblock: A pointer to notifier block.
16295bec6   Steffen Klassert   padata: Generic p...
518
   */
e15bacbeb   Dan Kruchinin   padata: Make two ...
519
520
  int padata_register_cpumask_notifier(struct padata_instance *pinst,
  				     struct notifier_block *nblock)
16295bec6   Steffen Klassert   padata: Generic p...
521
  {
e15bacbeb   Dan Kruchinin   padata: Make two ...
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
  	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...
542
543
544
545
546
547
548
549
550
551
552
553
  /* 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)
  {
  	if (!cpumask_intersects(cpumask, cpu_active_mask)) {
  		pinst->flags |= PADATA_INVALID;
  		return false;
  	}
  
  	pinst->flags &= ~PADATA_INVALID;
  	return true;
  }
65ff577e6   Steffen Klassert   padata: Rearrange...
554
555
556
557
558
  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...
559
  	struct parallel_data *pd;
65ff577e6   Steffen Klassert   padata: Rearrange...
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
  
  	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;
  }
  
  /**
   * padata_set_cpumasks - Set both parallel and serial cpumasks. The first
   *                       one is used by parallel workers and the second one
   *                       by the wokers doing serialization.
   *
   * @pinst: padata instance
   * @pcpumask: the cpumask to use for parallel workers
   * @cbcpumask: the cpumsak to use for serial workers
   */
  int padata_set_cpumasks(struct padata_instance *pinst, cpumask_var_t pcpumask,
  			cpumask_var_t cbcpumask)
  {
  	int err;
16295bec6   Steffen Klassert   padata: Generic p...
600

16295bec6   Steffen Klassert   padata: Generic p...
601
  	mutex_lock(&pinst->lock);
65ff577e6   Steffen Klassert   padata: Rearrange...
602
  	get_online_cpus();
16295bec6   Steffen Klassert   padata: Generic p...
603

65ff577e6   Steffen Klassert   padata: Rearrange...
604
605
606
607
608
609
610
611
612
  	err = __padata_set_cpumasks(pinst, pcpumask, cbcpumask);
  
  	put_online_cpus();
  	mutex_unlock(&pinst->lock);
  
  	return err;
  
  }
  EXPORT_SYMBOL(padata_set_cpumasks);
e15bacbeb   Dan Kruchinin   padata: Make two ...
613
614
615
  /**
   * padata_set_cpumask: Sets specified by @cpumask_type cpumask to the value
   *                     equivalent to @cpumask.
16295bec6   Steffen Klassert   padata: Generic p...
616
617
   *
   * @pinst: padata instance
e15bacbeb   Dan Kruchinin   padata: Make two ...
618
619
   * @cpumask_type: PADATA_CPU_SERIAL or PADATA_CPU_PARALLEL corresponding
   *                to parallel and serial cpumasks respectively.
16295bec6   Steffen Klassert   padata: Generic p...
620
621
   * @cpumask: the cpumask to use
   */
e15bacbeb   Dan Kruchinin   padata: Make two ...
622
623
624
625
  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...
626
627
628
  	int err = -EINVAL;
  
  	mutex_lock(&pinst->lock);
6751fb3c0   Steffen Klassert   padata: Use get_o...
629
  	get_online_cpus();
e15bacbeb   Dan Kruchinin   padata: Make two ...
630
631
632
633
634
635
636
637
638
639
  	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...
640
  		 goto out;
16295bec6   Steffen Klassert   padata: Generic p...
641
  	}
65ff577e6   Steffen Klassert   padata: Rearrange...
642
  	err =  __padata_set_cpumasks(pinst, parallel_mask, serial_mask);
16295bec6   Steffen Klassert   padata: Generic p...
643
644
  
  out:
6751fb3c0   Steffen Klassert   padata: Use get_o...
645
  	put_online_cpus();
16295bec6   Steffen Klassert   padata: Generic p...
646
647
648
649
650
651
652
653
654
655
656
  	mutex_unlock(&pinst->lock);
  
  	return err;
  }
  EXPORT_SYMBOL(padata_set_cpumask);
  
  static int __padata_add_cpu(struct padata_instance *pinst, int cpu)
  {
  	struct parallel_data *pd;
  
  	if (cpumask_test_cpu(cpu, cpu_active_mask)) {
e15bacbeb   Dan Kruchinin   padata: Make two ...
657
658
  		pd = padata_alloc_pd(pinst, pinst->cpumask.pcpu,
  				     pinst->cpumask.cbcpu);
16295bec6   Steffen Klassert   padata: Generic p...
659
660
661
662
  		if (!pd)
  			return -ENOMEM;
  
  		padata_replace(pinst, pd);
33e544506   Steffen Klassert   padata: Handle em...
663

e15bacbeb   Dan Kruchinin   padata: Make two ...
664
665
  		if (padata_validate_cpumask(pinst, pinst->cpumask.pcpu) &&
  		    padata_validate_cpumask(pinst, pinst->cpumask.cbcpu))
33e544506   Steffen Klassert   padata: Handle em...
666
  			__padata_start(pinst);
16295bec6   Steffen Klassert   padata: Generic p...
667
668
669
670
  	}
  
  	return 0;
  }
e15bacbeb   Dan Kruchinin   padata: Make two ...
671
672
673
   /**
   * padata_add_cpu - add a cpu to one or both(parallel and serial)
   *                  padata cpumasks.
16295bec6   Steffen Klassert   padata: Generic p...
674
675
676
   *
   * @pinst: padata instance
   * @cpu: cpu to add
e15bacbeb   Dan Kruchinin   padata: Make two ...
677
678
679
680
   * @mask: bitmask of flags specifying to which cpumask @cpu shuld be added.
   *        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...
681
   */
e15bacbeb   Dan Kruchinin   padata: Make two ...
682
683
  
  int padata_add_cpu(struct padata_instance *pinst, int cpu, int mask)
16295bec6   Steffen Klassert   padata: Generic p...
684
685
  {
  	int err;
e15bacbeb   Dan Kruchinin   padata: Make two ...
686
687
  	if (!(mask & (PADATA_CPU_SERIAL | PADATA_CPU_PARALLEL)))
  		return -EINVAL;
16295bec6   Steffen Klassert   padata: Generic p...
688
  	mutex_lock(&pinst->lock);
6751fb3c0   Steffen Klassert   padata: Use get_o...
689
  	get_online_cpus();
e15bacbeb   Dan Kruchinin   padata: Make two ...
690
691
692
693
  	if (mask & PADATA_CPU_SERIAL)
  		cpumask_set_cpu(cpu, pinst->cpumask.cbcpu);
  	if (mask & PADATA_CPU_PARALLEL)
  		cpumask_set_cpu(cpu, pinst->cpumask.pcpu);
16295bec6   Steffen Klassert   padata: Generic p...
694
  	err = __padata_add_cpu(pinst, cpu);
6751fb3c0   Steffen Klassert   padata: Use get_o...
695
  	put_online_cpus();
16295bec6   Steffen Klassert   padata: Generic p...
696
697
698
699
700
701
702
703
704
  
  	mutex_unlock(&pinst->lock);
  
  	return err;
  }
  EXPORT_SYMBOL(padata_add_cpu);
  
  static int __padata_remove_cpu(struct padata_instance *pinst, int cpu)
  {
33e544506   Steffen Klassert   padata: Handle em...
705
  	struct parallel_data *pd = NULL;
16295bec6   Steffen Klassert   padata: Generic p...
706
707
  
  	if (cpumask_test_cpu(cpu, cpu_online_mask)) {
33e544506   Steffen Klassert   padata: Handle em...
708

e15bacbeb   Dan Kruchinin   padata: Make two ...
709
  		if (!padata_validate_cpumask(pinst, pinst->cpumask.pcpu) ||
b89661dff   Steffen Klassert   padata: Allocate ...
710
  		    !padata_validate_cpumask(pinst, pinst->cpumask.cbcpu))
33e544506   Steffen Klassert   padata: Handle em...
711
  			__padata_stop(pinst);
33e544506   Steffen Klassert   padata: Handle em...
712

e15bacbeb   Dan Kruchinin   padata: Make two ...
713
714
  		pd = padata_alloc_pd(pinst, pinst->cpumask.pcpu,
  				     pinst->cpumask.cbcpu);
16295bec6   Steffen Klassert   padata: Generic p...
715
716
717
718
719
720
721
722
  		if (!pd)
  			return -ENOMEM;
  
  		padata_replace(pinst, pd);
  	}
  
  	return 0;
  }
e15bacbeb   Dan Kruchinin   padata: Make two ...
723
   /**
25985edce   Lucas De Marchi   Fix common misspe...
724
   * padata_remove_cpu - remove a cpu from the one or both(serial and parallel)
e15bacbeb   Dan Kruchinin   padata: Make two ...
725
   *                     padata cpumasks.
16295bec6   Steffen Klassert   padata: Generic p...
726
727
728
   *
   * @pinst: padata instance
   * @cpu: cpu to remove
e15bacbeb   Dan Kruchinin   padata: Make two ...
729
730
731
732
   * @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...
733
   */
e15bacbeb   Dan Kruchinin   padata: Make two ...
734
  int padata_remove_cpu(struct padata_instance *pinst, int cpu, int mask)
16295bec6   Steffen Klassert   padata: Generic p...
735
736
  {
  	int err;
e15bacbeb   Dan Kruchinin   padata: Make two ...
737
738
  	if (!(mask & (PADATA_CPU_SERIAL | PADATA_CPU_PARALLEL)))
  		return -EINVAL;
16295bec6   Steffen Klassert   padata: Generic p...
739
  	mutex_lock(&pinst->lock);
6751fb3c0   Steffen Klassert   padata: Use get_o...
740
  	get_online_cpus();
e15bacbeb   Dan Kruchinin   padata: Make two ...
741
742
743
744
  	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...
745
  	err = __padata_remove_cpu(pinst, cpu);
6751fb3c0   Steffen Klassert   padata: Use get_o...
746
  	put_online_cpus();
16295bec6   Steffen Klassert   padata: Generic p...
747
748
749
750
751
752
  
  	mutex_unlock(&pinst->lock);
  
  	return err;
  }
  EXPORT_SYMBOL(padata_remove_cpu);
0198ffd13   Steffen Klassert   padata: Add some ...
753
  /**
16295bec6   Steffen Klassert   padata: Generic p...
754
755
756
757
   * padata_start - start the parallel processing
   *
   * @pinst: padata instance to start
   */
4c8791702   Steffen Klassert   padata: Check for...
758
  int padata_start(struct padata_instance *pinst)
16295bec6   Steffen Klassert   padata: Generic p...
759
  {
4c8791702   Steffen Klassert   padata: Check for...
760
  	int err = 0;
16295bec6   Steffen Klassert   padata: Generic p...
761
  	mutex_lock(&pinst->lock);
4c8791702   Steffen Klassert   padata: Check for...
762
763
764
765
766
  
  	if (pinst->flags & PADATA_INVALID)
  		err =-EINVAL;
  
  	 __padata_start(pinst);
16295bec6   Steffen Klassert   padata: Generic p...
767
  	mutex_unlock(&pinst->lock);
4c8791702   Steffen Klassert   padata: Check for...
768
769
  
  	return err;
16295bec6   Steffen Klassert   padata: Generic p...
770
771
  }
  EXPORT_SYMBOL(padata_start);
0198ffd13   Steffen Klassert   padata: Add some ...
772
  /**
16295bec6   Steffen Klassert   padata: Generic p...
773
774
775
776
777
778
   * padata_stop - stop the parallel processing
   *
   * @pinst: padata instance to stop
   */
  void padata_stop(struct padata_instance *pinst)
  {
16295bec6   Steffen Klassert   padata: Generic p...
779
  	mutex_lock(&pinst->lock);
ee8365551   Steffen Klassert   padata: Block unt...
780
  	__padata_stop(pinst);
16295bec6   Steffen Klassert   padata: Generic p...
781
782
783
  	mutex_unlock(&pinst->lock);
  }
  EXPORT_SYMBOL(padata_stop);
e2cb2f1c2   Steffen Klassert   padata: cpu hotpl...
784
  #ifdef CONFIG_HOTPLUG_CPU
e15bacbeb   Dan Kruchinin   padata: Make two ...
785
786
787
788
789
790
  
  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);
  }
975d26035   Henrik Kretzschmar   padata: Section c...
791
792
  static int padata_cpu_callback(struct notifier_block *nfb,
  			       unsigned long action, void *hcpu)
16295bec6   Steffen Klassert   padata: Generic p...
793
794
795
796
797
798
799
800
801
802
  {
  	int err;
  	struct padata_instance *pinst;
  	int cpu = (unsigned long)hcpu;
  
  	pinst = container_of(nfb, struct padata_instance, cpu_notifier);
  
  	switch (action) {
  	case CPU_ONLINE:
  	case CPU_ONLINE_FROZEN:
e15bacbeb   Dan Kruchinin   padata: Make two ...
803
  		if (!pinst_has_cpu(pinst, cpu))
16295bec6   Steffen Klassert   padata: Generic p...
804
805
806
807
808
  			break;
  		mutex_lock(&pinst->lock);
  		err = __padata_add_cpu(pinst, cpu);
  		mutex_unlock(&pinst->lock);
  		if (err)
80b5184cc   Akinobu Mita   kernel/: convert ...
809
  			return notifier_from_errno(err);
16295bec6   Steffen Klassert   padata: Generic p...
810
811
812
813
  		break;
  
  	case CPU_DOWN_PREPARE:
  	case CPU_DOWN_PREPARE_FROZEN:
e15bacbeb   Dan Kruchinin   padata: Make two ...
814
  		if (!pinst_has_cpu(pinst, cpu))
16295bec6   Steffen Klassert   padata: Generic p...
815
816
817
818
819
  			break;
  		mutex_lock(&pinst->lock);
  		err = __padata_remove_cpu(pinst, cpu);
  		mutex_unlock(&pinst->lock);
  		if (err)
80b5184cc   Akinobu Mita   kernel/: convert ...
820
  			return notifier_from_errno(err);
16295bec6   Steffen Klassert   padata: Generic p...
821
822
823
824
  		break;
  
  	case CPU_UP_CANCELED:
  	case CPU_UP_CANCELED_FROZEN:
e15bacbeb   Dan Kruchinin   padata: Make two ...
825
  		if (!pinst_has_cpu(pinst, cpu))
16295bec6   Steffen Klassert   padata: Generic p...
826
827
828
829
830
831
832
  			break;
  		mutex_lock(&pinst->lock);
  		__padata_remove_cpu(pinst, cpu);
  		mutex_unlock(&pinst->lock);
  
  	case CPU_DOWN_FAILED:
  	case CPU_DOWN_FAILED_FROZEN:
e15bacbeb   Dan Kruchinin   padata: Make two ...
833
  		if (!pinst_has_cpu(pinst, cpu))
16295bec6   Steffen Klassert   padata: Generic p...
834
835
836
837
838
839
840
841
  			break;
  		mutex_lock(&pinst->lock);
  		__padata_add_cpu(pinst, cpu);
  		mutex_unlock(&pinst->lock);
  	}
  
  	return NOTIFY_OK;
  }
e2cb2f1c2   Steffen Klassert   padata: cpu hotpl...
842
  #endif
16295bec6   Steffen Klassert   padata: Generic p...
843

5e017dc3f   Dan Kruchinin   padata: Added sys...
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
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
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
  static void __padata_free(struct padata_instance *pinst)
  {
  #ifdef CONFIG_HOTPLUG_CPU
  	unregister_hotcpu_notifier(&pinst->cpu_notifier);
  #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;
  
  	len = bitmap_scnprintf(buf, PAGE_SIZE, cpumask_bits(cpumask),
  			       nr_cpu_ids);
  	if (PAGE_SIZE - len < 2)
  		len = -EINVAL;
  	else
  		len += sprintf(buf + len, "
  ");
  
  	mutex_unlock(&pinst->lock);
  	return len;
  }
  
  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 ...
987
  /**
e6cc11707   Steffen Klassert   padata: Rename pa...
988
989
990
   * padata_alloc_possible - Allocate and initialize padata instance.
   *                         Use the cpu_possible_mask for serial and
   *                         parallel workers.
16295bec6   Steffen Klassert   padata: Generic p...
991
   *
16295bec6   Steffen Klassert   padata: Generic p...
992
993
   * @wq: workqueue to use for the allocated padata instance
   */
e6cc11707   Steffen Klassert   padata: Rename pa...
994
  struct padata_instance *padata_alloc_possible(struct workqueue_struct *wq)
e15bacbeb   Dan Kruchinin   padata: Make two ...
995
  {
e6cc11707   Steffen Klassert   padata: Rename pa...
996
  	return padata_alloc(wq, cpu_possible_mask, cpu_possible_mask);
e15bacbeb   Dan Kruchinin   padata: Make two ...
997
  }
e6cc11707   Steffen Klassert   padata: Rename pa...
998
  EXPORT_SYMBOL(padata_alloc_possible);
e15bacbeb   Dan Kruchinin   padata: Make two ...
999
1000
  
  /**
e6cc11707   Steffen Klassert   padata: Rename pa...
1001
1002
   * padata_alloc - allocate and initialize a padata instance and specify
   *                cpumasks for serial and parallel workers.
16295bec6   Steffen Klassert   padata: Generic p...
1003
   *
16295bec6   Steffen Klassert   padata: Generic p...
1004
   * @wq: workqueue to use for the allocated padata instance
e15bacbeb   Dan Kruchinin   padata: Make two ...
1005
1006
   * @pcpumask: cpumask that will be used for padata parallelization
   * @cbcpumask: cpumask that will be used for padata serialization
16295bec6   Steffen Klassert   padata: Generic p...
1007
   */
e6cc11707   Steffen Klassert   padata: Rename pa...
1008
1009
1010
  struct padata_instance *padata_alloc(struct workqueue_struct *wq,
  				     const struct cpumask *pcpumask,
  				     const struct cpumask *cbcpumask)
16295bec6   Steffen Klassert   padata: Generic p...
1011
  {
16295bec6   Steffen Klassert   padata: Generic p...
1012
  	struct padata_instance *pinst;
33e544506   Steffen Klassert   padata: Handle em...
1013
  	struct parallel_data *pd = NULL;
16295bec6   Steffen Klassert   padata: Generic p...
1014
1015
1016
1017
  
  	pinst = kzalloc(sizeof(struct padata_instance), GFP_KERNEL);
  	if (!pinst)
  		goto err;
6751fb3c0   Steffen Klassert   padata: Use get_o...
1018
  	get_online_cpus();
e15bacbeb   Dan Kruchinin   padata: Make two ...
1019
  	if (!alloc_cpumask_var(&pinst->cpumask.pcpu, GFP_KERNEL))
16295bec6   Steffen Klassert   padata: Generic p...
1020
  		goto err_free_inst;
e15bacbeb   Dan Kruchinin   padata: Make two ...
1021
1022
  	if (!alloc_cpumask_var(&pinst->cpumask.cbcpu, GFP_KERNEL)) {
  		free_cpumask_var(pinst->cpumask.pcpu);
16295bec6   Steffen Klassert   padata: Generic p...
1023
  		goto err_free_inst;
33e544506   Steffen Klassert   padata: Handle em...
1024
  	}
e15bacbeb   Dan Kruchinin   padata: Make two ...
1025
1026
1027
  	if (!padata_validate_cpumask(pinst, pcpumask) ||
  	    !padata_validate_cpumask(pinst, cbcpumask))
  		goto err_free_masks;
16295bec6   Steffen Klassert   padata: Generic p...
1028

e15bacbeb   Dan Kruchinin   padata: Make two ...
1029
1030
1031
  	pd = padata_alloc_pd(pinst, pcpumask, cbcpumask);
  	if (!pd)
  		goto err_free_masks;
747813878   Steffen Klassert   padata: Allocate ...
1032

16295bec6   Steffen Klassert   padata: Generic p...
1033
1034
1035
  	rcu_assign_pointer(pinst->pd, pd);
  
  	pinst->wq = wq;
e15bacbeb   Dan Kruchinin   padata: Make two ...
1036
1037
  	cpumask_copy(pinst->cpumask.pcpu, pcpumask);
  	cpumask_copy(pinst->cpumask.cbcpu, cbcpumask);
16295bec6   Steffen Klassert   padata: Generic p...
1038
1039
  
  	pinst->flags = 0;
e2cb2f1c2   Steffen Klassert   padata: cpu hotpl...
1040
  #ifdef CONFIG_HOTPLUG_CPU
16295bec6   Steffen Klassert   padata: Generic p...
1041
1042
  	pinst->cpu_notifier.notifier_call = padata_cpu_callback;
  	pinst->cpu_notifier.priority = 0;
e2cb2f1c2   Steffen Klassert   padata: cpu hotpl...
1043
1044
  	register_hotcpu_notifier(&pinst->cpu_notifier);
  #endif
16295bec6   Steffen Klassert   padata: Generic p...
1045

6751fb3c0   Steffen Klassert   padata: Use get_o...
1046
  	put_online_cpus();
e15bacbeb   Dan Kruchinin   padata: Make two ...
1047
  	BLOCKING_INIT_NOTIFIER_HEAD(&pinst->cpumask_change_notifier);
5e017dc3f   Dan Kruchinin   padata: Added sys...
1048
  	kobject_init(&pinst->kobj, &padata_attr_type);
16295bec6   Steffen Klassert   padata: Generic p...
1049
1050
1051
  	mutex_init(&pinst->lock);
  
  	return pinst;
e15bacbeb   Dan Kruchinin   padata: Make two ...
1052
1053
1054
  err_free_masks:
  	free_cpumask_var(pinst->cpumask.pcpu);
  	free_cpumask_var(pinst->cpumask.cbcpu);
16295bec6   Steffen Klassert   padata: Generic p...
1055
1056
  err_free_inst:
  	kfree(pinst);
6751fb3c0   Steffen Klassert   padata: Use get_o...
1057
  	put_online_cpus();
16295bec6   Steffen Klassert   padata: Generic p...
1058
1059
1060
1061
  err:
  	return NULL;
  }
  EXPORT_SYMBOL(padata_alloc);
0198ffd13   Steffen Klassert   padata: Add some ...
1062
  /**
16295bec6   Steffen Klassert   padata: Generic p...
1063
1064
   * padata_free - free a padata instance
   *
0198ffd13   Steffen Klassert   padata: Add some ...
1065
   * @padata_inst: padata instance to free
16295bec6   Steffen Klassert   padata: Generic p...
1066
1067
1068
   */
  void padata_free(struct padata_instance *pinst)
  {
5e017dc3f   Dan Kruchinin   padata: Added sys...
1069
  	kobject_put(&pinst->kobj);
16295bec6   Steffen Klassert   padata: Generic p...
1070
1071
  }
  EXPORT_SYMBOL(padata_free);