aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'kernel')
-rw-r--r--kernel/padata.c25
1 files changed, 18 insertions, 7 deletions
diff --git a/kernel/padata.c b/kernel/padata.c
index 82958e01564b..6d7ea481b716 100644
--- a/kernel/padata.c
+++ b/kernel/padata.c
@@ -231,7 +231,8 @@ static struct padata_priv *padata_get_next(struct parallel_data *pd)
231 goto out; 231 goto out;
232 } 232 }
233 233
234 if (next_nr % num_cpus == next_queue->cpu_index) { 234 queue = per_cpu_ptr(pd->queue, smp_processor_id());
235 if (queue->cpu_index == next_queue->cpu_index) {
235 padata = ERR_PTR(-ENODATA); 236 padata = ERR_PTR(-ENODATA);
236 goto out; 237 goto out;
237 } 238 }
@@ -247,9 +248,8 @@ static void padata_reorder(struct parallel_data *pd)
247 struct padata_queue *queue; 248 struct padata_queue *queue;
248 struct padata_instance *pinst = pd->pinst; 249 struct padata_instance *pinst = pd->pinst;
249 250
250try_again:
251 if (!spin_trylock_bh(&pd->lock)) 251 if (!spin_trylock_bh(&pd->lock))
252 goto out; 252 return;
253 253
254 while (1) { 254 while (1) {
255 padata = padata_get_next(pd); 255 padata = padata_get_next(pd);
@@ -258,8 +258,9 @@ try_again:
258 break; 258 break;
259 259
260 if (PTR_ERR(padata) == -ENODATA) { 260 if (PTR_ERR(padata) == -ENODATA) {
261 del_timer(&pd->timer);
261 spin_unlock_bh(&pd->lock); 262 spin_unlock_bh(&pd->lock);
262 goto out; 263 return;
263 } 264 }
264 265
265 queue = per_cpu_ptr(pd->queue, padata->cb_cpu); 266 queue = per_cpu_ptr(pd->queue, padata->cb_cpu);
@@ -273,13 +274,22 @@ try_again:
273 274
274 spin_unlock_bh(&pd->lock); 275 spin_unlock_bh(&pd->lock);
275 276
276 if (atomic_read(&pd->reorder_objects)) 277 if (atomic_read(&pd->reorder_objects)
277 goto try_again; 278 && !(pinst->flags & PADATA_RESET))
279 mod_timer(&pd->timer, jiffies + HZ);
280 else
281 del_timer(&pd->timer);
278 282
279out:
280 return; 283 return;
281} 284}
282 285
286static void padata_reorder_timer(unsigned long arg)
287{
288 struct parallel_data *pd = (struct parallel_data *)arg;
289
290 padata_reorder(pd);
291}
292
283static void padata_serial_worker(struct work_struct *work) 293static void padata_serial_worker(struct work_struct *work)
284{ 294{
285 struct padata_queue *queue; 295 struct padata_queue *queue;
@@ -383,6 +393,7 @@ static struct parallel_data *padata_alloc_pd(struct padata_instance *pinst,
383 num_cpus = cpumask_weight(pd->cpumask); 393 num_cpus = cpumask_weight(pd->cpumask);
384 pd->max_seq_nr = (MAX_SEQ_NR / num_cpus) * num_cpus - 1; 394 pd->max_seq_nr = (MAX_SEQ_NR / num_cpus) * num_cpus - 1;
385 395
396 setup_timer(&pd->timer, padata_reorder_timer, (unsigned long)pd);
386 atomic_set(&pd->seq_nr, -1); 397 atomic_set(&pd->seq_nr, -1);
387 atomic_set(&pd->reorder_objects, 0); 398 atomic_set(&pd->reorder_objects, 0);
388 atomic_set(&pd->refcnt, 0); 399 atomic_set(&pd->refcnt, 0);