linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Peter Zijlstra <peterz@infradead.org>
To: Steven Rostedt <rostedt@goodmis.org>
Cc: "Naveen N. Rao" <naveen.n.rao@linux.vnet.ibm.com>,
	alexei.starovoitov@gmail.com, alyssa.milburn@intel.com,
	andrew.cooper3@citrix.com, hjl.tools@gmail.com,
	joao@overdrivepizza.com, jpoimboe@redhat.com,
	keescook@chromium.org, linux-kernel@vger.kernel.org,
	mark.rutland@arm.com, mbenes@suse.cz,
	Masami Hiramatsu <mhiramat@kernel.org>,
	ndesaulniers@google.com, samitolvanen@google.com, x86@kernel.org
Subject: Re: [PATCH v2 12/39] x86/ibt,ftrace: Search for __fentry__ location
Date: Thu, 3 Mar 2022 16:59:03 +0100	[thread overview]
Message-ID: <YiDlx0J1KMNP39if@hirez.programming.kicks-ass.net> (raw)
In-Reply-To: <20220303093413.387ee6f1@gandalf.local.home>

On Thu, Mar 03, 2022 at 09:34:13AM -0500, Steven Rostedt wrote:
> On Thu, 3 Mar 2022 14:04:52 +0100
> Peter Zijlstra <peterz@infradead.org> wrote:
> 
> > > @@ -1596,7 +1596,7 @@ static int check_ftrace_location(struct kprobe *p)
> > > {
> > > 	unsigned long ftrace_addr;
> > > 
> > > -	ftrace_addr = ftrace_location((unsigned long)p->addr);
> > > +	ftrace_addr = ftrace_location_range((unsigned long)p->addr, (unsigned long)p->addr);  
> > 
> > Yes, although perhaps a new helper. I'll go ponder during lunch.
> 
> Is there more places to add that to make it worth creating a helper?

This is what I ended up with, I've looked at all ftrace_location() sites
there are, seems to work too, both the built-in boot time ftrace tests
and the selftests work splat-less.

I should update the Changelog some though.

Naveen also mentioned register_ftrace_direct() could be further cleaned
up, but I didn't want to do too much in once go.

---

Subject: x86/ibt,ftrace: Search for __fentry__ location
From: Peter Zijlstra <peterz@infradead.org>
Date: Wed Feb 23 10:01:38 CET 2022

Have ftrace_location() search the symbol for the __fentry__ location
when it isn't at func+0 and use this for {,un}register_ftrace_direct().

This avoids a whole bunch of assumptions about __fentry__ being at
func+0.

Suggested-by: Steven Rostedt <rostedt@goodmis.org>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
---
 arch/x86/kernel/kprobes/core.c |   11 +---------
 kernel/bpf/trampoline.c        |   20 +++----------------
 kernel/kprobes.c               |    8 +------
 kernel/trace/ftrace.c          |   43 +++++++++++++++++++++++++++++++++--------
 4 files changed, 43 insertions(+), 39 deletions(-)

--- a/arch/x86/kernel/kprobes/core.c
+++ b/arch/x86/kernel/kprobes/core.c
@@ -193,17 +193,10 @@ static unsigned long
 __recover_probed_insn(kprobe_opcode_t *buf, unsigned long addr)
 {
 	struct kprobe *kp;
-	unsigned long faddr;
+	bool faddr;
 
 	kp = get_kprobe((void *)addr);
-	faddr = ftrace_location(addr);
-	/*
-	 * Addresses inside the ftrace location are refused by
-	 * arch_check_ftrace_location(). Something went terribly wrong
-	 * if such an address is checked here.
-	 */
-	if (WARN_ON(faddr && faddr != addr))
-		return 0UL;
+	faddr = ftrace_location(addr) == addr;
 	/*
 	 * Use the current code if it is not modified by Kprobe
 	 * and it cannot be modified by ftrace.
--- a/kernel/bpf/trampoline.c
+++ b/kernel/bpf/trampoline.c
@@ -117,18 +117,6 @@ static void bpf_trampoline_module_put(st
 	tr->mod = NULL;
 }
 
-static int is_ftrace_location(void *ip)
-{
-	long addr;
-
-	addr = ftrace_location((long)ip);
-	if (!addr)
-		return 0;
-	if (WARN_ON_ONCE(addr != (long)ip))
-		return -EFAULT;
-	return 1;
-}
-
 static int unregister_fentry(struct bpf_trampoline *tr, void *old_addr)
 {
 	void *ip = tr->func.addr;
@@ -160,12 +148,12 @@ static int modify_fentry(struct bpf_tram
 static int register_fentry(struct bpf_trampoline *tr, void *new_addr)
 {
 	void *ip = tr->func.addr;
+	unsigned long faddr;
 	int ret;
 
-	ret = is_ftrace_location(ip);
-	if (ret < 0)
-		return ret;
-	tr->func.ftrace_managed = ret;
+	faddr = ftrace_location((unsigned long)ip);
+	if (faddr)
+		tr->func.ftrace_managed = true;
 
 	if (bpf_trampoline_module_get(tr))
 		return -ENOENT;
--- a/kernel/kprobes.c
+++ b/kernel/kprobes.c
@@ -1562,14 +1562,10 @@ static inline int warn_kprobe_rereg(stru
 
 static int check_ftrace_location(struct kprobe *p)
 {
-	unsigned long ftrace_addr;
+	unsigned long addr = (unsigned long)p->addr;
 
-	ftrace_addr = ftrace_location((unsigned long)p->addr);
-	if (ftrace_addr) {
+	if (ftrace_location(addr) == addr) {
 #ifdef CONFIG_KPROBES_ON_FTRACE
-		/* Given address is not on the instruction boundary */
-		if ((unsigned long)p->addr != ftrace_addr)
-			return -EILSEQ;
 		p->flags |= KPROBE_FLAG_FTRACE;
 #else	/* !CONFIG_KPROBES_ON_FTRACE */
 		return -EINVAL;
--- a/kernel/trace/ftrace.c
+++ b/kernel/trace/ftrace.c
@@ -1568,17 +1568,34 @@ unsigned long ftrace_location_range(unsi
 }
 
 /**
- * ftrace_location - return true if the ip giving is a traced location
+ * ftrace_location - return the ftrace location
  * @ip: the instruction pointer to check
  *
- * Returns rec->ip if @ip given is a pointer to a ftrace location.
- * That is, the instruction that is either a NOP or call to
- * the function tracer. It checks the ftrace internal tables to
- * determine if the address belongs or not.
+ * If @ip matches the ftrace location, return @ip.
+ * If @ip matches sym+0, return sym's ftrace location.
+ * Otherwise, return 0.
  */
 unsigned long ftrace_location(unsigned long ip)
 {
-	return ftrace_location_range(ip, ip);
+	struct dyn_ftrace *rec;
+	unsigned long offset;
+	unsigned long size;
+
+	rec = lookup_rec(ip, ip);
+	if (!rec) {
+		if (!kallsyms_lookup_size_offset(ip, &size, &offset))
+			goto out;
+
+		/* map sym+0 to __fentry__ */
+		if (!offset)
+			rec = lookup_rec(ip, ip + size - 1);
+	}
+
+	if (rec)
+		return rec->ip;
+
+out:
+	return 0;
 }
 
 /**
@@ -4962,7 +4979,8 @@ ftrace_match_addr(struct ftrace_hash *ha
 {
 	struct ftrace_func_entry *entry;
 
-	if (!ftrace_location(ip))
+	ip = ftrace_location(ip);
+	if (!ip)
 		return -EINVAL;
 
 	if (remove) {
@@ -5110,11 +5128,16 @@ int register_ftrace_direct(unsigned long
 	struct ftrace_func_entry *entry;
 	struct ftrace_hash *free_hash = NULL;
 	struct dyn_ftrace *rec;
-	int ret = -EBUSY;
+	int ret = -ENODEV;
 
 	mutex_lock(&direct_mutex);
 
+	ip = ftrace_location(ip);
+	if (!ip)
+		goto out_unlock;
+
 	/* See if there's a direct function at @ip already */
+	ret = -EBUSY;
 	if (ftrace_find_rec_direct(ip))
 		goto out_unlock;
 
@@ -5222,6 +5245,10 @@ int unregister_ftrace_direct(unsigned lo
 
 	mutex_lock(&direct_mutex);
 
+	ip = ftrace_location(ip);
+	if (!ip)
+		goto out_unlock;
+
 	entry = find_direct_entry(&ip, NULL);
 	if (!entry)
 		goto out_unlock;

  reply	other threads:[~2022-03-03 15:59 UTC|newest]

Thread overview: 183+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-02-24 14:51 [PATCH v2 00/39] x86: Kernel IBT Peter Zijlstra
2022-02-24 14:51 ` [PATCH v2 01/39] kbuild: Fix clang build Peter Zijlstra
2022-02-25  0:11   ` Kees Cook
2022-03-01 21:16   ` Nick Desaulniers
2022-03-02  0:47     ` Kees Cook
2022-03-02  0:53       ` Fangrui Song
2022-03-02 16:37     ` Nathan Chancellor
2022-03-02 18:40       ` Kees Cook
2022-03-02 19:18       ` Nick Desaulniers
2022-03-02 21:15         ` Nathan Chancellor
2022-03-02 22:07           ` Nick Desaulniers
2022-03-02 23:00           ` Kees Cook
2022-03-02 23:10           ` Peter Zijlstra
2022-02-24 14:51 ` [PATCH v2 02/39] static_call: Avoid building empty .static_call_sites Peter Zijlstra
2022-02-24 14:51 ` [PATCH v2 03/39] x86/module: Fix the paravirt vs alternative order Peter Zijlstra
2022-03-01 14:37   ` Miroslav Benes
2022-02-24 14:51 ` [PATCH v2 04/39] objtool: Add --dry-run Peter Zijlstra
2022-02-25  0:27   ` Kees Cook
2022-03-01 14:37   ` Miroslav Benes
2022-02-24 14:51 ` [PATCH v2 05/39] x86: Base IBT bits Peter Zijlstra
2022-02-25  0:35   ` Kees Cook
2022-02-25  0:46     ` Nathan Chancellor
2022-02-25 22:08       ` Nathan Chancellor
2022-02-26  0:29         ` Joao Moreira
2022-02-26  4:58           ` Kees Cook
2022-02-26  4:59             ` Fāng-ruì Sòng
2022-02-26  5:04               ` Kees Cook
2022-02-25 13:41     ` Peter Zijlstra
2022-02-24 14:51 ` [PATCH v2 06/39] x86/ibt: Add ANNOTATE_NOENDBR Peter Zijlstra
2022-02-25  0:36   ` Kees Cook
2022-02-24 14:51 ` [PATCH v2 07/39] x86/entry: Sprinkle ENDBR dust Peter Zijlstra
2022-02-24 22:37   ` Josh Poimboeuf
2022-02-25  0:42   ` Kees Cook
2022-02-25  9:22     ` Andrew Cooper
2022-02-24 14:51 ` [PATCH v2 08/39] x86/linkage: Add ENDBR to SYM_FUNC_START*() Peter Zijlstra
2022-02-25  0:45   ` Kees Cook
2022-02-24 14:51 ` [PATCH v2 09/39] x86/ibt,paravirt: Sprinkle ENDBR Peter Zijlstra
2022-02-25  0:47   ` Kees Cook
2022-02-24 14:51 ` [PATCH v2 10/39] x86/ibt,crypto: Add ENDBR for the jump-table entries Peter Zijlstra
2022-02-24 22:41   ` Josh Poimboeuf
2022-02-25  0:50   ` Kees Cook
2022-02-25 10:22     ` Peter Zijlstra
2022-02-24 14:51 ` [PATCH v2 11/39] x86/ibt,kvm: Add ENDBR to fastops Peter Zijlstra
2022-02-25  0:54   ` Kees Cook
2022-02-25 10:24     ` Peter Zijlstra
2022-02-25 13:09       ` David Laight
2022-02-24 14:51 ` [PATCH v2 12/39] x86/ibt,ftrace: Search for __fentry__ location Peter Zijlstra
2022-02-24 15:55   ` Masami Hiramatsu
2022-02-24 15:58     ` Steven Rostedt
2022-02-24 15:59       ` Steven Rostedt
2022-02-24 16:01       ` Steven Rostedt
2022-02-24 22:46         ` Josh Poimboeuf
2022-02-24 22:51           ` Steven Rostedt
2022-02-25  1:34       ` Masami Hiramatsu
2022-02-25  2:19         ` Steven Rostedt
2022-02-25 10:20           ` Masami Hiramatsu
2022-02-25 13:36             ` Steven Rostedt
2022-03-01 18:57               ` Naveen N. Rao
2022-03-01 19:20                 ` Steven Rostedt
2022-03-02 13:20                   ` Peter Zijlstra
2022-03-02 16:01                     ` Steven Rostedt
2022-03-02 19:47                       ` Steven Rostedt
2022-03-02 20:48                         ` Steven Rostedt
2022-03-02 20:51                         ` Peter Zijlstra
2022-03-03  9:45                           ` Naveen N. Rao
2022-03-03 13:04                             ` Peter Zijlstra
2022-03-03 14:34                               ` Steven Rostedt
2022-03-03 15:59                                 ` Peter Zijlstra [this message]
2022-03-06  3:48                                   ` Masami Hiramatsu
2022-03-09 11:47                                   ` Naveen N. Rao
2022-03-03 14:39                               ` Naveen N. Rao
2022-02-25  0:55   ` Kees Cook
2022-03-02 16:25   ` Naveen N. Rao
2022-02-24 14:51 ` [PATCH v2 13/39] x86/livepatch: Validate " Peter Zijlstra
2022-02-24 23:02   ` Josh Poimboeuf
2022-02-24 14:51 ` [PATCH v2 14/39] x86/ibt,ftrace: Make function-graph play nice Peter Zijlstra
2022-02-24 15:36   ` Peter Zijlstra
2022-02-24 15:42     ` Steven Rostedt
2022-02-24 23:09       ` Peter Zijlstra
2022-02-24 14:51 ` [PATCH v2 15/39] x86/ibt,kprobes: Fix more +0 assumptions Peter Zijlstra
2022-02-25  0:58   ` Kees Cook
2022-02-25  1:32   ` Masami Hiramatsu
2022-02-25 10:46     ` Peter Zijlstra
2022-02-25 13:42       ` Masami Hiramatsu
2022-02-25 15:41         ` Peter Zijlstra
2022-02-26  2:10           ` Masami Hiramatsu
2022-02-26 11:48             ` Peter Zijlstra
2022-02-25 14:14       ` Steven Rostedt
2022-02-26  7:09         ` Masami Hiramatsu
2022-02-28  6:07   ` Masami Hiramatsu
2022-02-28 23:25     ` Peter Zijlstra
2022-03-01  2:49       ` Masami Hiramatsu
2022-03-01  8:28         ` Peter Zijlstra
2022-03-01 17:19           ` Naveen N. Rao
2022-03-01 19:12             ` Peter Zijlstra
2022-03-01 20:05               ` Peter Zijlstra
2022-03-02 15:59                 ` Naveen N. Rao
2022-03-02 16:38                   ` Peter Zijlstra
2022-03-02 16:17                 ` Naveen N. Rao
2022-03-02 19:32                   ` Peter Zijlstra
2022-03-02 19:39                     ` Peter Zijlstra
2022-03-03 12:11                       ` Naveen N. Rao
2022-03-03  1:54                   ` Masami Hiramatsu
2022-03-02  0:11           ` Masami Hiramatsu
2022-03-02 10:25             ` Peter Zijlstra
2022-03-01 17:03       ` Naveen N. Rao
2022-02-24 14:51 ` [PATCH v2 16/39] x86/bpf: Add ENDBR instructions to prologue and trampoline Peter Zijlstra
2022-02-24 23:37   ` Josh Poimboeuf
2022-02-25  0:59     ` Kees Cook
2022-02-25 11:20     ` Peter Zijlstra
2022-02-25 12:24     ` Peter Zijlstra
2022-02-25 22:46       ` Josh Poimboeuf
2022-02-24 14:51 ` [PATCH v2 17/39] x86/ibt,ftrace: Add ENDBR to samples/ftrace Peter Zijlstra
2022-02-24 14:51 ` [PATCH v2 18/39] x86/ibt: Add IBT feature, MSR and #CP handling Peter Zijlstra
2022-02-24 23:55   ` Josh Poimboeuf
2022-02-25 10:51     ` Peter Zijlstra
2022-02-25 11:10       ` Peter Zijlstra
2022-02-25 23:51       ` Josh Poimboeuf
2022-02-26 11:55         ` Peter Zijlstra
2022-02-25  1:09   ` Kees Cook
2022-02-25 19:59   ` Edgecombe, Rick P
2022-03-01 15:14     ` Peter Zijlstra
2022-03-01 21:02       ` Peter Zijlstra
2022-03-01 23:13         ` Josh Poimboeuf
2022-03-02  1:59           ` Edgecombe, Rick P
2022-03-02 13:49             ` Peter Zijlstra
2022-03-02 18:38               ` Kees Cook
2022-02-24 14:51 ` [PATCH v2 19/39] x86: Disable IBT around firmware Peter Zijlstra
2022-02-25  1:10   ` Kees Cook
2022-02-24 14:51 ` [PATCH v2 20/39] x86/bugs: Disable Retpoline when IBT Peter Zijlstra
2022-02-25  1:11   ` Kees Cook
2022-02-25  2:22     ` Josh Poimboeuf
2022-02-25 10:55     ` Peter Zijlstra
2022-02-24 14:51 ` [PATCH v2 21/39] x86/ibt: Annotate text references Peter Zijlstra
2022-02-25  0:47   ` Josh Poimboeuf
2022-02-25 12:57     ` Peter Zijlstra
2022-02-25 13:04     ` Peter Zijlstra
2022-02-24 14:52 ` [PATCH v2 22/39] x86/ibt,ftrace: Annotate ftrace code patching Peter Zijlstra
2022-02-24 14:52 ` [PATCH v2 23/39] x86/ibt,sev: Annotations Peter Zijlstra
2022-02-24 14:52 ` [PATCH v2 24/39] x86/text-patching: Make text_gen_insn() IBT aware Peter Zijlstra
2022-02-25  0:49   ` Josh Poimboeuf
2022-02-24 14:52 ` [PATCH v2 25/39] x86/ibt,paravirt: Use text_gen_insn() for paravirt_patch() Peter Zijlstra
2022-02-24 14:52 ` [PATCH v2 26/39] x86/entry: Cleanup PARAVIRT Peter Zijlstra
2022-02-24 14:52 ` [PATCH v2 27/39] x86/entry,xen: Early rewrite of restore_regs_and_return_to_kernel() Peter Zijlstra
2022-02-24 17:51   ` Andrew Cooper
2022-02-24 14:52 ` [PATCH v2 28/39] x86/ibt,xen: Sprinkle the ENDBR Peter Zijlstra
2022-02-25  0:54   ` Josh Poimboeuf
2022-02-25 13:16     ` Peter Zijlstra
2022-02-24 14:52 ` [PATCH v2 29/39] objtool: Rename --duplicate to --lto Peter Zijlstra
2022-02-24 14:52 ` [PATCH v2 30/39] Kbuild: Allow whole module objtool runs Peter Zijlstra
2022-02-24 14:52 ` [PATCH v2 31/39] objtool: Read the NOENDBR annotation Peter Zijlstra
2022-02-24 14:52 ` [PATCH v2 32/39] x86/ibt: Dont generate ENDBR in .discard.text Peter Zijlstra
2022-02-24 14:52 ` [PATCH v2 33/39] objtool: Add IBT/ENDBR decoding Peter Zijlstra
2022-03-03 10:53   ` Miroslav Benes
2022-03-03 11:06     ` Andrew Cooper
2022-03-03 12:33       ` Miroslav Benes
2022-03-03 14:13         ` Peter Zijlstra
2022-02-24 14:52 ` [PATCH v2 34/39] objtool: Validate IBT assumptions Peter Zijlstra
2022-02-27  3:13   ` Josh Poimboeuf
2022-02-27 17:00     ` Peter Zijlstra
2022-02-27 22:20       ` Josh Poimboeuf
2022-02-28  9:47         ` Peter Zijlstra
2022-02-28 18:36           ` Josh Poimboeuf
2022-02-28 20:10             ` Peter Zijlstra
2022-02-28  9:26       ` Peter Zijlstra
2022-02-28 18:39         ` Josh Poimboeuf
2022-02-24 14:52 ` [PATCH v2 35/39] objtool: IBT fix direct JMP/CALL Peter Zijlstra
2022-02-24 14:52 ` [PATCH v2 36/39] objtool: Find unused ENDBR instructions Peter Zijlstra
2022-02-27  3:46   ` Josh Poimboeuf
2022-02-28 12:41     ` Peter Zijlstra
2022-02-28 17:36       ` Josh Poimboeuf
2022-02-24 14:52 ` [PATCH v2 37/39] x86/ibt: Finish --ibt-fix-direct on module loading Peter Zijlstra
2022-02-24 14:52 ` [PATCH v2 38/39] x86/ibt: Ensure module init/exit points have references Peter Zijlstra
2022-02-24 14:52 ` [PATCH v2 39/39] x86/alternative: Use .ibt_endbr_sites to seal indirect calls Peter Zijlstra
2022-02-24 20:26 ` [PATCH v2 00/39] x86: Kernel IBT Josh Poimboeuf
2022-02-25 15:28   ` Peter Zijlstra
2022-02-25 15:43     ` Peter Zijlstra
2022-02-25 17:26       ` Josh Poimboeuf
2022-02-25 17:32         ` Steven Rostedt
2022-02-25 19:53           ` Peter Zijlstra
2022-02-25 20:15             ` Josh Poimboeuf
2022-03-01 23:10     ` Josh Poimboeuf
2022-03-02 10:20       ` 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=YiDlx0J1KMNP39if@hirez.programming.kicks-ass.net \
    --to=peterz@infradead.org \
    --cc=alexei.starovoitov@gmail.com \
    --cc=alyssa.milburn@intel.com \
    --cc=andrew.cooper3@citrix.com \
    --cc=hjl.tools@gmail.com \
    --cc=joao@overdrivepizza.com \
    --cc=jpoimboe@redhat.com \
    --cc=keescook@chromium.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mark.rutland@arm.com \
    --cc=mbenes@suse.cz \
    --cc=mhiramat@kernel.org \
    --cc=naveen.n.rao@linux.vnet.ibm.com \
    --cc=ndesaulniers@google.com \
    --cc=rostedt@goodmis.org \
    --cc=samitolvanen@google.com \
    --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;
as well as URLs for NNTP newsgroup(s).