On Fri 20-05-16 10:30:53, Minchan Kim wrote: > Forking new thread because my comment is not related to this patch's > purpose but found a thing during reading this patch. > > On Tue, Apr 26, 2016 at 04:04:30PM +0200, Michal Hocko wrote: > > From: Michal Hocko <mhocko@xxxxxxxx> > > > > Tetsuo has properly noted that mmput slow path might get blocked waiting > > for another party (e.g. exit_aio waits for an IO). If that happens the > > oom_reaper would be put out of the way and will not be able to process > > next oom victim. We should strive for making this context as reliable > > and independent on other subsystems as much as possible. > > > > Introduce mmput_async which will perform the slow path from an async > > (WQ) context. This will delay the operation but that shouldn't be a > > problem because the oom_reaper has reclaimed the victim's address space > > for most cases as much as possible and the remaining context shouldn't > > bind too much memory anymore. The only exception is when mmap_sem > > trylock has failed which shouldn't happen too often. > > > > The issue is only theoretical but not impossible. > > The mmput_async is used for only OOM reaper which is enabled on CONFIG_MMU. > So until someone who want to use mmput_async in !CONFIG_MMU come out, > we could save sizeof(struct work_struct) per mm in !CONFIG_MMU. You are right. What about the following? --- >From 8f8a34bf00882bfc0b557ed79e0e9e956ac9d217 Mon Sep 17 00:00:00 2001 From: Michal Hocko <mhocko@xxxxxxxx> Date: Fri, 20 May 2016 08:14:39 +0200 Subject: [PATCH] mmotm: mm-oom_reaper-do-not-mmput-synchronously-from-the-oom-reaper-context-fix mmput_async is currently used only from the oom_reaper which is defined only for CONFIG_MMU. We can save work_struct in mm_struct for !CONFIG_MMU. Reported-by: Minchan Kim <minchan@xxxxxxxxxx> Signed-off-by: Michal Hocko <mhocko@xxxxxxxx> --- include/linux/mm_types.h | 2 ++ include/linux/sched.h | 2 ++ kernel/fork.c | 2 ++ 3 files changed, 6 insertions(+) diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h index ab142ace96f3..a16dcb2efca4 100644 --- a/include/linux/mm_types.h +++ b/include/linux/mm_types.h @@ -514,7 +514,9 @@ struct mm_struct { #ifdef CONFIG_HUGETLB_PAGE atomic_long_t hugetlb_usage; #endif +#ifdef CONFIG_MMU struct work_struct async_put_work; +#endif }; static inline void mm_init_cpumask(struct mm_struct *mm) diff --git a/include/linux/sched.h b/include/linux/sched.h index df8778e72211..11b31ded65cf 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -2604,10 +2604,12 @@ static inline void mmdrop(struct mm_struct * mm) /* mmput gets rid of the mappings and all user-space */ extern void mmput(struct mm_struct *); +#ifdef CONFIG_MMU /* same as above but performs the slow path from the async kontext. Can * be called from the atomic context as well */ extern void mmput_async(struct mm_struct *); +#endif /* Grab a reference to a task's mm, if it is not already going away */ extern struct mm_struct *get_task_mm(struct task_struct *task); diff --git a/kernel/fork.c b/kernel/fork.c index e1dc6b02ac8b..1e3dc3af6845 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -732,6 +732,7 @@ void mmput(struct mm_struct *mm) } EXPORT_SYMBOL_GPL(mmput); +#ifdef CONFIG_MMU static void mmput_async_fn(struct work_struct *work) { struct mm_struct *mm = container_of(work, struct mm_struct, async_put_work); @@ -745,6 +746,7 @@ void mmput_async(struct mm_struct *mm) schedule_work(&mm->async_put_work); } } +#endif /** * set_mm_exe_file - change a reference to the mm's executable file -- 2.8.1 -- Michal Hocko SUSE Labs -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>