Blame view

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

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

0b6b098ef   Mathias Krause   padata: make the ...
55
56
  	seq_nr = atomic_inc_return(&pd->seq_nr);
  	cpu_index = seq_nr % cpumask_weight(pd->cpumask.pcpu);
16295bec6   Steffen Klassert   padata: Generic p...
57
58
59
  
  	return padata_index_to_cpu(pd, cpu_index);
  }
e15bacbeb   Dan Kruchinin   padata: Make two ...
60
  static void padata_parallel_worker(struct work_struct *parallel_work)
16295bec6   Steffen Klassert   padata: Generic p...
61
  {
e15bacbeb   Dan Kruchinin   padata: Make two ...
62
  	struct padata_parallel_queue *pqueue;
16295bec6   Steffen Klassert   padata: Generic p...
63
64
65
  	LIST_HEAD(local_list);
  
  	local_bh_disable();
e15bacbeb   Dan Kruchinin   padata: Make two ...
66
67
  	pqueue = container_of(parallel_work,
  			      struct padata_parallel_queue, work);
16295bec6   Steffen Klassert   padata: Generic p...
68

e15bacbeb   Dan Kruchinin   padata: Make two ...
69
70
71
  	spin_lock(&pqueue->parallel.lock);
  	list_replace_init(&pqueue->parallel.list, &local_list);
  	spin_unlock(&pqueue->parallel.lock);
16295bec6   Steffen Klassert   padata: Generic p...
72
73
74
75
76
77
78
79
80
81
82
83
84
85
  
  	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 ...
86
  /**
16295bec6   Steffen Klassert   padata: Generic p...
87
88
89
90
91
   * 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 ...
92
   *          must be in the serial cpumask of padata(i.e. cpumask.cbcpu).
16295bec6   Steffen Klassert   padata: Generic p...
93
94
95
96
97
98
99
100
101
   *
   * 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 ...
102
  	struct padata_parallel_queue *queue;
16295bec6   Steffen Klassert   padata: Generic p...
103
104
105
  	struct parallel_data *pd;
  
  	rcu_read_lock_bh();
c0e656b7a   Mathias Krause   padata: Fix wrong...
106
  	pd = rcu_dereference_bh(pinst->pd);
16295bec6   Steffen Klassert   padata: Generic p...
107

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

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

16295bec6   Steffen Klassert   padata: Generic p...
171
  	reorder = &next_queue->reorder;
de5540d08   Jason A. Donenfeld   padata: avoid rac...
172
  	spin_lock(&reorder->lock);
16295bec6   Steffen Klassert   padata: Generic p...
173
174
175
  	if (!list_empty(&reorder->list)) {
  		padata = list_entry(reorder->list.next,
  				    struct padata_priv, list);
16295bec6   Steffen Klassert   padata: Generic p...
176
177
  		list_del_init(&padata->list);
  		atomic_dec(&pd->reorder_objects);
16295bec6   Steffen Klassert   padata: Generic p...
178

5f1a8c1bc   Steffen Klassert   padata: simplify ...
179
  		pd->processed++;
16295bec6   Steffen Klassert   padata: Generic p...
180

de5540d08   Jason A. Donenfeld   padata: avoid rac...
181
  		spin_unlock(&reorder->lock);
16295bec6   Steffen Klassert   padata: Generic p...
182
183
  		goto out;
  	}
de5540d08   Jason A. Donenfeld   padata: avoid rac...
184
  	spin_unlock(&reorder->lock);
16295bec6   Steffen Klassert   padata: Generic p...
185

f0fcf2002   Shan Wei   padata: use __thi...
186
  	if (__this_cpu_read(pd->pqueue->cpu_index) == next_queue->cpu_index) {
16295bec6   Steffen Klassert   padata: Generic p...
187
188
189
190
191
192
193
194
195
196
197
  		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 ...
198
  	int cb_cpu;
16295bec6   Steffen Klassert   padata: Generic p...
199
  	struct padata_priv *padata;
e15bacbeb   Dan Kruchinin   padata: Make two ...
200
  	struct padata_serial_queue *squeue;
16295bec6   Steffen Klassert   padata: Generic p...
201
  	struct padata_instance *pinst = pd->pinst;
0198ffd13   Steffen Klassert   padata: Add some ...
202
203
204
205
206
207
208
209
210
211
  	/*
  	 * 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...
212
  	if (!spin_trylock_bh(&pd->lock))
d46a5ac7a   Steffen Klassert   padata: Use a tim...
213
  		return;
16295bec6   Steffen Klassert   padata: Generic p...
214
215
216
  
  	while (1) {
  		padata = padata_get_next(pd);
0198ffd13   Steffen Klassert   padata: Add some ...
217
  		/*
69b348449   Jason A. Donenfeld   padata: get_next ...
218
219
220
  		 * If 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.
0198ffd13   Steffen Klassert   padata: Add some ...
221
  		 */
69b348449   Jason A. Donenfeld   padata: get_next ...
222
  		if (PTR_ERR(padata) == -EINPROGRESS)
16295bec6   Steffen Klassert   padata: Generic p...
223
  			break;
0198ffd13   Steffen Klassert   padata: Add some ...
224
225
226
  		/*
  		 * 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...
227
  		 * so exit immediately.
0198ffd13   Steffen Klassert   padata: Add some ...
228
  		 */
16295bec6   Steffen Klassert   padata: Generic p...
229
  		if (PTR_ERR(padata) == -ENODATA) {
d46a5ac7a   Steffen Klassert   padata: Use a tim...
230
  			del_timer(&pd->timer);
16295bec6   Steffen Klassert   padata: Generic p...
231
  			spin_unlock_bh(&pd->lock);
d46a5ac7a   Steffen Klassert   padata: Use a tim...
232
  			return;
16295bec6   Steffen Klassert   padata: Generic p...
233
  		}
3047817b8   Steffen Klassert   padata: Fix race ...
234
235
  		cb_cpu = padata->cb_cpu;
  		squeue = per_cpu_ptr(pd->squeue, cb_cpu);
16295bec6   Steffen Klassert   padata: Generic p...
236

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

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

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

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

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

13614e0fb   Steffen Klassert   padata: Use the o...
327
  	cpumask_and(pd->cpumask.pcpu, pcpumask, cpu_online_mask);
e15bacbeb   Dan Kruchinin   padata: Make two ...
328
  	if (!alloc_cpumask_var(&pd->cpumask.cbcpu, GFP_KERNEL)) {
07a77929b   Jason A. Donenfeld   padata: free corr...
329
  		free_cpumask_var(pd->cpumask.pcpu);
e15bacbeb   Dan Kruchinin   padata: Make two ...
330
331
  		return -ENOMEM;
  	}
16295bec6   Steffen Klassert   padata: Generic p...
332

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

e15bacbeb   Dan Kruchinin   padata: Make two ...
337
338
339
340
341
  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...
342

e15bacbeb   Dan Kruchinin   padata: Make two ...
343
344
345
346
347
  /* 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...
348

e15bacbeb   Dan Kruchinin   padata: Make two ...
349
350
351
352
353
354
355
  	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...
356

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

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

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

e15bacbeb   Dan Kruchinin   padata: Make two ...
377
378
379
380
381
382
  /* 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...
383

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

e15bacbeb   Dan Kruchinin   padata: Make two ...
388
389
390
391
392
393
394
395
396
  	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...
397

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

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

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

e15bacbeb   Dan Kruchinin   padata: Make two ...
664
  		if (!padata_validate_cpumask(pinst, pinst->cpumask.pcpu) ||
b89661dff   Steffen Klassert   padata: Allocate ...
665
  		    !padata_validate_cpumask(pinst, pinst->cpumask.cbcpu))
33e544506   Steffen Klassert   padata: Handle em...
666
  			__padata_stop(pinst);
33e544506   Steffen Klassert   padata: Handle em...
667

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

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

30e92153b   Sebastian Andrzej Siewior   padata: Convert t...
725
726
727
728
729
  	mutex_lock(&pinst->lock);
  	ret = __padata_add_cpu(pinst, cpu);
  	mutex_unlock(&pinst->lock);
  	return ret;
  }
16295bec6   Steffen Klassert   padata: Generic p...
730

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

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

5e017dc3f   Dan Kruchinin   padata: Added sys...
749
750
751
  static void __padata_free(struct padata_instance *pinst)
  {
  #ifdef CONFIG_HOTPLUG_CPU
30e92153b   Sebastian Andrzej Siewior   padata: Convert t...
752
  	cpuhp_state_remove_instance_nocalls(hp_online, &pinst->node);
5e017dc3f   Dan Kruchinin   padata: Added sys...
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
  #endif
  
  	padata_stop(pinst);
  	padata_free_pd(pinst->pd);
  	free_cpumask_var(pinst->cpumask.pcpu);
  	free_cpumask_var(pinst->cpumask.cbcpu);
  	kfree(pinst);
  }
  
  #define kobj2pinst(_kobj)					\
  	container_of(_kobj, struct padata_instance, kobj)
  #define attr2pentry(_attr)					\
  	container_of(_attr, struct padata_sysfs_entry, attr)
  
  static void padata_sysfs_release(struct kobject *kobj)
  {
  	struct padata_instance *pinst = kobj2pinst(kobj);
  	__padata_free(pinst);
  }
  
  struct padata_sysfs_entry {
  	struct attribute attr;
  	ssize_t (*show)(struct padata_instance *, struct attribute *, char *);
  	ssize_t (*store)(struct padata_instance *, struct attribute *,
  			 const char *, size_t);
  };
  
  static ssize_t show_cpumask(struct padata_instance *pinst,
  			    struct attribute *attr,  char *buf)
  {
  	struct cpumask *cpumask;
  	ssize_t len;
  
  	mutex_lock(&pinst->lock);
  	if (!strcmp(attr->name, "serial_cpumask"))
  		cpumask = pinst->cpumask.cbcpu;
  	else
  		cpumask = pinst->cpumask.pcpu;
4497da6f9   Tejun Heo   padata: use %*pb[...
791
792
793
  	len = snprintf(buf, PAGE_SIZE, "%*pb
  ",
  		       nr_cpu_ids, cpumask_bits(cpumask));
5e017dc3f   Dan Kruchinin   padata: Added sys...
794
  	mutex_unlock(&pinst->lock);
4497da6f9   Tejun Heo   padata: use %*pb[...
795
  	return len < PAGE_SIZE ? len : -EINVAL;
5e017dc3f   Dan Kruchinin   padata: Added sys...
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
  }
  
  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 ...
886
  /**
e6cc11707   Steffen Klassert   padata: Rename pa...
887
888
   * padata_alloc - allocate and initialize a padata instance and specify
   *                cpumasks for serial and parallel workers.
16295bec6   Steffen Klassert   padata: Generic p...
889
   *
16295bec6   Steffen Klassert   padata: Generic p...
890
   * @wq: workqueue to use for the allocated padata instance
e15bacbeb   Dan Kruchinin   padata: Make two ...
891
892
   * @pcpumask: cpumask that will be used for padata parallelization
   * @cbcpumask: cpumask that will be used for padata serialization
c5a81c8ff   Sebastian Andrzej Siewior   padata: Avoid nes...
893
894
   *
   * Must be called from a cpus_read_lock() protected region
16295bec6   Steffen Klassert   padata: Generic p...
895
   */
9596695ee   Thomas Gleixner   padata: Make pada...
896
897
898
  static struct padata_instance *padata_alloc(struct workqueue_struct *wq,
  					    const struct cpumask *pcpumask,
  					    const struct cpumask *cbcpumask)
16295bec6   Steffen Klassert   padata: Generic p...
899
  {
16295bec6   Steffen Klassert   padata: Generic p...
900
  	struct padata_instance *pinst;
33e544506   Steffen Klassert   padata: Handle em...
901
  	struct parallel_data *pd = NULL;
16295bec6   Steffen Klassert   padata: Generic p...
902
903
904
905
  
  	pinst = kzalloc(sizeof(struct padata_instance), GFP_KERNEL);
  	if (!pinst)
  		goto err;
e15bacbeb   Dan Kruchinin   padata: Make two ...
906
  	if (!alloc_cpumask_var(&pinst->cpumask.pcpu, GFP_KERNEL))
16295bec6   Steffen Klassert   padata: Generic p...
907
  		goto err_free_inst;
e15bacbeb   Dan Kruchinin   padata: Make two ...
908
909
  	if (!alloc_cpumask_var(&pinst->cpumask.cbcpu, GFP_KERNEL)) {
  		free_cpumask_var(pinst->cpumask.pcpu);
16295bec6   Steffen Klassert   padata: Generic p...
910
  		goto err_free_inst;
33e544506   Steffen Klassert   padata: Handle em...
911
  	}
e15bacbeb   Dan Kruchinin   padata: Make two ...
912
913
914
  	if (!padata_validate_cpumask(pinst, pcpumask) ||
  	    !padata_validate_cpumask(pinst, cbcpumask))
  		goto err_free_masks;
16295bec6   Steffen Klassert   padata: Generic p...
915

e15bacbeb   Dan Kruchinin   padata: Make two ...
916
917
918
  	pd = padata_alloc_pd(pinst, pcpumask, cbcpumask);
  	if (!pd)
  		goto err_free_masks;
747813878   Steffen Klassert   padata: Allocate ...
919

16295bec6   Steffen Klassert   padata: Generic p...
920
921
922
  	rcu_assign_pointer(pinst->pd, pd);
  
  	pinst->wq = wq;
e15bacbeb   Dan Kruchinin   padata: Make two ...
923
924
  	cpumask_copy(pinst->cpumask.pcpu, pcpumask);
  	cpumask_copy(pinst->cpumask.cbcpu, cbcpumask);
16295bec6   Steffen Klassert   padata: Generic p...
925
926
  
  	pinst->flags = 0;
e15bacbeb   Dan Kruchinin   padata: Make two ...
927
  	BLOCKING_INIT_NOTIFIER_HEAD(&pinst->cpumask_change_notifier);
5e017dc3f   Dan Kruchinin   padata: Added sys...
928
  	kobject_init(&pinst->kobj, &padata_attr_type);
16295bec6   Steffen Klassert   padata: Generic p...
929
  	mutex_init(&pinst->lock);
b8b4a4166   Richard Weinberger   padata - Register...
930
  #ifdef CONFIG_HOTPLUG_CPU
c5a81c8ff   Sebastian Andrzej Siewior   padata: Avoid nes...
931
  	cpuhp_state_add_instance_nocalls_cpuslocked(hp_online, &pinst->node);
b8b4a4166   Richard Weinberger   padata - Register...
932
  #endif
16295bec6   Steffen Klassert   padata: Generic p...
933
  	return pinst;
e15bacbeb   Dan Kruchinin   padata: Make two ...
934
935
936
  err_free_masks:
  	free_cpumask_var(pinst->cpumask.pcpu);
  	free_cpumask_var(pinst->cpumask.cbcpu);
16295bec6   Steffen Klassert   padata: Generic p...
937
938
939
940
941
  err_free_inst:
  	kfree(pinst);
  err:
  	return NULL;
  }
16295bec6   Steffen Klassert   padata: Generic p...
942

0198ffd13   Steffen Klassert   padata: Add some ...
943
  /**
9596695ee   Thomas Gleixner   padata: Make pada...
944
945
946
947
948
   * padata_alloc_possible - Allocate and initialize padata instance.
   *                         Use the cpu_possible_mask for serial and
   *                         parallel workers.
   *
   * @wq: workqueue to use for the allocated padata instance
c5a81c8ff   Sebastian Andrzej Siewior   padata: Avoid nes...
949
950
   *
   * Must be called from a cpus_read_lock() protected region
9596695ee   Thomas Gleixner   padata: Make pada...
951
952
953
   */
  struct padata_instance *padata_alloc_possible(struct workqueue_struct *wq)
  {
c5a81c8ff   Sebastian Andrzej Siewior   padata: Avoid nes...
954
  	lockdep_assert_cpus_held();
9596695ee   Thomas Gleixner   padata: Make pada...
955
956
957
958
959
  	return padata_alloc(wq, cpu_possible_mask, cpu_possible_mask);
  }
  EXPORT_SYMBOL(padata_alloc_possible);
  
  /**
16295bec6   Steffen Klassert   padata: Generic p...
960
961
   * padata_free - free a padata instance
   *
0198ffd13   Steffen Klassert   padata: Add some ...
962
   * @padata_inst: padata instance to free
16295bec6   Steffen Klassert   padata: Generic p...
963
964
965
   */
  void padata_free(struct padata_instance *pinst)
  {
5e017dc3f   Dan Kruchinin   padata: Added sys...
966
  	kobject_put(&pinst->kobj);
16295bec6   Steffen Klassert   padata: Generic p...
967
968
  }
  EXPORT_SYMBOL(padata_free);
30e92153b   Sebastian Andrzej Siewior   padata: Convert t...
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
  
  #ifdef CONFIG_HOTPLUG_CPU
  
  static __init int padata_driver_init(void)
  {
  	int ret;
  
  	ret = cpuhp_setup_state_multi(CPUHP_AP_ONLINE_DYN, "padata:online",
  				      padata_cpu_online,
  				      padata_cpu_prep_down);
  	if (ret < 0)
  		return ret;
  	hp_online = ret;
  	return 0;
  }
  module_init(padata_driver_init);
  
  static __exit void padata_driver_exit(void)
  {
  	cpuhp_remove_multi_state(hp_online);
  }
  module_exit(padata_driver_exit);
  #endif