Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 96348852 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge branch 'core-fixes-for-linus-2' of...

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
parents 1c89ac55 c2fc1198
Loading
Loading
Loading
Loading
+6 −4
Original line number Diff line number Diff line
@@ -135,7 +135,8 @@ void generic_smp_call_function_interrupt(void)
			 */
			smp_wmb();
			data->csd.flags &= ~CSD_FLAG_WAIT;
		} else
		}
		if (data->csd.flags & CSD_FLAG_ALLOC)
			call_rcu(&data->rcu_head, rcu_free_call_data);
	}
	rcu_read_unlock();
@@ -289,11 +290,12 @@ static void smp_call_function_mask_quiesce_stack(cpumask_t mask)

	data.func = quiesce_dummy;
	data.info = NULL;
	data.flags = CSD_FLAG_WAIT;

	for_each_cpu_mask(cpu, mask)
	for_each_cpu_mask(cpu, mask) {
		data.flags = CSD_FLAG_WAIT;
		generic_exec_single(cpu, &data);
	}
}

/**
 * smp_call_function_mask(): Run a function on a set of other CPUs.
@@ -371,7 +373,7 @@ int smp_call_function_mask(cpumask_t mask, void (*func)(void *), void *info,
	if (wait) {
		csd_flag_wait(&data->csd);
		if (unlikely(slowpath))
			smp_call_function_mask_quiesce_stack(allbutself);
			smp_call_function_mask_quiesce_stack(mask);
	}

	return 0;