linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
From: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
To: Michal Hocko <mhocko@kernel.org>
Cc: Tetsuo Handa <penguin-kernel@i-love.sakura.ne.jp>,
	David Rientjes <rientjes@google.com>,
	linux-mm@kvack.org, Andrew Morton <akpm@linux-foundation.org>,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH] mm,oom: Bring OOM notifier callbacks to outside of OOM killer.
Date: Tue, 3 Jul 2018 09:01:01 -0700	[thread overview]
Message-ID: <20180703160101.GC3593@linux.vnet.ibm.com> (raw)
In-Reply-To: <20180703072413.GD16767@dhcp22.suse.cz>

On Tue, Jul 03, 2018 at 09:24:13AM +0200, Michal Hocko wrote:
> On Mon 02-07-18 14:37:14, Paul E. McKenney wrote:
> [...]
> > commit d2b8d16b97ac2859919713b2d98b8a3ad22943a2
> > Author: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
> > Date:   Mon Jul 2 14:30:37 2018 -0700
> > 
> >     rcu: Remove OOM code
> >     
> >     There is reason to believe that RCU's OOM code isn't really helping
> >     that much, given that the best it can hope to do is accelerate invoking
> >     callbacks by a few seconds, and even then only if some CPUs have no
> >     non-lazy callbacks, a condition that has been observed to be rare.
> >     This commit therefore removes RCU's OOM code.  If this causes problems,
> >     it can easily be reinserted.
> >     
> >     Reported-by: Michal Hocko <mhocko@kernel.org>
> >     Reported-by: Tetsuo Handa <penguin-kernel@i-love.sakura.ne.jp>
> >     Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
> 
> I would also note that waiting in the notifier might be a problem on its
> own because we are holding the oom_lock and the system cannot trigger
> the OOM killer while we are holding it and waiting for oom_callback_wq
> event. I am not familiar with the code to tell whether this can deadlock
> but from a quick glance I _suspect_ that we might depend on __rcu_reclaim
> and basically an arbitrary callback so no good.
> 
> Acked-by: Michal Hocko <mhocko@suse.com>
> 
> Thanks!

Like this?

							Thanx, Paul

------------------------------------------------------------------------

commit d3cf56333af5e65054f533f6f271a7bd36b868f4
Author: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Date:   Mon Jul 2 14:30:37 2018 -0700

    rcu: Remove OOM code
    
    There is reason to believe that RCU's OOM code isn't really helping
    that much, given that the best it can hope to do is accelerate invoking
    callbacks by a few seconds, and even then only if some CPUs have no
    non-lazy callbacks, a condition that has been observed to be rare.
    In addition, it can block on the oom_callback_wq wait queue, which could
    delay more urgent and productive OOM actions.  This commit therefore
    removes RCU's OOM code.  If this causes problems, this commit can easily
    be reverted.
    
    Reported-by: Michal Hocko <mhocko@kernel.org>
    Reported-by: Tetsuo Handa <penguin-kernel@i-love.sakura.ne.jp>
    Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
    Acked-by: Michal Hocko <mhocko@suse.com>

diff --git a/kernel/rcu/tree_plugin.h b/kernel/rcu/tree_plugin.h
index 3f3796b10c71..3d7ce73e7309 100644
--- a/kernel/rcu/tree_plugin.h
+++ b/kernel/rcu/tree_plugin.h
@@ -1722,87 +1722,6 @@ static void rcu_idle_count_callbacks_posted(void)
 	__this_cpu_add(rcu_dynticks.nonlazy_posted, 1);
 }
 
-/*
- * Data for flushing lazy RCU callbacks at OOM time.
- */
-static atomic_t oom_callback_count;
-static DECLARE_WAIT_QUEUE_HEAD(oom_callback_wq);
-
-/*
- * RCU OOM callback -- decrement the outstanding count and deliver the
- * wake-up if we are the last one.
- */
-static void rcu_oom_callback(struct rcu_head *rhp)
-{
-	if (atomic_dec_and_test(&oom_callback_count))
-		wake_up(&oom_callback_wq);
-}
-
-/*
- * Post an rcu_oom_notify callback on the current CPU if it has at
- * least one lazy callback.  This will unnecessarily post callbacks
- * to CPUs that already have a non-lazy callback at the end of their
- * callback list, but this is an infrequent operation, so accept some
- * extra overhead to keep things simple.
- */
-static void rcu_oom_notify_cpu(void *unused)
-{
-	struct rcu_state *rsp;
-	struct rcu_data *rdp;
-
-	for_each_rcu_flavor(rsp) {
-		rdp = raw_cpu_ptr(rsp->rda);
-		if (rcu_segcblist_n_lazy_cbs(&rdp->cblist)) {
-			atomic_inc(&oom_callback_count);
-			rsp->call(&rdp->oom_head, rcu_oom_callback);
-		}
-	}
-}
-
-/*
- * If low on memory, ensure that each CPU has a non-lazy callback.
- * This will wake up CPUs that have only lazy callbacks, in turn
- * ensuring that they free up the corresponding memory in a timely manner.
- * Because an uncertain amount of memory will be freed in some uncertain
- * timeframe, we do not claim to have freed anything.
- */
-static int rcu_oom_notify(struct notifier_block *self,
-			  unsigned long notused, void *nfreed)
-{
-	int cpu;
-
-	/* Wait for callbacks from earlier instance to complete. */
-	wait_event(oom_callback_wq, atomic_read(&oom_callback_count) == 0);
-	smp_mb(); /* Ensure callback reuse happens after callback invocation. */
-
-	/*
-	 * Prevent premature wakeup: ensure that all increments happen
-	 * before there is a chance of the counter reaching zero.
-	 */
-	atomic_set(&oom_callback_count, 1);
-
-	for_each_online_cpu(cpu) {
-		smp_call_function_single(cpu, rcu_oom_notify_cpu, NULL, 1);
-		cond_resched_tasks_rcu_qs();
-	}
-
-	/* Unconditionally decrement: no need to wake ourselves up. */
-	atomic_dec(&oom_callback_count);
-
-	return NOTIFY_OK;
-}
-
-static struct notifier_block rcu_oom_nb = {
-	.notifier_call = rcu_oom_notify
-};
-
-static int __init rcu_register_oom_notifier(void)
-{
-	register_oom_notifier(&rcu_oom_nb);
-	return 0;
-}
-early_initcall(rcu_register_oom_notifier);
-
 #endif /* #else #if !defined(CONFIG_RCU_FAST_NO_HZ) */
 
 #ifdef CONFIG_RCU_FAST_NO_HZ

  reply	other threads:[~2018-07-03 15:58 UTC|newest]

Thread overview: 34+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-06-20 11:20 [PATCH] mm,oom: Bring OOM notifier callbacks to outside of OOM killer Tetsuo Handa
2018-06-20 11:55 ` Michal Hocko
2018-06-20 12:21   ` Tetsuo Handa
2018-06-20 13:07     ` Michal Hocko
2018-06-25 13:03   ` peter enderborg
2018-06-25 13:07     ` Michal Hocko
2018-06-25 14:02       ` peter enderborg
2018-06-25 14:04       ` peter enderborg
2018-06-25 14:12         ` Michal Hocko
2018-06-20 22:36 ` David Rientjes
2018-06-21  7:31   ` Michal Hocko
2018-06-21 11:27     ` Tetsuo Handa
2018-06-21 12:05       ` Michal Hocko
2018-06-26 17:03       ` Paul E. McKenney
2018-06-26 20:10         ` Tetsuo Handa
2018-06-26 23:50           ` Paul E. McKenney
2018-06-27 10:52             ` Tetsuo Handa
2018-06-27 14:28               ` Paul E. McKenney
2018-06-27  7:22         ` Michal Hocko
2018-06-27 14:31           ` Paul E. McKenney
2018-06-28 11:39             ` Michal Hocko
2018-06-28 21:31               ` Paul E. McKenney
2018-06-29  9:04                 ` Michal Hocko
2018-06-29 12:52                   ` Paul E. McKenney
2018-06-29 13:26                     ` Michal Hocko
2018-06-30 17:05                       ` Paul E. McKenney
2018-07-02 12:00                         ` Michal Hocko
2018-07-02 21:37                         ` Paul E. McKenney
2018-07-03  7:24                           ` Michal Hocko
2018-07-03 16:01                             ` Paul E. McKenney [this message]
2018-07-06  5:39                               ` Michal Hocko
2018-07-06 12:22                                 ` Paul E. McKenney
2018-06-29 14:35                     ` Tetsuo Handa
2018-06-30 17:19                       ` Paul E. McKenney

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=20180703160101.GC3593@linux.vnet.ibm.com \
    --to=paulmck@linux.vnet.ibm.com \
    --cc=akpm@linux-foundation.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=mhocko@kernel.org \
    --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: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).