Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1446368 > unrolled thread

Re: [PATCH 10/10] mm, oom: hide mm which is shared with kthread or global init

Started byMichal Hocko <mhocko@kernel.org>
First post2016-07-19 14:10 +0200
Last post2016-07-20 08:30 +0200
Articles 3 — 2 participants

Back to article view | Back to linux.kernel

This discussion starts older than the indexed window; earlier articles aren't shown. The article labeled Started by below is the oldest one visible, not the original post.


Contents

  Re: [PATCH 10/10] mm, oom: hide mm which is shared with kthread or  global init Michal Hocko <mhocko@kernel.org> - 2016-07-19 14:10 +0200
    Re: [PATCH 10/10] mm, oom: hide mm which is shared with kthread or  global init Andrew Morton <akpm@linux-foundation.org> - 2016-07-20 01:30 +0200
      Re: [PATCH 10/10] mm, oom: hide mm which is shared with kthread or  global init Michal Hocko <mhocko@kernel.org> - 2016-07-20 08:30 +0200

#1446368 — Re: [PATCH 10/10] mm, oom: hide mm which is shared with kthread or global init

FromMichal Hocko <mhocko@kernel.org>
Date2016-07-19 14:10 +0200
SubjectRe: [PATCH 10/10] mm, oom: hide mm which is shared with kthread or global init
Message-ID<rWC0x-3PW-1@gated-at.bofh.it>
Andrew,

On Mon 20-06-16 14:43:48, Michal Hocko wrote:
> From: Michal Hocko <mhocko@suse.com>
> 
> The only case where the oom_reaper is not triggered for the oom victim
> is when it shares the memory with a kernel thread (aka use_mm) or with
> the global init. After "mm, oom: skip vforked tasks from being selected"
> the victim cannot be a vforked task of the global init so we are left
> with clone(CLONE_VM) (without CLONE_SIGHAND). use_mm() users are quite
> rare as well.
> 
> In order to guarantee a forward progress for the OOM killer make
> sure that this really rare cases will not get into the way and hide
> the mm from the oom killer by setting MMF_OOM_REAPED flag for it.
> oom_scan_process_thread will ignore any TIF_MEMDIE task if it has
> MMF_OOM_REAPED flag set to catch these oom victims.
> 
> After this patch we should guarantee a forward progress for the OOM
> killer even when the selected victim is sharing memory with a kernel
> thread or global init.

Could you replace the last two paragraphs with the following. Tetsuo
didn't like the guarantee mentioned there because that is a too strong
statement as find_lock_task_mm might not find any mm and so we still
could end up looping on the oom victim if it gets stuck somewhere in
__mmput. This particular patch didn't aim at closing that case. Plugging
that hole is planned later after the next upcoming merge window closes.

"
In order to help a forward progress for the OOM killer, make sure
that this really rare cases will not get into the way and hide
the mm from the oom killer by setting MMF_OOM_REAPED flag for it.
oom_scan_process_thread will ignore any TIF_MEMDIE task if it has
MMF_OOM_REAPED flag set to catch these oom victims.
		        
After this patch we should guarantee a forward progress for the OOM
killer even when the selected victim is sharing memory with a kernel
thread or global init as long as the victims mm is still alive.
"

> 
> Changes since v1
> - do not exit_oom_victim because oom_scan_process_thread will handle
>   those which couldn't terminate in time. exit_oom_victim is not safe
>   wrt. oom_disable synchronization.
> 
> Acked-by: Oleg Nesterov <oleg@redhat.com>
> Signed-off-by: Michal Hocko <mhocko@suse.com>
> ---
>  mm/oom_kill.c | 25 +++++++++++++++++++++----
>  1 file changed, 21 insertions(+), 4 deletions(-)
> 
> diff --git a/mm/oom_kill.c b/mm/oom_kill.c
> index bfddc93ccd34..4c21f744daa6 100644
> --- a/mm/oom_kill.c
> +++ b/mm/oom_kill.c
> @@ -283,10 +283,22 @@ enum oom_scan_t oom_scan_process_thread(struct oom_control *oc,
>  
>  	/*
>  	 * This task already has access to memory reserves and is being killed.
> -	 * Don't allow any other task to have access to the reserves.
> +	 * Don't allow any other task to have access to the reserves unless
> +	 * the task has MMF_OOM_REAPED because chances that it would release
> +	 * any memory is quite low.
>  	 */
> -	if (!is_sysrq_oom(oc) && atomic_read(&task->signal->oom_victims))
> -		return OOM_SCAN_ABORT;
> +	if (!is_sysrq_oom(oc) && atomic_read(&task->signal->oom_victims)) {
> +		struct task_struct *p = find_lock_task_mm(task);
> +		enum oom_scan_t ret = OOM_SCAN_ABORT;
> +
> +		if (p) {
> +			if (test_bit(MMF_OOM_REAPED, &p->mm->flags))
> +				ret = OOM_SCAN_CONTINUE;
> +			task_unlock(p);
> +		}
> +
> +		return ret;
> +	}
>  
>  	/*
>  	 * If task is allocating a lot of memory and has been marked to be
> @@ -913,9 +925,14 @@ void oom_kill_process(struct oom_control *oc, struct task_struct *p,
>  			/*
>  			 * We cannot use oom_reaper for the mm shared by this
>  			 * process because it wouldn't get killed and so the
> -			 * memory might be still used.
> +			 * memory might be still used. Hide the mm from the oom
> +			 * killer to guarantee OOM forward progress.
>  			 */
>  			can_oom_reap = false;
> +			set_bit(MMF_OOM_REAPED, &mm->flags);
> +			pr_info("oom killer %d (%s) has mm pinned by %d (%s)\n",
> +					task_pid_nr(victim), victim->comm,
> +					task_pid_nr(p), p->comm);
>  			continue;
>  		}
>  		do_send_sig_info(SIGKILL, SEND_SIG_FORCED, p, true);
> -- 
> 2.8.1
> 
> --
> 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>

-- 
Michal Hocko
SUSE Labs

[toc] | [next] | [standalone]


#1446789

FromAndrew Morton <akpm@linux-foundation.org>
Date2016-07-20 01:30 +0200
Message-ID<rWMCC-1Wj-17@gated-at.bofh.it>
In reply to#1446368
On Tue, 19 Jul 2016 14:05:39 +0200 Michal Hocko <mhocko@kernel.org> wrote:

> > After this patch we should guarantee a forward progress for the OOM
> > killer even when the selected victim is sharing memory with a kernel
> > thread or global init.
> 
> Could you replace the last two paragraphs with the following. Tetsuo
> didn't like the guarantee mentioned there because that is a too strong
> statement as find_lock_task_mm might not find any mm and so we still
> could end up looping on the oom victim if it gets stuck somewhere in
> __mmput. This particular patch didn't aim at closing that case. Plugging
> that hole is planned later after the next upcoming merge window closes.
> 
> "
> In order to help a forward progress for the OOM killer, make sure
> that this really rare cases will not get into the way and hide
> the mm from the oom killer by setting MMF_OOM_REAPED flag for it.
> oom_scan_process_thread will ignore any TIF_MEMDIE task if it has
> MMF_OOM_REAPED flag set to catch these oom victims.
> 		        
> After this patch we should guarantee a forward progress for the OOM
> killer even when the selected victim is sharing memory with a kernel
> thread or global init as long as the victims mm is still alive.
> "

I tweaked it a bit:

: In order to help forward progress for the OOM killer, make sure that
: this really rare case will not get in the way - we do this by hiding
: the mm from the oom killer by setting MMF_OOM_REAPED flag for it. 
: oom_scan_process_thread will ignore any TIF_MEMDIE task if it has
: MMF_OOM_REAPED flag set to catch these oom victims.
: 
: After this patch we should guarantee forward progress for the OOM
: killer even when the selected victim is sharing memory with a kernel
: thread or global init as long as the victims mm is still alive.

[toc] | [prev] | [next] | [standalone]


#1447011

FromMichal Hocko <mhocko@kernel.org>
Date2016-07-20 08:30 +0200
Message-ID<rWTb3-6fy-1@gated-at.bofh.it>
In reply to#1446789
On Tue 19-07-16 16:27:59, Andrew Morton wrote:
> On Tue, 19 Jul 2016 14:05:39 +0200 Michal Hocko <mhocko@kernel.org> wrote:
> 
> > > After this patch we should guarantee a forward progress for the OOM
> > > killer even when the selected victim is sharing memory with a kernel
> > > thread or global init.
> > 
> > Could you replace the last two paragraphs with the following. Tetsuo
> > didn't like the guarantee mentioned there because that is a too strong
> > statement as find_lock_task_mm might not find any mm and so we still
> > could end up looping on the oom victim if it gets stuck somewhere in
> > __mmput. This particular patch didn't aim at closing that case. Plugging
> > that hole is planned later after the next upcoming merge window closes.
> > 
> > "
> > In order to help a forward progress for the OOM killer, make sure
> > that this really rare cases will not get into the way and hide
> > the mm from the oom killer by setting MMF_OOM_REAPED flag for it.
> > oom_scan_process_thread will ignore any TIF_MEMDIE task if it has
> > MMF_OOM_REAPED flag set to catch these oom victims.
> > 		        
> > After this patch we should guarantee a forward progress for the OOM
> > killer even when the selected victim is sharing memory with a kernel
> > thread or global init as long as the victims mm is still alive.
> > "
> 
> I tweaked it a bit:
> 
> : In order to help forward progress for the OOM killer, make sure that
> : this really rare case will not get in the way - we do this by hiding
> : the mm from the oom killer by setting MMF_OOM_REAPED flag for it. 
> : oom_scan_process_thread will ignore any TIF_MEMDIE task if it has
> : MMF_OOM_REAPED flag set to catch these oom victims.
> : 
> : After this patch we should guarantee forward progress for the OOM
> : killer even when the selected victim is sharing memory with a kernel
> : thread or global init as long as the victims mm is still alive.

Sounds good to me. Thanks!

-- 
Michal Hocko
SUSE Labs

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web