All of lore.kernel.org
 help / color / mirror / Atom feed
From: Michal Hocko <mhocko@suse.com>
To: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
Cc: akpm@linux-foundation.org, linux-mm@kvack.org,
	xiyou.wangcong@gmail.com, dave.hansen@intel.com,
	hannes@cmpxchg.org, mgorman@suse.de, vbabka@suse.cz,
	sergey.senozhatsky.work@gmail.com, pmladek@suse.com
Subject: Re: [PATCH] mm,page_alloc: Serialize warn_alloc() if schedulable.
Date: Wed, 12 Jul 2017 14:41:45 +0200	[thread overview]
Message-ID: <20170712124145.GI28912@dhcp22.suse.cz> (raw)
In-Reply-To: <201707122123.CDD21817.FOQSFJtOHOVLFM@I-love.SAKURA.ne.jp>

On Wed 12-07-17 21:23:05, Tetsuo Handa wrote:
> Michal Hocko wrote:
> > On Wed 12-07-17 07:06:11, Tetsuo Handa wrote:
> > > Michal Hocko wrote:
> > > > On Tue 11-07-17 22:10:36, Tetsuo Handa wrote:
> > > > > Michal Hocko wrote:
> > [...]
> > > > > > warn_alloc is just yet-another-user of printk. We might have many
> > > > > > others...
> > > > >
> > > > > warn_alloc() is different from other users of printk() that printk() is called
> > > > > as long as oom_lock is already held by somebody else processing console_unlock().
> > > >
> > > > So what exactly prevents any other caller of printk interfering while
> > > > the oom is ongoing?
> > >
> > > Other callers of printk() are not doing silly things like "while(1) printk();".
> >
> > They can still print a lot. There have been reports of one printk source
> > pushing an unrelated context to print way too much.
> 
> Which source is that?
> 
> Legitimate printk() users might do
> 
>   for (i = 0; i < 1000; i++)
>     printk();
> 
> but they do not do
> 
>   while (1)
>     for (i = 0; i < 1000; i++)
>       printk();
> 
> .
> 
> >
> > > They don't call printk() until something completes (e.g. some operation returned
> > > an error code) or they do throttling. Only watchdog calls printk() without waiting
> > > for something to complete (because watchdog is there in order to warn that something
> > > might be wrong). But watchdog is calling printk() carefully not to cause flooding
> > > (e.g. khungtaskd sleeps enough) and not to cause lockups (e.g. khungtaskd calls
> > > rcu_lock_break()).
> >
> > Look at hard/soft lockup detector and how it can cause flood of printks.
> 
> Lockup detector is legitimate because it is there to warn that somebody is
> continuously consuming CPU time. Lockup detector might do

Sigh. What I've tried to convey is that the lockup detector can print _a
lot_ (just consider a large machine with hundreds of CPUs and trying to
dump stack trace on each of them....) and that might mimic a herd of
printks from allocation stalls...
[...]
> > warn_alloc prints a single line + dump_stack for each stalling allocation and
> > show_mem once per second. That doesn't sound overly crazy to me.
> > Sure we can have many stalling tasks under certain conditions (most of
> > them quite unrealistic) and then we can print a lot. I do not see an
> > easy way out of it without losing information about stalls and I guess
> > we want to know about them otherwise we will have much harder time to
> > debug stalls.
> 
> Printing just one line per every second can lead to lockup, for
> the condition to escape the "for (;;)" loop in console_unlock() is
> 
>                 if (console_seq == log_next_seq)
>                         break;

Then something is really broken in that condition, don't you think?
Peter has already mentioned that offloading to a different context seems
like the way to go here.

> when cond_resched() in that loop slept for more than one second due to
> SCHED_IDLE priority.
> 
> Currently preempt_disable()/preempt_enable_no_resched() (or equivalent)
> is the only available countermeasure for minimizing interference like
> 
>     for (i = 0; i < 1000; i++)
>       printk();
> 
> . If prink() allows per printk context (shown below) flag which allows printk()
> users to force printk() not to try to print immediately (i.e. declare that
> use deferred printing (maybe offloaded to the printk-kthread)), lockups by
> cond_resched() from console_unlock() from printk() from out_of_memory() will be
> avoided.

As I've said earlier, if there is no other way to make printk work without all
these nasty side effected then I would be OK to add a printk context
specific calls into the oom killer.

Removing the rest because this is again getting largely tangent. The
primary problem you are seeing is that we stumble over printk here.
Unless I can see a sound argument this is not the case it doesn't make
any sense to discuss allocator changes.

[...]
-- 
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>

  reply	other threads:[~2017-07-12 12:41 UTC|newest]

Thread overview: 43+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-06-01 11:43 [PATCH] mm,page_alloc: Serialize warn_alloc() if schedulable Tetsuo Handa
2017-06-01 11:59 ` Michal Hocko
2017-06-01 13:11   ` Tetsuo Handa
2017-06-01 13:28     ` Michal Hocko
2017-06-01 22:10       ` Andrew Morton
2017-06-02  7:18         ` Michal Hocko
2017-06-02 11:13           ` Tetsuo Handa
2017-06-02 12:15             ` Michal Hocko
2017-06-02 17:13               ` Tetsuo Handa
2017-06-02 21:57             ` Cong Wang
2017-06-04  8:58               ` Tetsuo Handa
2017-06-04 15:05                 ` Michal Hocko
2017-06-04 21:43                   ` Tetsuo Handa
2017-06-05  5:37                     ` Michal Hocko
2017-06-05 18:15                       ` Cong Wang
2017-06-06  9:17                         ` Michal Hocko
2017-06-05 18:25                 ` Cong Wang
2017-06-22 10:35                   ` Tetsuo Handa
2017-06-22 22:53                     ` Cong Wang
2017-06-02 16:59           ` Cong Wang
2017-06-02 19:59           ` Andrew Morton
2017-06-03  2:57             ` Tetsuo Handa
2017-06-03  7:32             ` Michal Hocko
2017-06-03  8:36               ` Tetsuo Handa
2017-06-05  7:10                 ` Sergey Senozhatsky
2017-06-05  9:36                   ` Sergey Senozhatsky
2017-06-05 15:02                     ` Tetsuo Handa
2017-06-03 13:21               ` Tetsuo Handa
2017-07-08  4:59           ` Tetsuo Handa
2017-07-10 13:21             ` Michal Hocko
2017-07-10 13:54               ` Tetsuo Handa
2017-07-10 14:14                 ` Michal Hocko
2017-07-11 13:10                   ` Tetsuo Handa
2017-07-11 13:49                     ` Michal Hocko
2017-07-11 14:58                       ` Petr Mladek
2017-07-11 22:06                       ` Tetsuo Handa
2017-07-12  8:54                         ` Michal Hocko
2017-07-12 12:23                           ` Tetsuo Handa
2017-07-12 12:41                             ` Michal Hocko [this message]
2017-07-14 12:30                               ` Tetsuo Handa
2017-07-14 12:48                                 ` Michal Hocko
2017-08-09  6:14                                   ` Tetsuo Handa
2017-08-09 13:01                                     ` Tetsuo Handa

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=20170712124145.GI28912@dhcp22.suse.cz \
    --to=mhocko@suse.com \
    --cc=akpm@linux-foundation.org \
    --cc=dave.hansen@intel.com \
    --cc=hannes@cmpxchg.org \
    --cc=linux-mm@kvack.org \
    --cc=mgorman@suse.de \
    --cc=penguin-kernel@I-love.SAKURA.ne.jp \
    --cc=pmladek@suse.com \
    --cc=sergey.senozhatsky.work@gmail.com \
    --cc=vbabka@suse.cz \
    --cc=xiyou.wangcong@gmail.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 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.