Blame view

kernel/padata.c 27.1 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
45
  {
  	int cpu_index;
16295bec6   Steffen Klassert   padata: Generic p...
46
47
48
49
50
  
  	/*
  	 * Hash the sequence numbers to the cpus by taking
  	 * seq_nr mod. number of cpus in use.
  	 */
2dc9b5dbd   Steffen Klassert   padata: Fix race ...
51
52
53
54
55
  
  	spin_lock(&pd->seq_lock);
  	cpu_index =  pd->seq_nr % cpumask_weight(pd->cpumask.pcpu);
  	pd->seq_nr++;
  	spin_unlock(&pd->seq_lock);
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
  	atomic_inc(&pd->refcnt);
  	padata->pd = pd;
  	padata->cb_cpu = cb_cpu;
2dc9b5dbd   Steffen Klassert   padata: Fix race ...
126
  	target_cpu = padata_cpu_hash(pd);
e15bacbeb   Dan Kruchinin   padata: Make two ...
127
  	queue = per_cpu_ptr(pd->pqueue, target_cpu);
16295bec6   Steffen Klassert   padata: Generic p...
128
129
130
131
  
  	spin_lock(&queue->parallel.lock);
  	list_add_tail(&padata->list, &queue->parallel.list);
  	spin_unlock(&queue->parallel.lock);
e15bacbeb   Dan Kruchinin   padata: Make two ...
132
  	queue_work_on(target_cpu, pinst->wq, &queue->work);
16295bec6   Steffen Klassert   padata: Generic p...
133
134
135
136
137
138
139
  
  out:
  	rcu_read_unlock_bh();
  
  	return err;
  }
  EXPORT_SYMBOL(padata_do_parallel);
0198ffd13   Steffen Klassert   padata: Add some ...
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
  /*
   * 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...
157
158
  static struct padata_priv *padata_get_next(struct parallel_data *pd)
  {
5f1a8c1bc   Steffen Klassert   padata: simplify ...
159
  	int cpu, num_cpus;
2dc9b5dbd   Steffen Klassert   padata: Fix race ...
160
  	unsigned int next_nr, next_index;
f0fcf2002   Shan Wei   padata: use __thi...
161
  	struct padata_parallel_queue *next_queue;
16295bec6   Steffen Klassert   padata: Generic p...
162
163
  	struct padata_priv *padata;
  	struct padata_list *reorder;
e15bacbeb   Dan Kruchinin   padata: Make two ...
164
  	num_cpus = cpumask_weight(pd->cpumask.pcpu);
16295bec6   Steffen Klassert   padata: Generic p...
165

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

e15bacbeb   Dan Kruchinin   padata: Make two ...
1014
1015
1016
  	pd = padata_alloc_pd(pinst, pcpumask, cbcpumask);
  	if (!pd)
  		goto err_free_masks;
747813878   Steffen Klassert   padata: Allocate ...
1017

16295bec6   Steffen Klassert   padata: Generic p...
1018
1019
1020
  	rcu_assign_pointer(pinst->pd, pd);
  
  	pinst->wq = wq;
e15bacbeb   Dan Kruchinin   padata: Make two ...
1021
1022
  	cpumask_copy(pinst->cpumask.pcpu, pcpumask);
  	cpumask_copy(pinst->cpumask.cbcpu, cbcpumask);
16295bec6   Steffen Klassert   padata: Generic p...
1023
1024
  
  	pinst->flags = 0;
e2cb2f1c2   Steffen Klassert   padata: cpu hotpl...
1025
  #ifdef CONFIG_HOTPLUG_CPU
16295bec6   Steffen Klassert   padata: Generic p...
1026
1027
  	pinst->cpu_notifier.notifier_call = padata_cpu_callback;
  	pinst->cpu_notifier.priority = 0;
e2cb2f1c2   Steffen Klassert   padata: cpu hotpl...
1028
1029
  	register_hotcpu_notifier(&pinst->cpu_notifier);
  #endif
16295bec6   Steffen Klassert   padata: Generic p...
1030

6751fb3c0   Steffen Klassert   padata: Use get_o...
1031
  	put_online_cpus();
e15bacbeb   Dan Kruchinin   padata: Make two ...
1032
  	BLOCKING_INIT_NOTIFIER_HEAD(&pinst->cpumask_change_notifier);
5e017dc3f   Dan Kruchinin   padata: Added sys...
1033
  	kobject_init(&pinst->kobj, &padata_attr_type);
16295bec6   Steffen Klassert   padata: Generic p...
1034
1035
1036
  	mutex_init(&pinst->lock);
  
  	return pinst;
e15bacbeb   Dan Kruchinin   padata: Make two ...
1037
1038
1039
  err_free_masks:
  	free_cpumask_var(pinst->cpumask.pcpu);
  	free_cpumask_var(pinst->cpumask.cbcpu);
16295bec6   Steffen Klassert   padata: Generic p...
1040
1041
  err_free_inst:
  	kfree(pinst);
6751fb3c0   Steffen Klassert   padata: Use get_o...
1042
  	put_online_cpus();
16295bec6   Steffen Klassert   padata: Generic p...
1043
1044
1045
1046
  err:
  	return NULL;
  }
  EXPORT_SYMBOL(padata_alloc);
0198ffd13   Steffen Klassert   padata: Add some ...
1047
  /**
16295bec6   Steffen Klassert   padata: Generic p...
1048
1049
   * padata_free - free a padata instance
   *
0198ffd13   Steffen Klassert   padata: Add some ...
1050
   * @padata_inst: padata instance to free
16295bec6   Steffen Klassert   padata: Generic p...
1051
1052
1053
   */
  void padata_free(struct padata_instance *pinst)
  {
5e017dc3f   Dan Kruchinin   padata: Added sys...
1054
  	kobject_put(&pinst->kobj);
16295bec6   Steffen Klassert   padata: Generic p...
1055
1056
  }
  EXPORT_SYMBOL(padata_free);