public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Peter Zijlstra <peterz@infradead.org>
To: Josh Poimboeuf <jpoimboe@redhat.com>
Cc: tglx@linutronix.de, linux-kernel@vger.kernel.org, x86@kernel.org
Subject: Re: [RFC][PATCH 15/16] objtool: Implement noinstr validation
Date: Mon, 16 Mar 2020 14:24:19 +0100	[thread overview]
Message-ID: <20200316132419.GF12521@hirez.programming.kicks-ass.net> (raw)
In-Reply-To: <20200315180320.cgy2ealklbjlx4g7@treble>

On Sun, Mar 15, 2020 at 01:03:20PM -0500, Josh Poimboeuf wrote:
> On Thu, Mar 12, 2020 at 02:41:22PM +0100, Peter Zijlstra wrote:
> > Validate that any call out of .noinstr.text is in between
> > instr_begin() and instr_end() annotations.
> > 
> > This annotation is useful to ensure correct behaviour wrt tracing
> > sensitive code like entry/exit and idle code. When we run code in a
> > sensitive context we want a guarantee no unknown code is ran.
> > 
> > Since this validation relies on knowing the section of call
> > destination symbols, we must run it on vmlinux.o instead of on
> > individual object files.
> > 
> > Add the -i "noinstr validation only" option because:
> > 
> >  - vmlinux.o isn't 'clean' vs the existing validations
> >  - skipping the other validations (which have already been done
> >    earlier in the build) saves around a second of runtime.
> > 
> > Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
> 
> I find the phrase "noinstr" to be WAY too ambiguous.  To my brain it
> clearly stands for "no instructions" and I have to do a double take
> every time I read it.

Thing is, we use insn for instruction all over both arch/x86/ and
objtool.

My personal naming preference didn't make it due to CoC reasons :-/

> And "read_instr_hints" reads as "read_instruction_hints()".
> 
> Can we come up with a more readable name?  Why not just "notrace"?
> 
> The trace begin/end annotations could be
> 
>   trace_allow_begin()
>   trace_allow_end()

notrace already exists and we didn't want to confuse things further.

> Also -- what happens when a function belongs in both .notrace.text and
> in one of the other special-purpose sections like .sched.text,
> .meminit.text or .entry.text?

Hasn't happened yet, initially we were thinking of using .entry.text for
this as a whole, but decided against that due to how .entry.text is
special for PTI (although exposing most of this code really wouldn't
matter).

The thing with .sched.text is that we really should never call into
scheduling from these contexts anyway. We've not ran into meminit yet.
(all this finicky entry code is ran with IRQs disabled).

The one that could potentially interfere is .cpuidle.text.

> Maybe storing pointers to the functions, like NOKPROBE_SYMBOL does,
> would be better than putting the functions in a separate section.

Thing is, I really _hate_ that annotation style.

> > ---
> >  tools/objtool/builtin-check.c |    4 -
> >  tools/objtool/builtin.h       |    2 
> >  tools/objtool/check.c         |  155 ++++++++++++++++++++++++++++++++++++------
> >  tools/objtool/check.h         |    3 
> >  4 files changed, 140 insertions(+), 24 deletions(-)
> > 
> > --- a/tools/objtool/builtin-check.c
> > +++ b/tools/objtool/builtin-check.c
> > @@ -17,7 +17,7 @@
> >  #include "builtin.h"
> >  #include "check.h"
> >  
> > -bool no_fp, no_unreachable, retpoline, module, backtrace, uaccess, stats;
> > +bool no_fp, no_unreachable, retpoline, module, backtrace, uaccess, stats, noinstr, vmlinux;
> >  
> >  static const char * const check_usage[] = {
> >  	"objtool check [<options>] file.o",
> > @@ -32,6 +32,8 @@ const struct option check_options[] = {
> >  	OPT_BOOLEAN('b', "backtrace", &backtrace, "unwind on error"),
> >  	OPT_BOOLEAN('a', "uaccess", &uaccess, "enable uaccess checking"),
> >  	OPT_BOOLEAN('s', "stats", &stats, "print statistics"),
> > +	OPT_BOOLEAN('i', "noinstr", &noinstr, "noinstr validation only"),
> > +	OPT_BOOLEAN('l', "vmlinux", &vmlinux, "vmlinux.o validation"),
> >  	OPT_END(),
> >  };
> 
> It seems like there should be an easy way to auto-detect vmlinux.o,
> without needing a cmdline option.
> 
> For example, if the file name is "vmlinux.o" :-)

Fair enough I suppose...

> Also, maybe we can just hard-code the fact that vmlinux.o is always
> noinstr-only.  Over time we'll probably need to move more per-.o
> functionalities to vmlinux.o and I think we should avoid creating a
> bunch of cmdline options.

but you're ruining things here, see, for a regular x86_64 config, we'd
run this with:

	objtool check -fail vmlinux.o

And I was hoping to get vmlinux.o objtool clean, surprisingly there
really aren't that many complaints. But the -i thing makes it run
significantly faster without duplicating all the bits we've already
checked.

Anyway, let me address and refresh the series while we bicket about
naming later. I'm thikning Thomas would much prefer to get his first
round of patches out first.

  reply	other threads:[~2020-03-16 13:24 UTC|newest]

Thread overview: 50+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-03-12 13:41 [RFC][PATCH 00/16] objtool: vmlinux.o and noinstr validation Peter Zijlstra
2020-03-12 13:41 ` [RFC][PATCH 01/16] objtool: Introduce validate_return() Peter Zijlstra
2020-03-12 13:41 ` [RFC][PATCH 02/16] objtool: Rename func_for_each_insn() Peter Zijlstra
2020-03-12 13:41 ` [RFC][PATCH 03/16] objtool: Rename func_for_each_insn_all() Peter Zijlstra
2020-03-12 13:41 ` [RFC][PATCH 04/16] objtool: Annotate identity_mapped() Peter Zijlstra
2020-03-13 14:34   ` Peter Zijlstra
2020-03-15 15:45     ` Josh Poimboeuf
2020-03-13 16:46   ` Brian Gerst
2020-03-13 17:22     ` Peter Zijlstra
2020-03-12 13:41 ` [RFC][PATCH 05/16] objtool: Optimize find_symbol_by_index() Peter Zijlstra
2020-03-15 16:09   ` Josh Poimboeuf
2020-03-15 16:18     ` Josh Poimboeuf
2020-03-15 16:10   ` Josh Poimboeuf
2020-03-17 11:55   ` Miroslav Benes
2020-03-17 14:08     ` Peter Zijlstra
2020-03-12 13:41 ` [RFC][PATCH 06/16] objtool: Add a statistics mode Peter Zijlstra
2020-03-15 16:20   ` Josh Poimboeuf
2020-03-12 13:41 ` [RFC][PATCH 07/16] objtool: Optimize find_section_by_index() Peter Zijlstra
2020-03-15 16:24   ` Josh Poimboeuf
2020-03-12 13:41 ` [RFC][PATCH 08/16] Optimize find_section_by_name() Peter Zijlstra
2020-03-15 16:25   ` Josh Poimboeuf
2020-03-17 12:22   ` Miroslav Benes
2020-03-17 14:10     ` Peter Zijlstra
2020-03-12 13:41 ` [RFC][PATCH 09/16] objtool: Optimize find_symbol_*() and read_symbols() Peter Zijlstra
2020-03-15 15:48   ` Josh Poimboeuf
2020-03-15 16:41   ` Josh Poimboeuf
2020-03-12 13:41 ` [RFC][PATCH 10/16] objtool: Resize insn_hash Peter Zijlstra
2020-03-12 13:41 ` [RFC][PATCH 11/16] objtool: Optimize find_symbol_by_name() Peter Zijlstra
2020-03-12 13:41 ` [RFC][PATCH 12/16] objtool: Optimize read_sections() Peter Zijlstra
2020-03-15 16:53   ` Josh Poimboeuf
2020-03-12 13:41 ` [RFC][PATCH 13/16] objtool: Delete cleanup() Peter Zijlstra
2020-03-12 13:41 ` [RFC][PATCH 14/16] objtool: Optimize find_rela_by_dest_range() Peter Zijlstra
2020-03-12 13:41 ` [RFC][PATCH 15/16] objtool: Implement noinstr validation Peter Zijlstra
2020-03-15 18:03   ` Josh Poimboeuf
2020-03-16 13:24     ` Peter Zijlstra [this message]
2020-03-16 16:19       ` Josh Poimboeuf
2020-03-16 16:21         ` Josh Poimboeuf
2020-03-16 16:46           ` Peter Zijlstra
2020-03-16 16:48         ` Peter Zijlstra
2020-03-16 19:20           ` Josh Poimboeuf
2020-03-12 13:41 ` [RFC][PATCH 16/16] objtool: Optimize !vmlinux.o again Peter Zijlstra
2020-03-12 21:57   ` [RFC][PATCH v2 " Peter Zijlstra
2020-03-12 16:23 ` [RFC][PATCH 00/16] objtool: vmlinux.o and noinstr validation Peter Zijlstra
2020-03-12 17:44   ` Josh Poimboeuf
2020-03-12 22:23   ` Peter Zijlstra
2020-03-17  0:56   ` Masami Hiramatsu
2020-03-17  9:26     ` Thomas Gleixner
2020-03-17 14:20       ` Masami Hiramatsu
2020-03-17 12:14     ` Peter Zijlstra
2020-03-15 18:12 ` 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=20200316132419.GF12521@hirez.programming.kicks-ass.net \
    --to=peterz@infradead.org \
    --cc=jpoimboe@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=tglx@linutronix.de \
    --cc=x86@kernel.org \
    /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