linux-next.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Steven Rostedt <rostedt@goodmis.org>
To: Peter Zijlstra <peterz@infradead.org>
Cc: Stephen Rothwell <sfr@canb.auug.org.au>,
	Thomas Gleixner <tglx@linutronix.de>,
	Ingo Molnar <mingo@redhat.com>, "H. Peter Anvin" <hpa@zytor.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Linux Next Mailing List <linux-next@vger.kernel.org>,
	mhiramat@kernel.org, ast@kernel.org, hjl.tools@gmail.com,
	rick.p.edgecombe@intel.com, rppt@kernel.org,
	linux-toolchains@vger.kernel.org, Andrew.Cooper3@citrix.com,
	ndesaulniers@google.com
Subject: Re: linux-next: build warnings after merge of the tip tree
Date: Mon, 21 Mar 2022 11:28:05 -0400	[thread overview]
Message-ID: <20220321112805.1393f9b9@gandalf.local.home> (raw)
In-Reply-To: <Yjh3xZuuY3QcZ1Bn@hirez.programming.kicks-ass.net>

On Mon, 21 Mar 2022 14:04:05 +0100
Peter Zijlstra <peterz@infradead.org> wrote:

> Ahh, something tracing. I'll go do some patches on top of it.
> 
> Also, folks, I'm thinking we should start to move to __fexit__, if CET
> SHSTK ever wants to come to kernel land return trampolines will
> insta-stop working.
> 
> Hjl, do you think we could get -mfexit to go along with -mfentry ?

If we do every add a -mfexit, we will need to add a __ftail__ call.
Because, the current function exit tracing works for functions, even with
tail calls.


int funcA () {
	[..]
	return funcB();
}

Can turn into:

	[..]
	pop all stack from funcA
	load reg params to funcB
	jmp funcB

Then when funcB does does it's

	[..]
	ret

It will pop the call site of funcA (not the call site of funcB) and return
to wherever called funcA with the proper return values.

This currently works with function graph and kretprobe tracing because of
the shadow stack. Let's say we traced both funcA and funcB

funcA:
	call __fentry__

			Replace caller address with graph_trampoline and
			store the return caller into the shadow stack.

	[..]
	jmp funcB

funcB:
	call __fentry__

			Replace caller address with graph_trampoline and
			store the return caller (which is the
			graph_trampoline that was switched earlier) in the
			shadow stack.

	[..]
	ret

			Returns to the graph_trampoline and we trace the
			return of funcB. Then we pop off the shadow stack
			and jump to that. But the shadow stack had a call
			to the graph_trampoline, which gets called again.

			Returns to the graph_trampoline and we trace the
			return of funcA. Then we pop off the shadow stack
			and jump to that, which is the original caller to
			funcA.

That is, the current algorithm traces the end of both funcA and funcB
without issue, because of how the shadow stack works.

Now if we add a __fexit__, we will need a way to tell the tracers how to
record this scenario. That is why I'm thinking of a jmp to __ftail__.

Perhaps something like:

funcA:
	call __fentry__
	[..]
	push address of funcB
	jmp __ftail__
	jmp funcB

Where, __ftail__ would do at the end:

	ret

To jump to funcB and we skip the jmp to funcB anyway.

And to "nop" it out, we would have to convert it to.

funcA:
	call __fentry__
	[..]
	jmp 1
	jmp __ftail__
1:	jmp funcB


This is one way I can think of if we include a __fexit__. But to maintain
backward compatibility to function graph tracing (which is a requirement),
we need to be able to handle such cases.

Perhaps this is a good topic to bring up at Plumbers? :-)

Do I need to submit a tracing MC, or can we have this conversation at a
compiler / toolchain MC?

-- Steve

  parent reply	other threads:[~2022-03-21 15:28 UTC|newest]

Thread overview: 93+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-03-21  3:03 linux-next: build warnings after merge of the tip tree Stephen Rothwell
2022-03-21 12:55 ` Peter Zijlstra
2022-03-21 13:04   ` Peter Zijlstra
2022-03-21 13:08     ` Peter Zijlstra
2022-03-21 13:45       ` Peter Zijlstra
2022-03-21 14:19         ` Mark Rutland
2022-03-21 15:28         ` Peter Zijlstra
2022-03-21 15:45           ` Peter Zijlstra
2022-03-21 16:37             ` Linus Torvalds
2022-03-21 16:44               ` Peter Zijlstra
2022-03-21 16:52                 ` Linus Torvalds
2022-03-21 22:05                   ` Stephen Rothwell
2022-03-21 22:12                     ` Alexei Starovoitov
2022-03-21 22:46                       ` Stephen Rothwell
2022-03-21 22:50                         ` Alexei Starovoitov
2022-03-21 22:55                           ` Steven Rostedt
2022-03-22  4:51                           ` Masami Hiramatsu
2022-03-22  4:53                             ` Alexei Starovoitov
2022-03-22  7:42                       ` Peter Zijlstra
2022-03-22  4:38         ` Masami Hiramatsu
2022-03-21 15:28     ` Steven Rostedt [this message]
2022-03-21 16:04       ` Peter Zijlstra
2022-03-21 16:12         ` Steven Rostedt
2022-03-21 16:15           ` Steven Rostedt
2022-03-21 16:22             ` Steven Rostedt
2022-03-21 16:39               ` Steven Rostedt
2022-03-21 16:40             ` Peter Zijlstra
2022-03-21 16:45               ` Steven Rostedt
2022-03-21 16:50                 ` Peter Zijlstra
2022-03-21 16:54                   ` Steven Rostedt
2022-03-22  7:54                     ` Peter Zijlstra
2022-03-22 13:12                       ` Steven Rostedt
2022-03-22 14:35                         ` Peter Zijlstra
2022-03-22 15:04                           ` Steven Rostedt
2022-03-22 15:19                             ` Peter Zijlstra
2022-03-22 15:48                             ` Peter Zijlstra
2022-03-22 16:17                               ` Steven Rostedt
2022-03-23  2:23                           ` Masami Hiramatsu
2022-03-23  2:42                             ` Steven Rostedt
2022-03-23  6:28                               ` Masami Hiramatsu
2022-03-22 14:25           ` Masami Hiramatsu
2022-03-21 16:48     ` Peter Zijlstra
2022-03-22  5:31       ` Masami Hiramatsu
2022-03-22  8:08         ` Peter Zijlstra
2022-03-22  9:14           ` Masami Hiramatsu
2022-03-22 12:07             ` Peter Zijlstra
2022-03-22 12:17         ` Peter Zijlstra
2022-03-22 12:46           ` Masami Hiramatsu
2022-03-22 13:22             ` Steven Rostedt
2022-03-22 13:15         ` Mark Rutland
2022-03-22 13:51           ` Masami Hiramatsu
2022-03-22 10:46   ` Peter Zijlstra
2022-03-22 10:59     ` Peter Zijlstra
  -- strict thread matches above, loose matches on Subject: below --
2024-02-02  3:59 Stephen Rothwell
2023-12-01  0:29 Stephen Rothwell
2023-12-01 12:09 ` Uros Bizjak
2023-12-04  4:08   ` Stephen Rothwell
2023-12-04  7:02     ` Uros Bizjak
2023-12-11  5:19       ` Stephen Rothwell
2023-12-11  7:06         ` Uros Bizjak
2023-06-02  3:12 Stephen Rothwell
2022-11-21  7:41 Stephen Rothwell
2022-05-20  7:49 Stephen Rothwell
2022-04-27  0:10 Stephen Rothwell
2022-04-27 11:31 ` Borislav Petkov
2022-04-27 13:43   ` Tom Lendacky
2022-03-22  3:51 Stephen Rothwell
2022-03-22 21:52 ` Peter Zijlstra
2022-03-22 23:11   ` Stephen Rothwell
2021-12-17  3:40 Stephen Rothwell
2022-01-21 23:58 ` Stephen Rothwell
2022-03-15  2:32   ` Stephen Rothwell
2022-04-04  3:26     ` Stephen Rothwell
2021-10-12 10:20 Stephen Rothwell
2021-10-12 13:58 ` André Almeida
2020-11-30  7:05 Stephen Rothwell
2020-11-30 10:17 ` Borislav Petkov
2020-11-30 21:56   ` Ernst, Justin
2020-11-30 22:18     ` Borislav Petkov
2020-11-23  7:19 Stephen Rothwell
2020-11-23 23:03 ` Jarkko Sakkinen
2017-11-02  2:53 Stephen Rothwell
2017-11-03 21:00 ` Masami Hiramatsu
2017-11-04  8:01   ` Ingo Molnar
2017-11-04 12:16     ` Masami Hiramatsu
2017-11-13 11:31 ` Stephen Rothwell
2017-06-23  4:19 Stephen Rothwell
2016-07-14  3:49 Stephen Rothwell
2016-07-14  3:37 Stephen Rothwell
2016-07-14  4:18 ` Stephen Rothwell
2012-10-12  5:11 Stephen Rothwell
2011-01-31  4:27 Stephen Rothwell
2011-01-31  5:08 ` Jaswinder Singh

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=20220321112805.1393f9b9@gandalf.local.home \
    --to=rostedt@goodmis.org \
    --cc=Andrew.Cooper3@citrix.com \
    --cc=ast@kernel.org \
    --cc=hjl.tools@gmail.com \
    --cc=hpa@zytor.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-next@vger.kernel.org \
    --cc=linux-toolchains@vger.kernel.org \
    --cc=mhiramat@kernel.org \
    --cc=mingo@redhat.com \
    --cc=ndesaulniers@google.com \
    --cc=peterz@infradead.org \
    --cc=rick.p.edgecombe@intel.com \
    --cc=rppt@kernel.org \
    --cc=sfr@canb.auug.org.au \
    --cc=tglx@linutronix.de \
    /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).