Blame view

kernel/padata.c 26.9 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>
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
  
  	return target_cpu;
  }
2dc9b5dbd   Steffen Klassert   padata: Fix race ...
43
  static int padata_cpu_hash(struct parallel_data *pd)
16295bec6   Steffen Klassert   padata: Generic p...
44
  {
0b6b098ef   Mathias Krause   padata: make the ...
45
  	unsigned int seq_nr;
16295bec6   Steffen Klassert   padata: Generic p...
46
  	int cpu_index;
16295bec6   Steffen Klassert   padata: Generic p...
47
48
49
50
51
  
  	/*
  	 * Hash the sequence numbers to the cpus by taking
  	 * seq_nr mod. number of cpus in use.
  	 */
2dc9b5dbd   Steffen Klassert   padata: Fix race ...
52

0b6b098ef   Mathias Krause   padata: make the ...
53
54
  	seq_nr = atomic_inc_return(&pd->seq_nr);
  	cpu_index = seq_nr % cpumask_weight(pd->cpumask.pcpu);
16295bec6   Steffen Klassert   padata: Generic p...
55
56
57
  
  	return padata_index_to_cpu(pd, cpu_index);
  }
e15bacbeb   Dan Kruchinin   padata: Make two ...
58
  static void padata_parallel_worker(struct work_struct *parallel_work)
16295bec6   Steffen Klassert   padata: Generic p...
59
  {
e15bacbeb   Dan Kruchinin   padata: Make two ...
60
  	struct padata_parallel_queue *pqueue;
16295bec6   Steffen Klassert   padata: Generic p...
61
62
63
64
65
  	struct parallel_data *pd;
  	struct padata_instance *pinst;
  	LIST_HEAD(local_list);
  
  	local_bh_disable();
e15bacbeb   Dan Kruchinin   padata: Make two ...
66
67
68
  	pqueue = container_of(parallel_work,
  			      struct padata_parallel_queue, work);
  	pd = pqueue->pd;
16295bec6   Steffen Klassert   padata: Generic p...
69
  	pinst = pd->pinst;
e15bacbeb   Dan Kruchinin   padata: Make two ...
70
71
72
  	spin_lock(&pqueue->parallel.lock);
  	list_replace_init(&pqueue->parallel.list, &local_list);
  	spin_unlock(&pqueue->parallel.lock);
16295bec6   Steffen Klassert   padata: Generic p...
73
74
75
76
77
78
79
80
81
82
83
84
85
86
  
  	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 ...
87
  /**
16295bec6   Steffen Klassert   padata: Generic p...
88
89
90
91
92
   * 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 ...
93
   *          must be in the serial cpumask of padata(i.e. cpumask.cbcpu).
16295bec6   Steffen Klassert   padata: Generic p...
94
95
96
97
98
99
100
101
102
   *
   * 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 ...
103
  	struct padata_parallel_queue *queue;
16295bec6   Steffen Klassert   padata: Generic p...
104
105
106
  	struct parallel_data *pd;
  
  	rcu_read_lock_bh();
c0e656b7a   Mathias Krause   padata: Fix wrong...
107
  	pd = rcu_dereference_bh(pinst->pd);
16295bec6   Steffen Klassert   padata: Generic p...
108

83f619f3c   Steffen Klassert   padata: make pada...
109
  	err = -EINVAL;
7424713b8   Steffen Klassert   padata: Check for...
110
  	if (!(pinst->flags & PADATA_INIT) || pinst->flags & PADATA_INVALID)
16295bec6   Steffen Klassert   padata: Generic p...
111
  		goto out;
e15bacbeb   Dan Kruchinin   padata: Make two ...
112
  	if (!cpumask_test_cpu(cb_cpu, pd->cpumask.cbcpu))
16295bec6   Steffen Klassert   padata: Generic p...
113
114
115
116
117
118
119
120
  		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...
121
  	err = 0;
16295bec6   Steffen Klassert   padata: Generic p...
122
123
124
  	atomic_inc(&pd->refcnt);
  	padata->pd = pd;
  	padata->cb_cpu = cb_cpu;
2dc9b5dbd   Steffen Klassert   padata: Fix race ...
125
  	target_cpu = padata_cpu_hash(pd);
e15bacbeb   Dan Kruchinin   padata: Make two ...
126
  	queue = per_cpu_ptr(pd->pqueue, target_cpu);
16295bec6   Steffen Klassert   padata: Generic p...
127
128
129
130
  
  	spin_lock(&queue->parallel.lock);
  	list_add_tail(&padata->list, &queue->parallel.list);
  	spin_unlock(&queue->parallel.lock);
e15bacbeb   Dan Kruchinin   padata: Make two ...
131
  	queue_work_on(target_cpu, pinst->wq, &queue->work);
16295bec6   Steffen Klassert   padata: Generic p...
132
133
134
135
136
137
138
  
  out:
  	rcu_read_unlock_bh();
  
  	return err;
  }
  EXPORT_SYMBOL(padata_do_parallel);
0198ffd13   Steffen Klassert   padata: Add some ...
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
  /*
   * 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...
156
157
  static struct padata_priv *padata_get_next(struct parallel_data *pd)
  {
5f1a8c1bc   Steffen Klassert   padata: simplify ...
158
  	int cpu, num_cpus;
2dc9b5dbd   Steffen Klassert   padata: Fix race ...
159
  	unsigned int next_nr, next_index;
f0fcf2002   Shan Wei   padata: use __thi...
160
  	struct padata_parallel_queue *next_queue;
16295bec6   Steffen Klassert   padata: Generic p...
161
162
  	struct padata_priv *padata;
  	struct padata_list *reorder;
e15bacbeb   Dan Kruchinin   padata: Make two ...
163
  	num_cpus = cpumask_weight(pd->cpumask.pcpu);
16295bec6   Steffen Klassert   padata: Generic p...
164

5f1a8c1bc   Steffen Klassert   padata: simplify ...
165
166
167
168
169
170
171
  	/*
  	 * 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 ...
172
  	next_queue = per_cpu_ptr(pd->pqueue, cpu);
5f1a8c1bc   Steffen Klassert   padata: simplify ...
173

16295bec6   Steffen Klassert   padata: Generic p...
174
  	padata = NULL;
16295bec6   Steffen Klassert   padata: Generic p...
175
176
177
178
179
  	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...
180
181
182
183
  		spin_lock(&reorder->lock);
  		list_del_init(&padata->list);
  		atomic_dec(&pd->reorder_objects);
  		spin_unlock(&reorder->lock);
5f1a8c1bc   Steffen Klassert   padata: simplify ...
184
  		pd->processed++;
16295bec6   Steffen Klassert   padata: Generic p...
185
186
187
  
  		goto out;
  	}
f0fcf2002   Shan Wei   padata: use __thi...
188
  	if (__this_cpu_read(pd->pqueue->cpu_index) == next_queue->cpu_index) {
16295bec6   Steffen Klassert   padata: Generic p...
189
190
191
192
193
194
195
196
197
198
199
  		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 ...
200
  	int cb_cpu;
16295bec6   Steffen Klassert   padata: Generic p...
201
  	struct padata_priv *padata;
e15bacbeb   Dan Kruchinin   padata: Make two ...
202
  	struct padata_serial_queue *squeue;
16295bec6   Steffen Klassert   padata: Generic p...
203
  	struct padata_instance *pinst = pd->pinst;
0198ffd13   Steffen Klassert   padata: Add some ...
204
205
206
207
208
209
210
211
212
213
  	/*
  	 * 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...
214
  	if (!spin_trylock_bh(&pd->lock))
d46a5ac7a   Steffen Klassert   padata: Use a tim...
215
  		return;
16295bec6   Steffen Klassert   padata: Generic p...
216
217
218
  
  	while (1) {
  		padata = padata_get_next(pd);
0198ffd13   Steffen Klassert   padata: Add some ...
219
220
221
222
223
224
  		/*
  		 * 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...
225
226
  		if (!padata || PTR_ERR(padata) == -EINPROGRESS)
  			break;
0198ffd13   Steffen Klassert   padata: Add some ...
227
228
229
  		/*
  		 * 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...
230
  		 * so exit immediately.
0198ffd13   Steffen Klassert   padata: Add some ...
231
  		 */
16295bec6   Steffen Klassert   padata: Generic p...
232
  		if (PTR_ERR(padata) == -ENODATA) {
d46a5ac7a   Steffen Klassert   padata: Use a tim...
233
  			del_timer(&pd->timer);
16295bec6   Steffen Klassert   padata: Generic p...
234
  			spin_unlock_bh(&pd->lock);
d46a5ac7a   Steffen Klassert   padata: Use a tim...
235
  			return;
16295bec6   Steffen Klassert   padata: Generic p...
236
  		}
3047817b8   Steffen Klassert   padata: Fix race ...
237
238
  		cb_cpu = padata->cb_cpu;
  		squeue = per_cpu_ptr(pd->squeue, cb_cpu);
16295bec6   Steffen Klassert   padata: Generic p...
239

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

3047817b8   Steffen Klassert   padata: Fix race ...
244
  		queue_work_on(cb_cpu, pinst->wq, &squeue->work);
16295bec6   Steffen Klassert   padata: Generic p...
245
246
247
  	}
  
  	spin_unlock_bh(&pd->lock);
0198ffd13   Steffen Klassert   padata: Add some ...
248
249
250
  	/*
  	 * 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...
251
  	 * from the timer function if no one else cares for it.
0198ffd13   Steffen Klassert   padata: Add some ...
252
  	 */
d46a5ac7a   Steffen Klassert   padata: Use a tim...
253
254
255
256
257
  	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...
258

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

e15bacbeb   Dan Kruchinin   padata: Make two ...
277
278
279
  	spin_lock(&squeue->serial.lock);
  	list_replace_init(&squeue->serial.list, &local_list);
  	spin_unlock(&squeue->serial.lock);
16295bec6   Steffen Klassert   padata: Generic p...
280
281
282
283
284
285
286
287
288
289
290
291
292
293
  
  	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 ...
294
  /**
16295bec6   Steffen Klassert   padata: Generic p...
295
296
297
298
299
300
301
302
303
304
   * 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 ...
305
  	struct padata_parallel_queue *pqueue;
16295bec6   Steffen Klassert   padata: Generic p...
306
307
308
309
310
  	struct parallel_data *pd;
  
  	pd = padata->pd;
  
  	cpu = get_cpu();
e15bacbeb   Dan Kruchinin   padata: Make two ...
311
  	pqueue = per_cpu_ptr(pd->pqueue, cpu);
16295bec6   Steffen Klassert   padata: Generic p...
312

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

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

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

e15bacbeb   Dan Kruchinin   padata: Make two ...
340
341
342
343
344
  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...
345

e15bacbeb   Dan Kruchinin   padata: Make two ...
346
347
348
349
350
  /* 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...
351

e15bacbeb   Dan Kruchinin   padata: Make two ...
352
353
354
355
356
357
358
  	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...
359

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

e15bacbeb   Dan Kruchinin   padata: Make two ...
366
367
368
369
370
  	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...
371
  		cpu_index++;
16295bec6   Steffen Klassert   padata: Generic p...
372

e15bacbeb   Dan Kruchinin   padata: Make two ...
373
374
375
376
  		__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...
377
  	}
e15bacbeb   Dan Kruchinin   padata: Make two ...
378
  }
16295bec6   Steffen Klassert   padata: Generic p...
379

e15bacbeb   Dan Kruchinin   padata: Make two ...
380
381
382
383
384
385
  /* 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...
386

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

e15bacbeb   Dan Kruchinin   padata: Make two ...
391
392
393
394
395
396
397
398
399
  	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...
400

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

e15bacbeb   Dan Kruchinin   padata: Make two ...
436
437
438
  	for_each_cpu(cpu, pd->cpumask.pcpu) {
  		pqueue = per_cpu_ptr(pd->pqueue, cpu);
  		flush_work(&pqueue->work);
2b73b07ab   Steffen Klassert   padata: Flush the...
439
440
441
442
443
444
  	}
  
  	del_timer_sync(&pd->timer);
  
  	if (atomic_read(&pd->reorder_objects))
  		padata_reorder(pd);
e15bacbeb   Dan Kruchinin   padata: Make two ...
445
446
447
  	for_each_cpu(cpu, pd->cpumask.cbcpu) {
  		squeue = per_cpu_ptr(pd->squeue, cpu);
  		flush_work(&squeue->work);
2b73b07ab   Steffen Klassert   padata: Flush the...
448
449
450
451
  	}
  
  	BUG_ON(atomic_read(&pd->refcnt) != 0);
  }
4c8791702   Steffen Klassert   padata: Check for...
452
453
454
455
  static void __padata_start(struct padata_instance *pinst)
  {
  	pinst->flags |= PADATA_INIT;
  }
ee8365551   Steffen Klassert   padata: Block unt...
456
457
458
459
460
461
462
463
464
465
466
467
468
  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...
469
  /* Replace the internal control structure with a new one. */
16295bec6   Steffen Klassert   padata: Generic p...
470
471
472
473
  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 ...
474
  	int notification_mask = 0;
16295bec6   Steffen Klassert   padata: Generic p...
475
476
477
478
479
480
  
  	pinst->flags |= PADATA_RESET;
  
  	rcu_assign_pointer(pinst->pd, pd_new);
  
  	synchronize_rcu();
e15bacbeb   Dan Kruchinin   padata: Make two ...
481
482
483
484
  	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...
485
  	padata_flush_queues(pd_old);
16295bec6   Steffen Klassert   padata: Generic p...
486
  	padata_free_pd(pd_old);
e15bacbeb   Dan Kruchinin   padata: Make two ...
487
488
  	if (notification_mask)
  		blocking_notifier_call_chain(&pinst->cpumask_change_notifier,
c635696c7   Steffen Klassert   padata: Pass the ...
489
490
  					     notification_mask,
  					     &pd_new->cpumask);
16295bec6   Steffen Klassert   padata: Generic p...
491
492
493
  
  	pinst->flags &= ~PADATA_RESET;
  }
0198ffd13   Steffen Klassert   padata: Add some ...
494
  /**
e15bacbeb   Dan Kruchinin   padata: Make two ...
495
496
   * 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...
497
   *
e15bacbeb   Dan Kruchinin   padata: Make two ...
498
499
   * @pinst: A poineter to padata instance
   * @nblock: A pointer to notifier block.
16295bec6   Steffen Klassert   padata: Generic p...
500
   */
e15bacbeb   Dan Kruchinin   padata: Make two ...
501
502
  int padata_register_cpumask_notifier(struct padata_instance *pinst,
  				     struct notifier_block *nblock)
16295bec6   Steffen Klassert   padata: Generic p...
503
  {
e15bacbeb   Dan Kruchinin   padata: Make two ...
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
  	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...
524
525
526
527
  /* 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...
528
  	if (!cpumask_intersects(cpumask, cpu_online_mask)) {
33e544506   Steffen Klassert   padata: Handle em...
529
530
531
532
533
534
535
  		pinst->flags |= PADATA_INVALID;
  		return false;
  	}
  
  	pinst->flags &= ~PADATA_INVALID;
  	return true;
  }
65ff577e6   Steffen Klassert   padata: Rearrange...
536
537
538
539
540
  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...
541
  	struct parallel_data *pd;
65ff577e6   Steffen Klassert   padata: Rearrange...
542
543
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
572
573
574
575
576
577
578
579
580
581
  
  	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...
582

16295bec6   Steffen Klassert   padata: Generic p...
583
  	mutex_lock(&pinst->lock);
65ff577e6   Steffen Klassert   padata: Rearrange...
584
  	get_online_cpus();
16295bec6   Steffen Klassert   padata: Generic p...
585

65ff577e6   Steffen Klassert   padata: Rearrange...
586
587
588
589
590
591
592
593
594
  	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 ...
595
596
597
  /**
   * padata_set_cpumask: Sets specified by @cpumask_type cpumask to the value
   *                     equivalent to @cpumask.
16295bec6   Steffen Klassert   padata: Generic p...
598
599
   *
   * @pinst: padata instance
e15bacbeb   Dan Kruchinin   padata: Make two ...
600
601
   * @cpumask_type: PADATA_CPU_SERIAL or PADATA_CPU_PARALLEL corresponding
   *                to parallel and serial cpumasks respectively.
16295bec6   Steffen Klassert   padata: Generic p...
602
603
   * @cpumask: the cpumask to use
   */
e15bacbeb   Dan Kruchinin   padata: Make two ...
604
605
606
607
  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...
608
609
610
  	int err = -EINVAL;
  
  	mutex_lock(&pinst->lock);
6751fb3c0   Steffen Klassert   padata: Use get_o...
611
  	get_online_cpus();
e15bacbeb   Dan Kruchinin   padata: Make two ...
612
613
614
615
616
617
618
619
620
621
  	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...
622
  		 goto out;
16295bec6   Steffen Klassert   padata: Generic p...
623
  	}
65ff577e6   Steffen Klassert   padata: Rearrange...
624
  	err =  __padata_set_cpumasks(pinst, parallel_mask, serial_mask);
16295bec6   Steffen Klassert   padata: Generic p...
625
626
  
  out:
6751fb3c0   Steffen Klassert   padata: Use get_o...
627
  	put_online_cpus();
16295bec6   Steffen Klassert   padata: Generic p...
628
629
630
631
632
633
634
635
636
  	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;
13614e0fb   Steffen Klassert   padata: Use the o...
637
  	if (cpumask_test_cpu(cpu, cpu_online_mask)) {
e15bacbeb   Dan Kruchinin   padata: Make two ...
638
639
  		pd = padata_alloc_pd(pinst, pinst->cpumask.pcpu,
  				     pinst->cpumask.cbcpu);
16295bec6   Steffen Klassert   padata: Generic p...
640
641
642
643
  		if (!pd)
  			return -ENOMEM;
  
  		padata_replace(pinst, pd);
33e544506   Steffen Klassert   padata: Handle em...
644

e15bacbeb   Dan Kruchinin   padata: Make two ...
645
646
  		if (padata_validate_cpumask(pinst, pinst->cpumask.pcpu) &&
  		    padata_validate_cpumask(pinst, pinst->cpumask.cbcpu))
33e544506   Steffen Klassert   padata: Handle em...
647
  			__padata_start(pinst);
16295bec6   Steffen Klassert   padata: Generic p...
648
649
650
651
  	}
  
  	return 0;
  }
e15bacbeb   Dan Kruchinin   padata: Make two ...
652
653
654
   /**
   * padata_add_cpu - add a cpu to one or both(parallel and serial)
   *                  padata cpumasks.
16295bec6   Steffen Klassert   padata: Generic p...
655
656
657
   *
   * @pinst: padata instance
   * @cpu: cpu to add
e15bacbeb   Dan Kruchinin   padata: Make two ...
658
659
660
661
   * @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...
662
   */
e15bacbeb   Dan Kruchinin   padata: Make two ...
663
664
  
  int padata_add_cpu(struct padata_instance *pinst, int cpu, int mask)
16295bec6   Steffen Klassert   padata: Generic p...
665
666
  {
  	int err;
e15bacbeb   Dan Kruchinin   padata: Make two ...
667
668
  	if (!(mask & (PADATA_CPU_SERIAL | PADATA_CPU_PARALLEL)))
  		return -EINVAL;
16295bec6   Steffen Klassert   padata: Generic p...
669
  	mutex_lock(&pinst->lock);
6751fb3c0   Steffen Klassert   padata: Use get_o...
670
  	get_online_cpus();
e15bacbeb   Dan Kruchinin   padata: Make two ...
671
672
673
674
  	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...
675
  	err = __padata_add_cpu(pinst, cpu);
6751fb3c0   Steffen Klassert   padata: Use get_o...
676
  	put_online_cpus();
16295bec6   Steffen Klassert   padata: Generic p...
677
678
679
680
681
682
683
684
685
  
  	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...
686
  	struct parallel_data *pd = NULL;
16295bec6   Steffen Klassert   padata: Generic p...
687
688
  
  	if (cpumask_test_cpu(cpu, cpu_online_mask)) {
33e544506   Steffen Klassert   padata: Handle em...
689

e15bacbeb   Dan Kruchinin   padata: Make two ...
690
  		if (!padata_validate_cpumask(pinst, pinst->cpumask.pcpu) ||
b89661dff   Steffen Klassert   padata: Allocate ...
691
  		    !padata_validate_cpumask(pinst, pinst->cpumask.cbcpu))
33e544506   Steffen Klassert   padata: Handle em...
692
  			__padata_stop(pinst);
33e544506   Steffen Klassert   padata: Handle em...
693

e15bacbeb   Dan Kruchinin   padata: Make two ...
694
695
  		pd = padata_alloc_pd(pinst, pinst->cpumask.pcpu,
  				     pinst->cpumask.cbcpu);
16295bec6   Steffen Klassert   padata: Generic p...
696
697
698
699
  		if (!pd)
  			return -ENOMEM;
  
  		padata_replace(pinst, pd);
961209052   Steffen Klassert   padata: Fix cpu h...
700
701
702
  
  		cpumask_clear_cpu(cpu, pd->cpumask.cbcpu);
  		cpumask_clear_cpu(cpu, pd->cpumask.pcpu);
16295bec6   Steffen Klassert   padata: Generic p...
703
704
705
706
  	}
  
  	return 0;
  }
e15bacbeb   Dan Kruchinin   padata: Make two ...
707
   /**
25985edce   Lucas De Marchi   Fix common misspe...
708
   * padata_remove_cpu - remove a cpu from the one or both(serial and parallel)
e15bacbeb   Dan Kruchinin   padata: Make two ...
709
   *                     padata cpumasks.
16295bec6   Steffen Klassert   padata: Generic p...
710
711
712
   *
   * @pinst: padata instance
   * @cpu: cpu to remove
e15bacbeb   Dan Kruchinin   padata: Make two ...
713
714
715
716
   * @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...
717
   */
e15bacbeb   Dan Kruchinin   padata: Make two ...
718
  int padata_remove_cpu(struct padata_instance *pinst, int cpu, int mask)
16295bec6   Steffen Klassert   padata: Generic p...
719
720
  {
  	int err;
e15bacbeb   Dan Kruchinin   padata: Make two ...
721
722
  	if (!(mask & (PADATA_CPU_SERIAL | PADATA_CPU_PARALLEL)))
  		return -EINVAL;
16295bec6   Steffen Klassert   padata: Generic p...
723
  	mutex_lock(&pinst->lock);
6751fb3c0   Steffen Klassert   padata: Use get_o...
724
  	get_online_cpus();
e15bacbeb   Dan Kruchinin   padata: Make two ...
725
726
727
728
  	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...
729
  	err = __padata_remove_cpu(pinst, cpu);
6751fb3c0   Steffen Klassert   padata: Use get_o...
730
  	put_online_cpus();
16295bec6   Steffen Klassert   padata: Generic p...
731
732
733
734
735
736
  
  	mutex_unlock(&pinst->lock);
  
  	return err;
  }
  EXPORT_SYMBOL(padata_remove_cpu);
0198ffd13   Steffen Klassert   padata: Add some ...
737
  /**
16295bec6   Steffen Klassert   padata: Generic p...
738
739
740
741
   * padata_start - start the parallel processing
   *
   * @pinst: padata instance to start
   */
4c8791702   Steffen Klassert   padata: Check for...
742
  int padata_start(struct padata_instance *pinst)
16295bec6   Steffen Klassert   padata: Generic p...
743
  {
4c8791702   Steffen Klassert   padata: Check for...
744
  	int err = 0;
16295bec6   Steffen Klassert   padata: Generic p...
745
  	mutex_lock(&pinst->lock);
4c8791702   Steffen Klassert   padata: Check for...
746
747
748
749
750
  
  	if (pinst->flags & PADATA_INVALID)
  		err =-EINVAL;
  
  	 __padata_start(pinst);
16295bec6   Steffen Klassert   padata: Generic p...
751
  	mutex_unlock(&pinst->lock);
4c8791702   Steffen Klassert   padata: Check for...
752
753
  
  	return err;
16295bec6   Steffen Klassert   padata: Generic p...
754
755
  }
  EXPORT_SYMBOL(padata_start);
0198ffd13   Steffen Klassert   padata: Add some ...
756
  /**
16295bec6   Steffen Klassert   padata: Generic p...
757
758
759
760
761
762
   * padata_stop - stop the parallel processing
   *
   * @pinst: padata instance to stop
   */
  void padata_stop(struct padata_instance *pinst)
  {
16295bec6   Steffen Klassert   padata: Generic p...
763
  	mutex_lock(&pinst->lock);
ee8365551   Steffen Klassert   padata: Block unt...
764
  	__padata_stop(pinst);
16295bec6   Steffen Klassert   padata: Generic p...
765
766
767
  	mutex_unlock(&pinst->lock);
  }
  EXPORT_SYMBOL(padata_stop);
e2cb2f1c2   Steffen Klassert   padata: cpu hotpl...
768
  #ifdef CONFIG_HOTPLUG_CPU
e15bacbeb   Dan Kruchinin   padata: Make two ...
769
770
771
772
773
774
  
  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...
775
776
  static int padata_cpu_callback(struct notifier_block *nfb,
  			       unsigned long action, void *hcpu)
16295bec6   Steffen Klassert   padata: Generic p...
777
778
779
780
781
782
783
784
785
786
  {
  	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:
9c823f9f7   Chen Gang   padata - share co...
787
788
  	case CPU_DOWN_FAILED:
  	case CPU_DOWN_FAILED_FROZEN:
e15bacbeb   Dan Kruchinin   padata: Make two ...
789
  		if (!pinst_has_cpu(pinst, cpu))
16295bec6   Steffen Klassert   padata: Generic p...
790
791
792
793
794
  			break;
  		mutex_lock(&pinst->lock);
  		err = __padata_add_cpu(pinst, cpu);
  		mutex_unlock(&pinst->lock);
  		if (err)
80b5184cc   Akinobu Mita   kernel/: convert ...
795
  			return notifier_from_errno(err);
16295bec6   Steffen Klassert   padata: Generic p...
796
797
798
799
  		break;
  
  	case CPU_DOWN_PREPARE:
  	case CPU_DOWN_PREPARE_FROZEN:
9c823f9f7   Chen Gang   padata - share co...
800
801
  	case CPU_UP_CANCELED:
  	case CPU_UP_CANCELED_FROZEN:
e15bacbeb   Dan Kruchinin   padata: Make two ...
802
  		if (!pinst_has_cpu(pinst, cpu))
16295bec6   Steffen Klassert   padata: Generic p...
803
804
805
806
807
  			break;
  		mutex_lock(&pinst->lock);
  		err = __padata_remove_cpu(pinst, cpu);
  		mutex_unlock(&pinst->lock);
  		if (err)
80b5184cc   Akinobu Mita   kernel/: convert ...
808
  			return notifier_from_errno(err);
16295bec6   Steffen Klassert   padata: Generic p...
809
  		break;
16295bec6   Steffen Klassert   padata: Generic p...
810
811
812
813
  	}
  
  	return NOTIFY_OK;
  }
e2cb2f1c2   Steffen Klassert   padata: cpu hotpl...
814
  #endif
16295bec6   Steffen Klassert   padata: Generic p...
815

5e017dc3f   Dan Kruchinin   padata: Added sys...
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
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
  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 ...
959
  /**
e6cc11707   Steffen Klassert   padata: Rename pa...
960
961
962
   * padata_alloc_possible - Allocate and initialize padata instance.
   *                         Use the cpu_possible_mask for serial and
   *                         parallel workers.
16295bec6   Steffen Klassert   padata: Generic p...
963
   *
16295bec6   Steffen Klassert   padata: Generic p...
964
965
   * @wq: workqueue to use for the allocated padata instance
   */
e6cc11707   Steffen Klassert   padata: Rename pa...
966
  struct padata_instance *padata_alloc_possible(struct workqueue_struct *wq)
e15bacbeb   Dan Kruchinin   padata: Make two ...
967
  {
e6cc11707   Steffen Klassert   padata: Rename pa...
968
  	return padata_alloc(wq, cpu_possible_mask, cpu_possible_mask);
e15bacbeb   Dan Kruchinin   padata: Make two ...
969
  }
e6cc11707   Steffen Klassert   padata: Rename pa...
970
  EXPORT_SYMBOL(padata_alloc_possible);
e15bacbeb   Dan Kruchinin   padata: Make two ...
971
972
  
  /**
e6cc11707   Steffen Klassert   padata: Rename pa...
973
974
   * padata_alloc - allocate and initialize a padata instance and specify
   *                cpumasks for serial and parallel workers.
16295bec6   Steffen Klassert   padata: Generic p...
975
   *
16295bec6   Steffen Klassert   padata: Generic p...
976
   * @wq: workqueue to use for the allocated padata instance
e15bacbeb   Dan Kruchinin   padata: Make two ...
977
978
   * @pcpumask: cpumask that will be used for padata parallelization
   * @cbcpumask: cpumask that will be used for padata serialization
16295bec6   Steffen Klassert   padata: Generic p...
979
   */
e6cc11707   Steffen Klassert   padata: Rename pa...
980
981
982
  struct padata_instance *padata_alloc(struct workqueue_struct *wq,
  				     const struct cpumask *pcpumask,
  				     const struct cpumask *cbcpumask)
16295bec6   Steffen Klassert   padata: Generic p...
983
  {
16295bec6   Steffen Klassert   padata: Generic p...
984
  	struct padata_instance *pinst;
33e544506   Steffen Klassert   padata: Handle em...
985
  	struct parallel_data *pd = NULL;
16295bec6   Steffen Klassert   padata: Generic p...
986
987
988
989
  
  	pinst = kzalloc(sizeof(struct padata_instance), GFP_KERNEL);
  	if (!pinst)
  		goto err;
6751fb3c0   Steffen Klassert   padata: Use get_o...
990
  	get_online_cpus();
e15bacbeb   Dan Kruchinin   padata: Make two ...
991
  	if (!alloc_cpumask_var(&pinst->cpumask.pcpu, GFP_KERNEL))
16295bec6   Steffen Klassert   padata: Generic p...
992
  		goto err_free_inst;
e15bacbeb   Dan Kruchinin   padata: Make two ...
993
994
  	if (!alloc_cpumask_var(&pinst->cpumask.cbcpu, GFP_KERNEL)) {
  		free_cpumask_var(pinst->cpumask.pcpu);
16295bec6   Steffen Klassert   padata: Generic p...
995
  		goto err_free_inst;
33e544506   Steffen Klassert   padata: Handle em...
996
  	}
e15bacbeb   Dan Kruchinin   padata: Make two ...
997
998
999
  	if (!padata_validate_cpumask(pinst, pcpumask) ||
  	    !padata_validate_cpumask(pinst, cbcpumask))
  		goto err_free_masks;
16295bec6   Steffen Klassert   padata: Generic p...
1000

e15bacbeb   Dan Kruchinin   padata: Make two ...
1001
1002
1003
  	pd = padata_alloc_pd(pinst, pcpumask, cbcpumask);
  	if (!pd)
  		goto err_free_masks;
747813878   Steffen Klassert   padata: Allocate ...
1004

16295bec6   Steffen Klassert   padata: Generic p...
1005
1006
1007
  	rcu_assign_pointer(pinst->pd, pd);
  
  	pinst->wq = wq;
e15bacbeb   Dan Kruchinin   padata: Make two ...
1008
1009
  	cpumask_copy(pinst->cpumask.pcpu, pcpumask);
  	cpumask_copy(pinst->cpumask.cbcpu, cbcpumask);
16295bec6   Steffen Klassert   padata: Generic p...
1010
1011
  
  	pinst->flags = 0;
6751fb3c0   Steffen Klassert   padata: Use get_o...
1012
  	put_online_cpus();
e15bacbeb   Dan Kruchinin   padata: Make two ...
1013
  	BLOCKING_INIT_NOTIFIER_HEAD(&pinst->cpumask_change_notifier);
5e017dc3f   Dan Kruchinin   padata: Added sys...
1014
  	kobject_init(&pinst->kobj, &padata_attr_type);
16295bec6   Steffen Klassert   padata: Generic p...
1015
  	mutex_init(&pinst->lock);
b8b4a4166   Richard Weinberger   padata - Register...
1016
1017
1018
1019
1020
  #ifdef CONFIG_HOTPLUG_CPU
  	pinst->cpu_notifier.notifier_call = padata_cpu_callback;
  	pinst->cpu_notifier.priority = 0;
  	register_hotcpu_notifier(&pinst->cpu_notifier);
  #endif
16295bec6   Steffen Klassert   padata: Generic p...
1021
  	return pinst;
e15bacbeb   Dan Kruchinin   padata: Make two ...
1022
1023
1024
  err_free_masks:
  	free_cpumask_var(pinst->cpumask.pcpu);
  	free_cpumask_var(pinst->cpumask.cbcpu);
16295bec6   Steffen Klassert   padata: Generic p...
1025
1026
  err_free_inst:
  	kfree(pinst);
6751fb3c0   Steffen Klassert   padata: Use get_o...
1027
  	put_online_cpus();
16295bec6   Steffen Klassert   padata: Generic p...
1028
1029
1030
1031
  err:
  	return NULL;
  }
  EXPORT_SYMBOL(padata_alloc);
0198ffd13   Steffen Klassert   padata: Add some ...
1032
  /**
16295bec6   Steffen Klassert   padata: Generic p...
1033
1034
   * padata_free - free a padata instance
   *
0198ffd13   Steffen Klassert   padata: Add some ...
1035
   * @padata_inst: padata instance to free
16295bec6   Steffen Klassert   padata: Generic p...
1036
1037
1038
   */
  void padata_free(struct padata_instance *pinst)
  {
5e017dc3f   Dan Kruchinin   padata: Added sys...
1039
  	kobject_put(&pinst->kobj);
16295bec6   Steffen Klassert   padata: Generic p...
1040
1041
  }
  EXPORT_SYMBOL(padata_free);