All of lore.kernel.org
 help / color / mirror / Atom feed
From: Peter Zijlstra <peterz@infradead.org>
To: Steven Rostedt <rostedt@goodmis.org>
Cc: linux-kernel@vger.kernel.org, tglx@linutronix.de,
	jpoimboe@redhat.com, x86@kernel.org, mhiramat@kernel.org,
	mbenes@suse.cz, jthierry@redhat.com,
	alexandre.chartre@oracle.com
Subject: Re: [PATCH 3/3] x86/ftrace: Do not jump to direct code in created trampolines
Date: Wed, 22 Apr 2020 22:08:08 +0200	[thread overview]
Message-ID: <20200422200808.GX2483@worktop.programming.kicks-ass.net> (raw)
In-Reply-To: <20200422162750.638839749@goodmis.org>

On Wed, Apr 22, 2020 at 12:25:42PM -0400, Steven Rostedt wrote:

> @@ -367,6 +371,17 @@ create_trampoline(struct ftrace_ops *ops, unsigned int *tramp_size)
>  	if (WARN_ON(ret < 0))
>  		goto fail;
>  
> +	/* No need to test direct calls on created trampolines */
> +	if (ops->flags & FTRACE_OPS_FL_SAVE_REGS) {
> +		/* NOP the jnz 1f; but make sure it's a 2 byte jnz */
> +		ip = trampoline + (jmp_offset - start_offset);
> +		if (WARN_ON(*(char *)ip != 0x75))
> +			goto fail;
> +		ret = probe_kernel_read(ip, ideal_nops[2], 2);

Now you're just being silly, are you really, actually worried you can't
read ideal_nops[] ?

> +		if (ret < 0)
> +			goto fail;
> +	}
> +
>  	/*
>  	 * The address of the ftrace_ops that is used for this trampoline
>  	 * is stored at the end of the trampoline. This will be used to
> diff --git a/arch/x86/kernel/ftrace_64.S b/arch/x86/kernel/ftrace_64.S
> index 0882758d165a..f72ef157feb3 100644
> --- a/arch/x86/kernel/ftrace_64.S
> +++ b/arch/x86/kernel/ftrace_64.S
> @@ -241,6 +241,7 @@ SYM_INNER_LABEL(ftrace_regs_call, SYM_L_GLOBAL)
>  	 */
>  	movq ORIG_RAX(%rsp), %rax
>  	testq	%rax, %rax
> +SYM_INNER_LABEL(ftrace_regs_caller_jmp, SYM_L_GLOBAL)
>  	jnz	1f
>  

I you worry about performance, it would make more sense to do something
like so:

SYM_INNER_LABEL(ftrace_regs_caller_from, SYM_L_GLOBAL)
	movq ORIG_RAX(%rsp), %rax
	testq	%rax, %rax
	jnz	1f
SYM_INNER_LABEL(ftrace_regs_caller_to, SYM_L_GLOBAL)

	if (ops->flags & FTRACE_OPS_FL_SAVE_REGS) {
		ip = trampoline + (ftrace_regs_caller_from - start_offset);
		((u8[])ip)[0] = JMP8_INSN_OPCODE;
		((u8[])ip)[1] = ftrace_regs_caller_to - ftrace_regs_caller_from - JMP8_INSN_SIZE;
	}

Or nop the whole range, but it's like 10 bytes so I'm not sure that's
actually faster.

  reply	other threads:[~2020-04-22 20:08 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-04-22 16:25 [PATCH 0/3] x86/ftrace: Make created trampolines not call direct code Steven Rostedt
2020-04-22 16:25 ` [PATCH 1/3] x86/ftrace: Make non direct case the default in ftrace_regs_caller Steven Rostedt
2020-04-22 16:25 ` [PATCH 2/3] x86/ftrace: Only have the builtin ftrace_regs_caller call direct hooks Steven Rostedt
2020-04-22 16:25 ` [PATCH 3/3] x86/ftrace: Do not jump to direct code in created trampolines Steven Rostedt
2020-04-22 20:08   ` Peter Zijlstra [this message]
2020-04-22 20:17     ` Steven Rostedt

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=20200422200808.GX2483@worktop.programming.kicks-ass.net \
    --to=peterz@infradead.org \
    --cc=alexandre.chartre@oracle.com \
    --cc=jpoimboe@redhat.com \
    --cc=jthierry@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mbenes@suse.cz \
    --cc=mhiramat@kernel.org \
    --cc=rostedt@goodmis.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 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.