From: "Naveen N. Rao" <naveen.n.rao@linux.vnet.ibm.com> To: Michael Ellerman <mpe@ellerman.id.au>, Steven Rostedt <rostedt@goodmis.org>, Masami Hiramatsu <mhiramat@kernel.org>, Ingo Molnar <mingo@kernel.org>, Nicholas Piggin <npiggin@gmail.com> Cc: <linuxppc-dev@lists.ozlabs.org>, <linux-kernel@vger.kernel.org> Subject: [PATCH 5/7] powerpc/ftrace: Update ftrace_location() for powerpc -mprofile-kernel Date: Tue, 18 Jun 2019 20:17:04 +0530 [thread overview] Message-ID: <186656540d3e6225abd98374e791a13d10d86fab.1560868106.git.naveen.n.rao@linux.vnet.ibm.com> (raw) In-Reply-To: <cover.1560868106.git.naveen.n.rao@linux.vnet.ibm.com> Now that we are patching the preceding 'mflr r0' instruction with -mprofile-kernel, we need to update ftrace_location[_range]() to recognise that as being part of ftrace. To do this, we make a small change to ftrace_location_range() and convert ftrace_cmp_recs() into a weak function. We implement a custom version of ftrace_cmp_recs() which looks at the instruction preceding the branch to _mcount() and marks that instruction as belonging to ftrace if it is a 'nop' or 'mflr r0'. Signed-off-by: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com> --- arch/powerpc/kernel/trace/ftrace.c | 31 ++++++++++++++++++++++++++++++ include/linux/ftrace.h | 1 + kernel/trace/ftrace.c | 4 ++-- 3 files changed, 34 insertions(+), 2 deletions(-) diff --git a/arch/powerpc/kernel/trace/ftrace.c b/arch/powerpc/kernel/trace/ftrace.c index 5e2b29808af1..b84046e43207 100644 --- a/arch/powerpc/kernel/trace/ftrace.c +++ b/arch/powerpc/kernel/trace/ftrace.c @@ -951,6 +951,37 @@ void arch_ftrace_update_code(int command) } #ifdef CONFIG_MPROFILE_KERNEL +/* + * We need to check if the previous instruction is a 'nop' or 'mflr r0'. + * If so, we will patch those subsequently and that instruction must be + * considered as part of ftrace. + */ +int ftrace_cmp_recs(const void *a, const void *b) +{ + const struct dyn_ftrace *key = a; + const struct dyn_ftrace *rec = b; + unsigned int op; + + if (key->flags < rec->ip - MCOUNT_INSN_SIZE) + return -1; + if (key->ip >= rec->ip + MCOUNT_INSN_SIZE) + return 1; + + if (key->flags > rec->ip) + return 0; + + /* check the previous instruction */ + if (probe_kernel_read(&op, (void *)rec->ip - MCOUNT_INSN_SIZE, + sizeof(op))) + /* assume we own it */ + return 0; + + if (op != PPC_INST_NOP && op != PPC_INST_MFLR) + return -1; + + return 0; +} + /* Returns 1 if we patched in the mflr */ static int __ftrace_make_call_prep(struct dyn_ftrace *rec) { diff --git a/include/linux/ftrace.h b/include/linux/ftrace.h index fa653a561da5..9941987bf510 100644 --- a/include/linux/ftrace.h +++ b/include/linux/ftrace.h @@ -435,6 +435,7 @@ struct dyn_ftrace *ftrace_rec_iter_record(struct ftrace_rec_iter *iter); int ftrace_update_record(struct dyn_ftrace *rec, int enable); int ftrace_test_record(struct dyn_ftrace *rec, int enable); void ftrace_run_stop_machine(int command); +int ftrace_cmp_recs(const void *a, const void *b); unsigned long ftrace_location(unsigned long ip); unsigned long ftrace_location_range(unsigned long start, unsigned long end); unsigned long ftrace_get_addr_new(struct dyn_ftrace *rec); diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c index 21d8e201ee80..b5c61db0b452 100644 --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c @@ -1517,7 +1517,7 @@ ftrace_ops_test(struct ftrace_ops *ops, unsigned long ip, void *regs) } -static int ftrace_cmp_recs(const void *a, const void *b) +int __weak ftrace_cmp_recs(const void *a, const void *b) { const struct dyn_ftrace *key = a; const struct dyn_ftrace *rec = b; @@ -1551,7 +1551,7 @@ unsigned long ftrace_location_range(unsigned long start, unsigned long end) key.flags = end; /* overload flags, as it is unsigned long */ for (pg = ftrace_pages_start; pg; pg = pg->next) { - if (end < pg->records[0].ip || + if (end <= pg->records[0].ip || start >= (pg->records[pg->index - 1].ip + MCOUNT_INSN_SIZE)) continue; rec = bsearch(&key, pg->records, pg->index, -- 2.22.0
WARNING: multiple messages have this Message-ID (diff)
From: "Naveen N. Rao" <naveen.n.rao@linux.vnet.ibm.com> To: Michael Ellerman <mpe@ellerman.id.au>, Steven Rostedt <rostedt@goodmis.org>, Masami Hiramatsu <mhiramat@kernel.org>, Ingo Molnar <mingo@kernel.org>, Nicholas Piggin <npiggin@gmail.com> Cc: linuxppc-dev@lists.ozlabs.org, linux-kernel@vger.kernel.org Subject: [PATCH 5/7] powerpc/ftrace: Update ftrace_location() for powerpc -mprofile-kernel Date: Tue, 18 Jun 2019 20:17:04 +0530 [thread overview] Message-ID: <186656540d3e6225abd98374e791a13d10d86fab.1560868106.git.naveen.n.rao@linux.vnet.ibm.com> (raw) In-Reply-To: <cover.1560868106.git.naveen.n.rao@linux.vnet.ibm.com> Now that we are patching the preceding 'mflr r0' instruction with -mprofile-kernel, we need to update ftrace_location[_range]() to recognise that as being part of ftrace. To do this, we make a small change to ftrace_location_range() and convert ftrace_cmp_recs() into a weak function. We implement a custom version of ftrace_cmp_recs() which looks at the instruction preceding the branch to _mcount() and marks that instruction as belonging to ftrace if it is a 'nop' or 'mflr r0'. Signed-off-by: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com> --- arch/powerpc/kernel/trace/ftrace.c | 31 ++++++++++++++++++++++++++++++ include/linux/ftrace.h | 1 + kernel/trace/ftrace.c | 4 ++-- 3 files changed, 34 insertions(+), 2 deletions(-) diff --git a/arch/powerpc/kernel/trace/ftrace.c b/arch/powerpc/kernel/trace/ftrace.c index 5e2b29808af1..b84046e43207 100644 --- a/arch/powerpc/kernel/trace/ftrace.c +++ b/arch/powerpc/kernel/trace/ftrace.c @@ -951,6 +951,37 @@ void arch_ftrace_update_code(int command) } #ifdef CONFIG_MPROFILE_KERNEL +/* + * We need to check if the previous instruction is a 'nop' or 'mflr r0'. + * If so, we will patch those subsequently and that instruction must be + * considered as part of ftrace. + */ +int ftrace_cmp_recs(const void *a, const void *b) +{ + const struct dyn_ftrace *key = a; + const struct dyn_ftrace *rec = b; + unsigned int op; + + if (key->flags < rec->ip - MCOUNT_INSN_SIZE) + return -1; + if (key->ip >= rec->ip + MCOUNT_INSN_SIZE) + return 1; + + if (key->flags > rec->ip) + return 0; + + /* check the previous instruction */ + if (probe_kernel_read(&op, (void *)rec->ip - MCOUNT_INSN_SIZE, + sizeof(op))) + /* assume we own it */ + return 0; + + if (op != PPC_INST_NOP && op != PPC_INST_MFLR) + return -1; + + return 0; +} + /* Returns 1 if we patched in the mflr */ static int __ftrace_make_call_prep(struct dyn_ftrace *rec) { diff --git a/include/linux/ftrace.h b/include/linux/ftrace.h index fa653a561da5..9941987bf510 100644 --- a/include/linux/ftrace.h +++ b/include/linux/ftrace.h @@ -435,6 +435,7 @@ struct dyn_ftrace *ftrace_rec_iter_record(struct ftrace_rec_iter *iter); int ftrace_update_record(struct dyn_ftrace *rec, int enable); int ftrace_test_record(struct dyn_ftrace *rec, int enable); void ftrace_run_stop_machine(int command); +int ftrace_cmp_recs(const void *a, const void *b); unsigned long ftrace_location(unsigned long ip); unsigned long ftrace_location_range(unsigned long start, unsigned long end); unsigned long ftrace_get_addr_new(struct dyn_ftrace *rec); diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c index 21d8e201ee80..b5c61db0b452 100644 --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c @@ -1517,7 +1517,7 @@ ftrace_ops_test(struct ftrace_ops *ops, unsigned long ip, void *regs) } -static int ftrace_cmp_recs(const void *a, const void *b) +int __weak ftrace_cmp_recs(const void *a, const void *b) { const struct dyn_ftrace *key = a; const struct dyn_ftrace *rec = b; @@ -1551,7 +1551,7 @@ unsigned long ftrace_location_range(unsigned long start, unsigned long end) key.flags = end; /* overload flags, as it is unsigned long */ for (pg = ftrace_pages_start; pg; pg = pg->next) { - if (end < pg->records[0].ip || + if (end <= pg->records[0].ip || start >= (pg->records[pg->index - 1].ip + MCOUNT_INSN_SIZE)) continue; rec = bsearch(&key, pg->records, pg->index, -- 2.22.0
next prev parent reply other threads:[~2019-06-18 14:50 UTC|newest] Thread overview: 45+ messages / expand[flat|nested] mbox.gz Atom feed top 2019-06-18 14:46 [PATCH 0/7] powerpc/ftrace: Patch out -mprofile-kernel instructions Naveen N. Rao 2019-06-18 14:46 ` Naveen N. Rao 2019-06-18 14:47 ` [PATCH 1/7] ftrace: Expose flags used for ftrace_replace_code() Naveen N. Rao 2019-06-18 14:47 ` Naveen N. Rao 2019-06-18 14:47 ` [PATCH 2/7] x86/ftrace: Fix use of flags in ftrace_replace_code() Naveen N. Rao 2019-06-18 14:47 ` Naveen N. Rao 2019-06-18 14:47 ` [PATCH 3/7] ftrace: Expose __ftrace_replace_code() Naveen N. Rao 2019-06-18 14:47 ` Naveen N. Rao 2019-06-18 14:47 ` [PATCH 4/7] powerpc/ftrace: Additionally nop out the preceding mflr with -mprofile-kernel Naveen N. Rao 2019-06-18 14:47 ` Naveen N. Rao 2019-06-19 5:14 ` Michael Ellerman 2019-06-19 7:10 ` Nicholas Piggin 2019-06-19 7:10 ` Nicholas Piggin 2019-06-19 9:53 ` Naveen N. Rao 2019-06-19 9:53 ` Naveen N. Rao 2019-06-19 10:41 ` Nicholas Piggin 2019-06-19 10:41 ` Nicholas Piggin 2019-06-19 17:14 ` Naveen N. Rao 2019-06-19 17:14 ` Naveen N. Rao 2019-06-18 14:47 ` Naveen N. Rao [this message] 2019-06-18 14:47 ` [PATCH 5/7] powerpc/ftrace: Update ftrace_location() for powerpc -mprofile-kernel Naveen N. Rao 2019-06-18 15:45 ` Steven Rostedt 2019-06-18 15:45 ` Steven Rostedt 2019-06-18 18:11 ` Naveen N. Rao 2019-06-18 18:11 ` Naveen N. Rao 2019-06-18 18:23 ` Naveen N. Rao 2019-06-18 18:23 ` Naveen N. Rao 2019-06-18 18:32 ` Steven Rostedt 2019-06-18 18:32 ` Steven Rostedt 2019-06-19 7:56 ` Naveen N. Rao 2019-06-19 7:56 ` Naveen N. Rao 2019-06-19 9:28 ` Steven Rostedt 2019-06-19 9:28 ` Steven Rostedt 2019-06-18 14:47 ` [PATCH 6/7] kprobes/ftrace: Use ftrace_location() when [dis]arming probes Naveen N. Rao 2019-06-18 14:47 ` Naveen N. Rao 2019-06-21 14:41 ` Masami Hiramatsu 2019-06-21 14:41 ` Masami Hiramatsu 2019-06-18 14:47 ` [PATCH 7/7] powerpc/kprobes: Allow probing on any ftrace address Naveen N. Rao 2019-06-18 14:47 ` Naveen N. Rao 2019-06-21 14:50 ` Masami Hiramatsu 2019-06-21 14:50 ` Masami Hiramatsu 2019-06-22 3:49 ` Joe Perches 2019-06-22 3:49 ` Joe Perches 2019-06-26 9:39 ` Naveen N. Rao 2019-06-26 9:39 ` Naveen N. Rao
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=186656540d3e6225abd98374e791a13d10d86fab.1560868106.git.naveen.n.rao@linux.vnet.ibm.com \ --to=naveen.n.rao@linux.vnet.ibm.com \ --cc=linux-kernel@vger.kernel.org \ --cc=linuxppc-dev@lists.ozlabs.org \ --cc=mhiramat@kernel.org \ --cc=mingo@kernel.org \ --cc=mpe@ellerman.id.au \ --cc=npiggin@gmail.com \ --cc=rostedt@goodmis.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: linkBe 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.