actually, i think the correct approach is to remove the TLB flushing and
perhaps to check that the old pte is not present. Do we ever _change_
mappings via __set_fixmap()? I think we only ever install them.
but if we ever change them somewhere then the correct approach is to do
a flush_tlb_all(). It's not just about preemption but about the fact
that we modified the kernel address space and we must propagate that to
all CPUs.
the vmalloc() backtrace you sent - how did set_pte_pfn() get into that
codepath - vmalloc shouldnt be using __set_fixmap().
Ingo
--