diff options
| -rw-r--r-- | kernel/padata.c | 12 | 
1 files changed, 12 insertions, 0 deletions
| diff --git a/kernel/padata.c b/kernel/padata.c index 2d2fddbb7a4c..15a8ad63f4ff 100644 --- a/kernel/padata.c +++ b/kernel/padata.c @@ -267,7 +267,12 @@ static void padata_reorder(struct parallel_data *pd)  	 * The next object that needs serialization might have arrived to  	 * the reorder queues in the meantime, we will be called again  	 * from the timer function if no one else cares for it. +	 * +	 * Ensure reorder_objects is read after pd->lock is dropped so we see +	 * an increment from another task in padata_do_serial.  Pairs with +	 * smp_mb__after_atomic in padata_do_serial.  	 */ +	smp_mb();  	if (atomic_read(&pd->reorder_objects)  			&& !(pinst->flags & PADATA_RESET))  		mod_timer(&pd->timer, jiffies + HZ); @@ -387,6 +392,13 @@ void padata_do_serial(struct padata_priv *padata)  	list_add_tail(&padata->list, &pqueue->reorder.list);  	spin_unlock(&pqueue->reorder.lock); +	/* +	 * Ensure the atomic_inc of reorder_objects above is ordered correctly +	 * with the trylock of pd->lock in padata_reorder.  Pairs with smp_mb +	 * in padata_reorder. +	 */ +	smp_mb__after_atomic(); +  	put_cpu();  	/* If we're running on the wrong CPU, call padata_reorder() via a |