public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Josh Poimboeuf <jpoimboe@redhat.com>
To: Ingo Molnar <mingo@kernel.org>
Cc: Jiri Kosina <jkosina@suse.cz>, Vojtech Pavlik <vojtech@suse.com>,
	Peter Zijlstra <peterz@infradead.org>,
	Andrew Morton <akpm@linux-foundation.org>,
	Ingo Molnar <mingo@redhat.com>,
	Seth Jennings <sjenning@redhat.com>,
	linux-kernel@vger.kernel.org,
	Linus Torvalds <torvalds@linux-foundation.org>
Subject: Re: [PATCH 1/3] sched: add sched_task_call()
Date: Fri, 20 Feb 2015 10:12:19 -0600	[thread overview]
Message-ID: <20150220161219.GF15980@treble.redhat.com> (raw)
In-Reply-To: <20150220095003.GA23506@gmail.com>

On Fri, Feb 20, 2015 at 10:50:03AM +0100, Ingo Molnar wrote:
> 
> * Jiri Kosina <jkosina@suse.cz> wrote:
> 
> > Alright, so to sum it up:
> > 
> > - current stack dumping (even looking at /proc/<pid>/stack) is not 
> >   guaranteed to yield "correct" results in case the task is running at the 
> >   time the stack is being examined
> 
> Don't even _think_ about trying to base something as 
> dangerous as live patching the kernel image on the concept 
> of:
> 
>   'We can make all stack backtraces reliably correct all 
>    the time, with no false positives, with no false
>    negatives, 100% of the time, and quickly discover and
>    fix bugs in that'.
> 
> It's not going to happen:
> 
>  - The correctness of stacktraces partially depends on
>    tooling and we don't control those.

What tooling are you referring to?

Sure, we rely on the compiler to produce the correct assembly for
putting frame pointers on the stack.  But that's pretty straightforward.
The kernel already relies on the compiler to do plenty of things which
are much more complex than that.

>  - More importantly, there's no strong force that ensures
>    we can rely on stack backtraces: correcting bad stack
>    traces depends on people hitting those functions and
>    situations that generate them, seeing a bad stack trace,
>    noticing that it's weird and correcting whatever code or
>    tooling quirk causes the stack entry to be incorrect.
>
> Essentially unlike other kernel code which breaks stuff if 
> it's incorrect, there's no _functional_ dependence on stack 
> traces, so live patching would be the first (and pretty 
> much only) thing that breaks on bad stack traces ...

First, there are several things we do to avoid anomalies:

- we don't patch asm functions
- we only walk the stack of sleeping tasks

Second, currently the stack unwinding code is rather crude and doesn't
do much in the way of error handling.  There are several error
conditions we could easily check for programmatically:

- make sure it starts from a __schedule() call at the top (I've only
  proposed walking the stacks of sleeping tasks)
- make sure we actually reach the bottom of the stack
- make sure each stack frame's return address is immediately after a
  call instruction

If any of these checks fail, we can either delay the patching of the
task until later or we can cancel the patching process, with no harm
done.  Either way we can WARN the user so that we get reports of these
anomalies.

> If you think you can make something like dwarf annotations 
> work reliably to base kernel live patching on that, 
> reconsider.

No, we would rely on CONFIG_FRAME_POINTER.

> Even with frame pointer backtraces can go bad sometimes, I 
> wouldn't base live patching even on _that_,

Other than hand-coded assembly, can you provide more details about how
frame pointer stack traces can go bad?

> and that's a very simple concept with a performance cost that most
> distros don't want to pay.

Hm, CONFIG_FRAME_POINTER is enabled on all the distros I use.

> So if your design is based on being able to discover 'live' 
> functions in the kernel stack dump of all tasks in the 
> system, I think you need a serious reboot of the whole 
> approach and get rid of that fragility before any of that 
> functionality gets upstream!

Just to clarify a couple of things:

1. Despite the email subject, this discussion is really about another
   RFC patch set [1].  It hasn't been merged, and there's still a lot of
   ongoing discussion about it.

2. We don't dump the stack of _all_ tasks.  Only sleeping ones.


[1] https://lkml.org/lkml/2015/2/9/475

-- 
Josh

  parent reply	other threads:[~2015-02-20 16:12 UTC|newest]

Thread overview: 86+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-02-16 18:52 [PATCH 0/3] prevent /proc/<pid>/stack garbage for running tasks Josh Poimboeuf
2015-02-16 18:52 ` [PATCH 1/3] sched: add sched_task_call() Josh Poimboeuf
2015-02-16 20:44   ` Peter Zijlstra
2015-02-16 22:05     ` Josh Poimboeuf
2015-02-17  9:24       ` Peter Zijlstra
2015-02-17 14:12         ` Josh Poimboeuf
2015-02-17 18:15           ` Peter Zijlstra
2015-02-17 21:25             ` Josh Poimboeuf
2015-02-18 15:21               ` Peter Zijlstra
2015-02-18 17:12                 ` Josh Poimboeuf
2015-02-19  0:20                   ` Peter Zijlstra
2015-02-19  4:17                     ` Josh Poimboeuf
2015-02-19 10:16                       ` Peter Zijlstra
2015-02-19 16:24                         ` Josh Poimboeuf
2015-02-19 16:33                           ` Vojtech Pavlik
2015-02-19 17:03                             ` Josh Poimboeuf
2015-02-19 17:08                               ` Jiri Kosina
2015-02-19 17:19                               ` Vojtech Pavlik
2015-02-19 17:32                                 ` Josh Poimboeuf
2015-02-19 17:48                                   ` Vojtech Pavlik
2015-02-19 20:40                                   ` Vojtech Pavlik
2015-02-19 21:42                                     ` Josh Poimboeuf
2015-02-20  7:46                                       ` Jiri Kosina
2015-02-20  8:49                                         ` Jiri Kosina
2015-02-20  9:50                                           ` Ingo Molnar
2015-02-20 10:02                                             ` Jiri Kosina
2015-02-20 10:44                                               ` live patching design (was: Re: [PATCH 1/3] sched: add sched_task_call()) Ingo Molnar
2015-02-20 10:58                                                 ` Jiri Kosina
2015-02-20 19:49                                                   ` Ingo Molnar
2015-02-20 21:46                                                     ` Vojtech Pavlik
2015-02-20 22:08                                                       ` Josh Poimboeuf
2015-02-21 18:30                                                         ` Ingo Molnar
2015-02-22  8:52                                                           ` Jiri Kosina
2015-02-22 10:17                                                             ` Ingo Molnar
2015-02-22 19:18                                                               ` Jiri Kosina
2015-02-23 12:43                                                           ` Jiri Kosina
2015-02-24 10:37                                                             ` Ingo Molnar
2015-02-21 18:18                                                       ` Ingo Molnar
2015-02-21 18:57                                                         ` Jiri Kosina
2015-02-21 19:16                                                           ` Ingo Molnar
2015-02-21 19:31                                                             ` Jiri Kosina
2015-02-21 19:48                                                               ` Ingo Molnar
2015-02-21 20:10                                                                 ` Jiri Kosina
2015-02-21 20:53                                                                   ` Jiri Kosina
2015-02-22  8:46                                                                   ` Ingo Molnar
2015-02-22  9:08                                                                     ` Jiri Kosina
2015-02-22  9:46                                                                     ` live kernel upgrades (was: live kernel patching design) Ingo Molnar
2015-02-22 10:34                                                                       ` Ingo Molnar
2015-02-22 10:48                                                                       ` Ingo Molnar
2015-02-22 19:13                                                                         ` Jiri Kosina
2015-02-22 23:01                                                                           ` Andrew Morton
2015-02-23  0:18                                                                             ` Dave Airlie
2015-02-23  0:44                                                                               ` Arjan van de Ven
2015-02-23  8:17                                                                                 ` Jiri Kosina
2015-02-23 10:42                                                                                   ` Richard Weinberger
2015-02-23 11:08                                                                                     ` Vojtech Pavlik
2015-02-23 11:50                                                                                 ` Pavel Machek
2015-02-24  9:16                                                                                 ` Ingo Molnar
2015-02-24 12:28                                                                                   ` Jiri Slaby
2015-03-05  0:51                                                                                     ` Ingo Molnar
2015-02-23  6:35                                                                             ` Vojtech Pavlik
2015-02-24  9:44                                                                               ` Ingo Molnar
2015-02-24 12:12                                                                                 ` Vojtech Pavlik
2015-02-24 10:53                                                                           ` Ingo Molnar
2015-02-24 12:19                                                                             ` Vojtech Pavlik
2015-02-22 14:37                                                                       ` Josh Poimboeuf
2015-02-22 16:40                                                                         ` Josh Poimboeuf
2015-02-22 19:03                                                                           ` Jiri Kosina
2015-02-24 10:23                                                                         ` Ingo Molnar
2015-02-24 11:10                                                                           ` Petr Mladek
2015-02-24 12:36                                                                           ` Vojtech Pavlik
2015-02-23 11:39                                                                       ` Pavel Machek
2015-02-24 10:25                                                                         ` Ingo Molnar
2015-02-24 12:11                                                                       ` Jiri Slaby
2015-02-24 13:18                                                                         ` live kernel upgrades Pavel Emelyanov
2015-02-20 16:12                                             ` Josh Poimboeuf [this message]
2015-02-20 20:08                                               ` [PATCH 1/3] sched: add sched_task_call() Ingo Molnar
2015-02-20 21:22                                                 ` Josh Poimboeuf
2015-02-20 17:05                                           ` Josh Poimboeuf
2015-02-19 21:26                                   ` Jiri Kosina
2015-02-19 21:38                                     ` Jiri Kosina
2015-02-19 23:11                                     ` Josh Poimboeuf
2015-02-16 18:52 ` [PATCH 2/3] stacktrace: add save_stack_trace_tsk_safe() Josh Poimboeuf
2015-02-18  0:13   ` Andrew Morton
2015-02-20  9:32     ` Jiri Kosina
2015-02-16 18:52 ` [PATCH 3/3] proc: fix /proc/<pid>/stack for running tasks Josh Poimboeuf

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=20150220161219.GF15980@treble.redhat.com \
    --to=jpoimboe@redhat.com \
    --cc=akpm@linux-foundation.org \
    --cc=jkosina@suse.cz \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@kernel.org \
    --cc=mingo@redhat.com \
    --cc=peterz@infradead.org \
    --cc=sjenning@redhat.com \
    --cc=torvalds@linux-foundation.org \
    --cc=vojtech@suse.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