From: Michal Hocko <mhocko@kernel.org> To: David Rientjes <rientjes@google.com> Cc: linux-mm@kvack.org, Tetsuo Handa <penguin-kernel@i-love.sakura.ne.jp>, Oleg Nesterov <oleg@redhat.com>, Andrea Argangeli <andrea@kernel.org>, Andrew Morton <akpm@linux-foundation.org>, LKML <linux-kernel@vger.kernel.org> Subject: Re: [RFC PATCH] mm, oom: allow oom reaper to race with exit_mmap Date: Tue, 11 Jul 2017 08:58:34 +0200 [thread overview] Message-ID: <20170711065834.GF24852@dhcp22.suse.cz> (raw) In-Reply-To: <alpine.DEB.2.10.1707101652260.54972@chino.kir.corp.google.com> On Mon 10-07-17 16:55:22, David Rientjes wrote: > On Mon, 26 Jun 2017, Michal Hocko wrote: > > > diff --git a/mm/mmap.c b/mm/mmap.c > > index 3bd5ecd20d4d..253808e716dc 100644 > > --- a/mm/mmap.c > > +++ b/mm/mmap.c > > @@ -2962,6 +2962,11 @@ void exit_mmap(struct mm_struct *mm) > > /* Use -1 here to ensure all VMAs in the mm are unmapped */ > > unmap_vmas(&tlb, vma, 0, -1); > > > > + /* > > + * oom reaper might race with exit_mmap so make sure we won't free > > + * page tables or unmap VMAs under its feet > > + */ > > + down_write(&mm->mmap_sem); > > free_pgtables(&tlb, vma, FIRST_USER_ADDRESS, USER_PGTABLES_CEILING); > > tlb_finish_mmu(&tlb, 0, -1); > > > > @@ -2974,7 +2979,9 @@ void exit_mmap(struct mm_struct *mm) > > nr_accounted += vma_pages(vma); > > vma = remove_vma(vma); > > } > > + mm->mmap = NULL; > > vm_unacct_memory(nr_accounted); > > + up_write(&mm->mmap_sem); > > } > > > > /* Insert vm structure into process list sorted by address > > diff --git a/mm/oom_kill.c b/mm/oom_kill.c > > index 0e2c925e7826..5dc0ff22d567 100644 > > --- a/mm/oom_kill.c > > +++ b/mm/oom_kill.c > > @@ -472,36 +472,8 @@ static bool __oom_reap_task_mm(struct task_struct *tsk, struct mm_struct *mm) > > struct vm_area_struct *vma; > > bool ret = true; > > > > - /* > > - * We have to make sure to not race with the victim exit path > > - * and cause premature new oom victim selection: > > - * __oom_reap_task_mm exit_mm > > - * mmget_not_zero > > - * mmput > > - * atomic_dec_and_test > > - * exit_oom_victim > > - * [...] > > - * out_of_memory > > - * select_bad_process > > - * # no TIF_MEMDIE task selects new victim > > - * unmap_page_range # frees some memory > > - */ > > - mutex_lock(&oom_lock); > > - > > - if (!down_read_trylock(&mm->mmap_sem)) { > > - ret = false; > > - goto unlock_oom; > > - } > > - > > - /* > > - * increase mm_users only after we know we will reap something so > > - * that the mmput_async is called only when we have reaped something > > - * and delayed __mmput doesn't matter that much > > - */ > > - if (!mmget_not_zero(mm)) { > > - up_read(&mm->mmap_sem); > > - goto unlock_oom; > > - } > > + if (!down_read_trylock(&mm->mmap_sem)) > > + return false; > > I think this should return true if mm->mmap == NULL here. This? --- diff --git a/mm/oom_kill.c b/mm/oom_kill.c index 5dc0ff22d567..e155d1d8064f 100644 --- a/mm/oom_kill.c +++ b/mm/oom_kill.c @@ -470,11 +470,14 @@ static bool __oom_reap_task_mm(struct task_struct *tsk, struct mm_struct *mm) { struct mmu_gather tlb; struct vm_area_struct *vma; - bool ret = true; if (!down_read_trylock(&mm->mmap_sem)) return false; + /* There is nothing to reap so bail out without signs in the log */ + if (!mm->mmap) + goto unlock; + /* * Tell all users of get_user/copy_from_user etc... that the content * is no longer stable. No barriers really needed because unmapping @@ -508,9 +511,10 @@ static bool __oom_reap_task_mm(struct task_struct *tsk, struct mm_struct *mm) K(get_mm_counter(mm, MM_ANONPAGES)), K(get_mm_counter(mm, MM_FILEPAGES)), K(get_mm_counter(mm, MM_SHMEMPAGES))); +unlock: up_read(&mm->mmap_sem); - return ret; + return true; } #define MAX_OOM_REAP_RETRIES 10 -- Michal Hocko SUSE Labs
WARNING: multiple messages have this Message-ID (diff)
From: Michal Hocko <mhocko@kernel.org> To: David Rientjes <rientjes@google.com> Cc: linux-mm@kvack.org, Tetsuo Handa <penguin-kernel@i-love.sakura.ne.jp>, Oleg Nesterov <oleg@redhat.com>, Andrea Argangeli <andrea@kernel.org>, Andrew Morton <akpm@linux-foundation.org>, LKML <linux-kernel@vger.kernel.org> Subject: Re: [RFC PATCH] mm, oom: allow oom reaper to race with exit_mmap Date: Tue, 11 Jul 2017 08:58:34 +0200 [thread overview] Message-ID: <20170711065834.GF24852@dhcp22.suse.cz> (raw) In-Reply-To: <alpine.DEB.2.10.1707101652260.54972@chino.kir.corp.google.com> On Mon 10-07-17 16:55:22, David Rientjes wrote: > On Mon, 26 Jun 2017, Michal Hocko wrote: > > > diff --git a/mm/mmap.c b/mm/mmap.c > > index 3bd5ecd20d4d..253808e716dc 100644 > > --- a/mm/mmap.c > > +++ b/mm/mmap.c > > @@ -2962,6 +2962,11 @@ void exit_mmap(struct mm_struct *mm) > > /* Use -1 here to ensure all VMAs in the mm are unmapped */ > > unmap_vmas(&tlb, vma, 0, -1); > > > > + /* > > + * oom reaper might race with exit_mmap so make sure we won't free > > + * page tables or unmap VMAs under its feet > > + */ > > + down_write(&mm->mmap_sem); > > free_pgtables(&tlb, vma, FIRST_USER_ADDRESS, USER_PGTABLES_CEILING); > > tlb_finish_mmu(&tlb, 0, -1); > > > > @@ -2974,7 +2979,9 @@ void exit_mmap(struct mm_struct *mm) > > nr_accounted += vma_pages(vma); > > vma = remove_vma(vma); > > } > > + mm->mmap = NULL; > > vm_unacct_memory(nr_accounted); > > + up_write(&mm->mmap_sem); > > } > > > > /* Insert vm structure into process list sorted by address > > diff --git a/mm/oom_kill.c b/mm/oom_kill.c > > index 0e2c925e7826..5dc0ff22d567 100644 > > --- a/mm/oom_kill.c > > +++ b/mm/oom_kill.c > > @@ -472,36 +472,8 @@ static bool __oom_reap_task_mm(struct task_struct *tsk, struct mm_struct *mm) > > struct vm_area_struct *vma; > > bool ret = true; > > > > - /* > > - * We have to make sure to not race with the victim exit path > > - * and cause premature new oom victim selection: > > - * __oom_reap_task_mm exit_mm > > - * mmget_not_zero > > - * mmput > > - * atomic_dec_and_test > > - * exit_oom_victim > > - * [...] > > - * out_of_memory > > - * select_bad_process > > - * # no TIF_MEMDIE task selects new victim > > - * unmap_page_range # frees some memory > > - */ > > - mutex_lock(&oom_lock); > > - > > - if (!down_read_trylock(&mm->mmap_sem)) { > > - ret = false; > > - goto unlock_oom; > > - } > > - > > - /* > > - * increase mm_users only after we know we will reap something so > > - * that the mmput_async is called only when we have reaped something > > - * and delayed __mmput doesn't matter that much > > - */ > > - if (!mmget_not_zero(mm)) { > > - up_read(&mm->mmap_sem); > > - goto unlock_oom; > > - } > > + if (!down_read_trylock(&mm->mmap_sem)) > > + return false; > > I think this should return true if mm->mmap == NULL here. This? --- diff --git a/mm/oom_kill.c b/mm/oom_kill.c index 5dc0ff22d567..e155d1d8064f 100644 --- a/mm/oom_kill.c +++ b/mm/oom_kill.c @@ -470,11 +470,14 @@ static bool __oom_reap_task_mm(struct task_struct *tsk, struct mm_struct *mm) { struct mmu_gather tlb; struct vm_area_struct *vma; - bool ret = true; if (!down_read_trylock(&mm->mmap_sem)) return false; + /* There is nothing to reap so bail out without signs in the log */ + if (!mm->mmap) + goto unlock; + /* * Tell all users of get_user/copy_from_user etc... that the content * is no longer stable. No barriers really needed because unmapping @@ -508,9 +511,10 @@ static bool __oom_reap_task_mm(struct task_struct *tsk, struct mm_struct *mm) K(get_mm_counter(mm, MM_ANONPAGES)), K(get_mm_counter(mm, MM_FILEPAGES)), K(get_mm_counter(mm, MM_SHMEMPAGES))); +unlock: up_read(&mm->mmap_sem); - return ret; + return true; } #define MAX_OOM_REAP_RETRIES 10 -- Michal Hocko SUSE Labs -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
next prev parent reply other threads:[~2017-07-11 6:58 UTC|newest] Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top 2017-06-26 13:03 [RFC PATCH] mm, oom: allow oom reaper to race with exit_mmap Michal Hocko 2017-06-26 13:03 ` Michal Hocko 2017-06-27 10:52 ` Tetsuo Handa 2017-06-27 10:52 ` Tetsuo Handa 2017-06-27 11:26 ` Michal Hocko 2017-06-27 11:26 ` Michal Hocko 2017-06-27 11:39 ` Tetsuo Handa 2017-06-27 11:39 ` Tetsuo Handa 2017-06-27 12:03 ` Michal Hocko 2017-06-27 12:03 ` Michal Hocko 2017-06-27 13:31 ` Tetsuo Handa 2017-06-27 13:31 ` Tetsuo Handa 2017-06-27 13:55 ` Michal Hocko 2017-06-27 13:55 ` Michal Hocko 2017-06-27 14:26 ` Tetsuo Handa 2017-06-27 14:26 ` Tetsuo Handa 2017-06-27 14:41 ` Michal Hocko 2017-06-27 14:41 ` Michal Hocko 2017-07-11 0:01 ` David Rientjes 2017-07-11 0:01 ` David Rientjes 2017-06-29 8:46 ` Michal Hocko 2017-06-29 8:46 ` Michal Hocko 2017-07-19 5:55 ` Michal Hocko 2017-07-19 5:55 ` Michal Hocko 2017-07-20 1:18 ` Hugh Dickins 2017-07-20 1:18 ` Hugh Dickins 2017-07-20 13:05 ` Michal Hocko 2017-07-20 13:05 ` Michal Hocko 2017-07-24 6:39 ` Hugh Dickins 2017-07-24 6:39 ` Hugh Dickins 2017-07-10 23:55 ` David Rientjes 2017-07-10 23:55 ` David Rientjes 2017-07-11 6:58 ` Michal Hocko [this message] 2017-07-11 6:58 ` Michal Hocko 2017-07-11 20:40 ` David Rientjes 2017-07-11 20:40 ` David Rientjes 2017-07-12 7:12 ` Michal Hocko 2017-07-12 7:12 ` Michal Hocko
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20170711065834.GF24852@dhcp22.suse.cz \ --to=mhocko@kernel.org \ --cc=akpm@linux-foundation.org \ --cc=andrea@kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-mm@kvack.org \ --cc=oleg@redhat.com \ --cc=penguin-kernel@i-love.sakura.ne.jp \ --cc=rientjes@google.com \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.