On Mon, 2019-07-29 at 17:42 -0400, Waiman Long wrote: > What I have found is that a long running process on a mostly idle > system > with many CPUs is likely to cycle through a lot of the CPUs during > its > lifetime and leave behind its mm in the active_mm of those CPUs. My > 2-socket test system have 96 logical CPUs. After running the test > program for a minute or so, it leaves behind its mm in about half of > the > CPUs with a mm_count of 45 after exit. So the dying mm will stay > until > all those 45 CPUs get new user tasks to run. OK. On what kernel are you seeing this? On current upstream, the code in native_flush_tlb_others() will send a TLB flush to every CPU in mm_cpumask() if page table pages have been freed. That should cause the lazy TLB CPUs to switch to init_mm when the exit->zap_page_range path gets to the point where it frees page tables. > > If it is only on the CPU where the task is exiting, > > would the TASK_DEAD handling in finish_task_switch() > > be a better place to handle this? > > I need to switch the mm off the dying one. mm switching is only done > in > context_switch(). I don't think finish_task_switch() is the right > place. mm switching is also done in flush_tlb_func_common, if the CPU received a TLB shootdown IPI while in lazy TLB mode. -- All Rights Reversed.
Attachment:
signature.asc
Description: This is a digitally signed message part