Merge branch 'core-fixes-for-linus-2' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip

* 'core-fixes-for-linus-2' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
generic-ipi: fix stack and rcu interaction bug in smp_call_function_mask(), fix

+6 -4
+6 -4
kernel/smp.c
··· 135 135 */ 136 136 smp_wmb(); 137 137 data->csd.flags &= ~CSD_FLAG_WAIT; 138 - } else 138 + } 139 + if (data->csd.flags & CSD_FLAG_ALLOC) 139 140 call_rcu(&data->rcu_head, rcu_free_call_data); 140 141 } 141 142 rcu_read_unlock(); ··· 290 289 291 290 data.func = quiesce_dummy; 292 291 data.info = NULL; 293 - data.flags = CSD_FLAG_WAIT; 294 292 295 - for_each_cpu_mask(cpu, mask) 293 + for_each_cpu_mask(cpu, mask) { 294 + data.flags = CSD_FLAG_WAIT; 296 295 generic_exec_single(cpu, &data); 296 + } 297 297 } 298 298 299 299 /** ··· 373 371 if (wait) { 374 372 csd_flag_wait(&data->csd); 375 373 if (unlikely(slowpath)) 376 - smp_call_function_mask_quiesce_stack(allbutself); 374 + smp_call_function_mask_quiesce_stack(mask); 377 375 } 378 376 379 377 return 0;