doubts about switch_mm
Russell King - ARM Linux
linux at arm.linux.org.uk
Thu Aug 2 15:49:31 EDT 2012
On Thu, Aug 02, 2012 at 09:08:19PM +0200, Gilles Chanteperdrix wrote:
> switch_mm code, as of 3.5 contains:
>
> 1 if (!cpumask_test_and_set_cpu(cpu, mm_cpumask(next)) || prev != next) {
> 2 check_and_switch_context(next, tsk);
> 3 if (cache_is_vivt())
> 4 cpumask_clear_cpu(cpu, mm_cpumask(prev));
> 5 }
>
> Line 1 seems to mean that maybe switch_mm is called with prev == next.
> But then, what line 4 does is certainly wrong if prev == next.
Look at it more carefully.
If prev == next, then we're already running with *this* mm. The bit
in the CPU mask for this CPU will be set.
So, cpumask_test_and_set_cpu(cpu, mm_cpumask(next)) will be true, and
because the condition is inverted, the first half of the if condition
is false.
The second half is false, because prev == next. So lines 2-4 will not
be executed.
More information about the linux-arm-kernel
mailing list