• Andrew Morton's avatar
    [PATCH] flush_tlb_all is not preempt safe · 3e124416
    Andrew Morton authored
    Patch from: Zwane Mwaikambo <zwane@holomorphy.com>
    
    Considering that smp_call_function isn't allowed to hold a lock reference and
    within smp_call_function we lock and unlock call_lock thus triggering a
    preempt point.  Therefore we can't guarantee that we'll be on the same
    processor when we hit do_flush_tlb_all_local.
    
    void flush_tlb_all(void)
    {
    	smp_call_function (flush_tlb_all_ipi,0,1,1);
    
    	do_flush_tlb_all_local();
    }
    
    ...
    
    smp_call_function()
    {
    	spin_lock(call_lock);
    	...
    	spin_unlock(call_lock);
    	<preemption point>
    }
    
    ...
    
    do_flush_tlb_all_local() - possibly not executing on same processor
    anymore.
    3e124416
smp.c 15.1 KB