Blame view

kernel/padata.c 27.5 KB
16295bec6   Steffen Klassert   padata: Generic p...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  /*
   * padata.c - generic interface to process data streams in parallel
   *
   * Copyright (C) 2008, 2009 secunet Security Networks AG
   * Copyright (C) 2008, 2009 Steffen Klassert <steffen.klassert@secunet.com>
   *
   * This program is free software; you can redistribute it and/or modify it
   * under the terms and conditions of the GNU General Public License,
   * version 2, as published by the Free Software Foundation.
   *
   * This program is distributed in the hope it will be useful, but WITHOUT
   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
   * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
   * more details.
   *
   * You should have received a copy of the GNU General Public License along with
   * this program; if not, write to the Free Software Foundation, Inc.,
   * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
   */
9984de1a5   Paul Gortmaker   kernel: Map most ...
20
  #include <linux/export.h>
16295bec6   Steffen Klassert   padata: Generic p...
21
22
23
24
25
26
  #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: ...
27
  #include <linux/slab.h>
5e017dc3f   Dan Kruchinin   padata: Added sys...
28
  #include <linux/sysfs.h>
16295bec6   Steffen Klassert   padata: Generic p...
29
  #include <linux/rcupdate.h>
749d811f1   Dan Carpenter   padata: add paren...
30
  #define MAX_SEQ_NR (INT_MAX - NR_CPUS)
97e3d94aa   Steffen Klassert   padata: Dont scal...
31
  #define MAX_OBJ_NUM 1000
16295bec6   Steffen Klassert   padata: Generic p...
32
33
34
35
  
  static int padata_index_to_cpu(struct parallel_data *pd, int cpu_index)
  {
  	int cpu, target_cpu;
e15bacbeb   Dan Kruchinin   padata: Make two ...
36
  	target_cpu = cpumask_first(pd->cpumask.pcpu);
16295bec6   Steffen Klassert   padata: Generic p...
37
  	for (cpu = 0; cpu < cpu_index; cpu++)
e15bacbeb   Dan Kruchinin   padata: Make two ...
38
  		target_cpu = cpumask_next(target_cpu, pd->cpumask.pcpu);
16295bec6   Steffen Klassert   padata: Generic p...
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
  
  	return target_cpu;
  }
  
  static int padata_cpu_hash(struct padata_priv *padata)
  {
  	int cpu_index;
  	struct parallel_data *pd;
  
  	pd =  padata->pd;
  
  	/*
  	 * Hash the sequence numbers to the cpus by taking
  	 * seq_nr mod. number of cpus in use.
  	 */
e15bacbeb   Dan Kruchinin   padata: Make two ...
54
  	cpu_index =  padata->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
107
108
  	struct parallel_data *pd;
  
  	rcu_read_lock_bh();
  
  	pd = rcu_dereference(pinst->pd);
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
125
126
127
128
129
130
131
  	atomic_inc(&pd->refcnt);
  	padata->pd = pd;
  	padata->cb_cpu = cb_cpu;
  
  	if (unlikely(atomic_read(&pd->seq_nr) == pd->max_seq_nr))
  		atomic_set(&pd->seq_nr, -1);
  
  	padata->seq_nr = atomic_inc_return(&pd->seq_nr);
  
  	target_cpu = padata_cpu_hash(padata);
e15bacbeb   Dan Kruchinin   padata: Make two ...
132
  	queue = per_cpu_ptr(pd->pqueue, target_cpu);
16295bec6   Steffen Klassert   padata: Generic p...
133
134
135
136
  
  	spin_lock(&queue->parallel.lock);
  	list_add_tail(&padata->list, &queue->parallel.list);
  	spin_unlock(&queue->parallel.lock);
e15bacbeb   Dan Kruchinin   padata: Make two ...
137
  	queue_work_on(target_cpu, pinst->wq, &queue->work);
16295bec6   Steffen Klassert   padata: Generic p...
138
139
140
141
142
143
144
  
  out:
  	rcu_read_unlock_bh();
  
  	return err;
  }
  EXPORT_SYMBOL(padata_do_parallel);
0198ffd13   Steffen Klassert   padata: Add some ...
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
  /*
   * 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...
162
163
  static struct padata_priv *padata_get_next(struct parallel_data *pd)
  {
5f1a8c1bc   Steffen Klassert   padata: simplify ...
164
165
  	int cpu, num_cpus;
  	int next_nr, next_index;
e15bacbeb   Dan Kruchinin   padata: Make two ...
166
  	struct padata_parallel_queue *queue, *next_queue;
16295bec6   Steffen Klassert   padata: Generic p...
167
168
  	struct padata_priv *padata;
  	struct padata_list *reorder;
e15bacbeb   Dan Kruchinin   padata: Make two ...
169
  	num_cpus = cpumask_weight(pd->cpumask.pcpu);
16295bec6   Steffen Klassert   padata: Generic p...
170

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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