Kees Cook <keescook@xxxxxxxxxxxx> writes: > $ git grep exec_mm_release > fs/exec.c: exec_mm_release(tsk, old_mm); > include/linux/sched/mm.h:extern void exec_mm_release(struct task_struct *, struct mm_struct *); > kernel/fork.c:void exec_mm_release(struct task_struct *tsk, struct mm_struct *mm) > > kernel/fork.c: > > void exit_mm_release(struct task_struct *tsk, struct mm_struct *mm) > { > futex_exit_release(tsk); > mm_release(tsk, mm); > } > > void exec_mm_release(struct task_struct *tsk, struct mm_struct *mm) > { > futex_exec_release(tsk); > mm_release(tsk, mm); > } > > $ git grep exit_mm_release > include/linux/sched/mm.h:extern void exit_mm_release(struct task_struct *, struct mm_struct *); > kernel/exit.c: exit_mm_release(current, mm); > kernel/fork.c:void exit_mm_release(struct task_struct *tsk, struct mm_struct *mm) > > kernel/exit.c: > > exit_mm_release(current, mm); > if (!mm) > return; > sync_mm_rss(mm); > > It looks to me like both exec_mm_release() and exit_mm_release() could > easily have the sync_mm_rss(...) folded into their function bodies and > removed from the callers. *shrug* Well it would have to be all of: if (mm) sync_mm_rss(mm); I remember reading through exit_mm_release and seeing that nothing actually depended upon a non-NULL mm. Unless you have clear_child_tid set. I am not up to speed on that part of the mm layer right now to know if it is a good idea to put sync_mm_rss in exit_mm_release but at a quick look it feels like it. Eric