linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Peter Zijlstra <peterz@infradead.org>
To: Josh Poimboeuf <jpoimboe@redhat.com>
Cc: David Woodhouse <dwmw2@infradead.org>,
	Thomas Gleixner <tglx@linutronix.de>,
	linux-kernel@vger.kernel.org, Dave Hansen <dave.hansen@intel.com>,
	Ashok Raj <ashok.raj@intel.com>,
	Tim Chen <tim.c.chen@linux.intel.com>,
	Andy Lutomirski <luto@kernel.org>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Greg KH <gregkh@linuxfoundation.org>,
	Andrea Arcangeli <aarcange@redhat.com>,
	Andi Kleen <ak@linux.intel.com>,
	Arjan Van De Ven <arjan.van.de.ven@intel.com>,
	Dan Williams <dan.j.williams@intel.com>,
	Paolo Bonzini <pbonzini@redhat.com>,
	Jun Nakajima <jun.nakajima@intel.com>,
	Asit Mallick <asit.k.mallick@intel.com>,
	Jason Baron <jbaron@akamai.com>
Subject: Re: [PATCH 20/24] objtool: Another static block fail
Date: Tue, 30 Jan 2018 10:56:53 +0100	[thread overview]
Message-ID: <20180130095653.GZ2269@hirez.programming.kicks-ass.net> (raw)
In-Reply-To: <20180129225252.bi2etgk3eqprcv3x@treble>

On Mon, Jan 29, 2018 at 04:52:53PM -0600, Josh Poimboeuf wrote:
> On Tue, Jan 23, 2018 at 04:25:59PM +0100, Peter Zijlstra wrote:
> > I've observed GCC generate:
> > 
> >   sym:
> >      NOP/JMP 1f	(static_branch)
> >      JMP 2f
> >   1: /* crud */
> >      JMP 3f
> >   2: /* other crud */
> > 
> >   3: RETQ
> > 
> > 
> > This means we need to follow unconditional jumps; be conservative and
> > only follow if its a unique jump.
> > 
> > (I've not yet figured out which CONFIG option is responsible for this,
> >  a normal defconfig build does not generate crap like this)
> > 
> > Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
> 
> Any chance we can just add a compiler barrier to the assertion macro and
> avoid all this grow_static_blocks() mess?  It seems a bit... fragile.

It is all rather unfortunate yes.. :/ I've tried to keep the grow stuff
as conservative as possible while still covering all the weirdness I
found. And while it was great fun, I do agree it would be much better to
not have to do this.


You're thinking of something like this?

 static __always_inline void arch_static_assert(void)
 {
        asm volatile ("1:\n\t"
                      ".pushsection .discard.jump_assert \n\t"
                      _ASM_ALIGN  "\n\t"
                      _ASM_PTR "1b \n\t"
-                     ".popsection \n\t");
+                     ".popsection \n\t" ::: "memory");
 }

That doesn't seem to matter much; see here:

static void
ttwu_stat(struct task_struct *p, int cpu, int wake_flags)
{
        struct rq *rq;

        if (!schedstat_enabled())
                return;

        rq = this_rq();


$ objdump -dr build/kernel/sched/core.o

0000000000001910 <ttwu_stat>:
    1910:       e8 00 00 00 00          callq  1915 <ttwu_stat+0x5>
                        1911: R_X86_64_PC32     __fentry__-0x4
    1915:       41 57                   push   %r15
    1917:       41 56                   push   %r14
    1919:       41 55                   push   %r13
    191b:       41 54                   push   %r12
    191d:       55                      push   %rbp
    191e:       53                      push   %rbx
    191f:       0f 1f 44 00 00          nopl   0x0(%rax,%rax,1)
    1924:       eb 25                   jmp    194b <ttwu_stat+0x3b>
    1926:       41 89 d5                mov    %edx,%r13d
    1929:       41 89 f4                mov    %esi,%r12d
    192c:       48 89 fb                mov    %rdi,%rbx
    192f:       49 c7 c6 00 00 00 00    mov    $0x0,%r14
                        1932: R_X86_64_32S      runqueues


$ objdump -j __jump_table -sr build/kernel/sched.o

0000000000000048 R_X86_64_64       .text+0x000000000000191f
0000000000000050 R_X86_64_64       .text+0x0000000000001926
0000000000000058 R_X86_64_64       sched_schedstats


$ objdump -j .discard.jump_assert -dr build/kernel/sched.o

0000000000000000 R_X86_64_64       .text+0x000000000000192f


It still lifts random crud over that first initial statement (the rq
load).

  reply	other threads:[~2018-01-30  9:56 UTC|newest]

Thread overview: 71+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-01-23 15:25 [PATCH 00/24] objtool: retpoline and asm-goto validation Peter Zijlstra
2018-01-23 15:25 ` [PATCH 01/24] objtool: Use existing global variables for options Peter Zijlstra
2018-01-23 15:25 ` [PATCH 02/24] objtool: Add retpoline validation Peter Zijlstra
2018-01-23 18:21   ` Borislav Petkov
2018-01-26  9:54   ` David Woodhouse
2018-01-23 15:25 ` [PATCH 03/24] x86/paravirt: Annotate indirect calls Peter Zijlstra
2018-01-25 10:02   ` David Woodhouse
2018-01-25 10:22     ` Peter Zijlstra
2018-01-25 10:26       ` Juergen Gross
2018-01-25 10:52         ` David Woodhouse
2018-01-25 11:35           ` Peter Zijlstra
2018-01-26  9:57             ` David Woodhouse
2018-01-29 17:58   ` Josh Poimboeuf
2018-01-29 18:09     ` David Woodhouse
2018-01-29 18:17     ` Peter Zijlstra
2018-01-29 18:38   ` Josh Poimboeuf
2018-01-29 19:21     ` Peter Zijlstra
2018-01-30 16:02       ` Josh Poimboeuf
2018-01-31  4:13         ` [PATCH] x86/paravirt: Remove 'noreplace-paravirt' cmdline option Josh Poimboeuf
2018-01-31  5:59           ` Juergen Gross
2018-01-31  9:42           ` [tip:x86/pti] " tip-bot for Josh Poimboeuf
2018-01-23 15:25 ` [PATCH 04/24] x86,nospec: Annotate indirect calls/jumps Peter Zijlstra
2018-01-26 10:19   ` David Woodhouse
2018-01-29 17:44     ` Peter Zijlstra
2018-01-23 15:25 ` [PATCH 05/24] x86: Annotate indirect jump in head_64.S Peter Zijlstra
2018-01-26 10:24   ` David Woodhouse
2018-01-23 15:25 ` [PATCH 06/24] x86,kvm: Fix indirect calls in emulator Peter Zijlstra
2018-01-23 20:28   ` Borislav Petkov
2018-01-23 20:48     ` David Woodhouse
2018-01-24 10:35       ` Peter Zijlstra
2018-01-24 10:43         ` Paolo Bonzini
2018-01-25  9:34           ` Peter Zijlstra
2018-01-25  9:49             ` David Woodhouse
2018-01-26 10:57             ` Paolo Bonzini
2018-01-23 15:25 ` [PATCH 07/24] x86,vmx: Fix indirect call Peter Zijlstra
2018-01-25  9:36   ` Peter Zijlstra
2018-01-23 15:25 ` [PATCH 08/24] x86,sme: Annotate " Peter Zijlstra
2018-01-26 10:37   ` David Woodhouse
2018-01-29 17:49     ` Peter Zijlstra
2018-01-29 17:50       ` Peter Zijlstra
2018-01-31  9:29     ` Peter Zijlstra
2018-01-31 15:04       ` Josh Poimboeuf
2018-01-31 16:00         ` Peter Zijlstra
2018-01-23 15:25 ` [PATCH 09/24] jump_label: Add branch hints to static_branch_{un,}likely() Peter Zijlstra
2018-01-24 18:46   ` Borislav Petkov
2018-01-23 15:25 ` [PATCH 10/24] sched: Optimize ttwu_stat() Peter Zijlstra
2018-01-23 15:25 ` [PATCH 11/24] x86: Reindent _static_cpu_has Peter Zijlstra
2018-01-23 15:25 ` [PATCH 12/24] x86: Update _static_cpu_has to use all named variables Peter Zijlstra
2018-01-25 19:31   ` Borislav Petkov
2018-01-23 15:25 ` [PATCH 13/24] objtool: Implement base jump_assert support Peter Zijlstra
2018-01-26 10:45   ` David Woodhouse
2018-01-23 15:25 ` [PATCH 14/24] x86: Add a type field to alt_instr Peter Zijlstra
2018-01-23 15:25 ` [PATCH 15/24] x86: Annotate static_cpu_has alternative Peter Zijlstra
2018-01-23 15:25 ` [PATCH 16/24] objtool: Implement jump_assert for _static_cpu_has() Peter Zijlstra
2018-01-23 15:25 ` [PATCH 17/24] objtool: Introduce special_type Peter Zijlstra
2018-01-23 15:25 ` [PATCH 18/24] objtool: More complex static jump implementation Peter Zijlstra
2018-01-23 15:25 ` [PATCH 19/24] objtool: Even more complex static block checks Peter Zijlstra
2018-01-23 15:25 ` [PATCH 20/24] objtool: Another static block fail Peter Zijlstra
2018-01-29 22:52   ` Josh Poimboeuf
2018-01-30  9:56     ` Peter Zijlstra [this message]
2018-01-31  3:12       ` Josh Poimboeuf
2018-01-31 10:01         ` Peter Zijlstra
2018-01-31 10:07           ` David Woodhouse
2018-01-31 10:27             ` Peter Zijlstra
2018-01-23 15:26 ` [PATCH 21/24] objtool: Skip static assert when KCOV/KASAN Peter Zijlstra
2018-01-23 15:26 ` [PATCH 22/24] x86/jump_label: Implement arch_static_assert() Peter Zijlstra
2018-01-23 15:26 ` [PATCH 23/24] x86: Force asm-goto Peter Zijlstra
2018-01-23 15:26 ` [PATCH 24/24] x86: Remove FAST_FEATURE_TESTS Peter Zijlstra
2018-01-23 15:42 ` [PATCH 00/24] objtool: retpoline and asm-goto validation Peter Zijlstra
2018-01-23 15:57   ` David Woodhouse
2018-01-23 16:03     ` Peter Zijlstra

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=20180130095653.GZ2269@hirez.programming.kicks-ass.net \
    --to=peterz@infradead.org \
    --cc=aarcange@redhat.com \
    --cc=ak@linux.intel.com \
    --cc=arjan.van.de.ven@intel.com \
    --cc=ashok.raj@intel.com \
    --cc=asit.k.mallick@intel.com \
    --cc=dan.j.williams@intel.com \
    --cc=dave.hansen@intel.com \
    --cc=dwmw2@infradead.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=jbaron@akamai.com \
    --cc=jpoimboe@redhat.com \
    --cc=jun.nakajima@intel.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=luto@kernel.org \
    --cc=pbonzini@redhat.com \
    --cc=tglx@linutronix.de \
    --cc=tim.c.chen@linux.intel.com \
    --cc=torvalds@linux-foundation.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;
as well as URLs for NNTP newsgroup(s).