On 04/13, Andrei Vagin wrote: > > +static void swap_mm(struct mm_struct *prev_mm, struct mm_struct *target_mm) > +{ > + struct task_struct *tsk = current; > + struct mm_struct *active_mm; > + > + task_lock(tsk); > + /* Hold off tlb flush IPIs while switching mm's */ > + local_irq_disable(); > + > + sync_mm_rss(prev_mm); > + > + vmacache_flush(tsk); > + > + active_mm = tsk->active_mm; > + if (active_mm != target_mm) { > + mmgrab(target_mm); > + tsk->active_mm = target_mm; > + } > + tsk->mm = target_mm; > + switch_mm_irqs_off(active_mm, target_mm, tsk); > + local_irq_enable(); > + task_unlock(tsk); > +#ifdef finish_arch_post_lock_switch > + finish_arch_post_lock_switch(); > +#endif > + > + if (active_mm != target_mm) > + mmdrop(active_mm); > +} I think this should be unified with kthread_use_mm() somehow... And does it really need the "prev_mm" argument? It must be tsk->mm, no? Oleg.