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