On Wed, Apr 14, 2021 at 07:09:15PM +0200, Oleg Nesterov wrote: > 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... I agree. > > And does it really need the "prev_mm" argument? It must be tsk->mm, no? No, it doesn't. It is leftover of unuse_mm. BTW why do we pass mm to kthread_unuse_mm? Thanks, Andrei.