I think I found 2 minor bugs in the current tlb flush code: - during crossing TLB flushes, mm->cpu_mask is not set. - flush_tlb_current_task() contains a race between flush_tlb_other_cpus(the IPI could set mm->cpu_mask) & the next line. effectively, my patch means that flush_tlb_current_task() is identical to flush_tlb_mm(current->mm), perhaps this should be replaced with a #define. I've attached a patch (untested) against 2.3.12-9, Manfred