From: Amit Daniel Kachhap <amit.kachhap@arm.com> To: Mark Rutland <mark.rutland@arm.com>, linux-arm-kernel@lists.infradead.org, Steven Rostedt <rostedt@goodmis.org> Cc: linux-kernel@vger.kernel.org, catalin.marinas@arm.com, deller@gmx.de, duwe@suse.de, James.Bottomley@HansenPartnership.com, james.morse@arm.com, jeyu@kernel.org, jpoimboe@redhat.com, jthierry@redhat.com, linux-parisc@vger.kernel.org, mingo@redhat.com, peterz@infradead.org, svens@stackframe.org, takahiro.akashi@linaro.org, will@kernel.org Subject: Re: [PATCHv2 1/8] ftrace: add ftrace_init_nop() Date: Sat, 2 Nov 2019 17:49:00 +0530 Message-ID: <daad0785-a33f-3cfb-cf0f-657b6c677257@arm.com> (raw) In-Reply-To: <20191029165832.33606-2-mark.rutland@arm.com> Hi Mark, On 10/29/19 10:28 PM, Mark Rutland wrote: > Architectures may need to perform special initialization of ftrace > callsites, and today they do so by special-casing ftrace_make_nop() when > the expected branch address is MCOUNT_ADDR. In some cases (e.g. for > patchable-function-entry), we don't have an mcount-like symbol and don't s/an mcount/a mcount. > want a synthetic MCOUNT_ADDR, but we may need to perform some > initialization of callsites. > > To make it possible to separate initialization from runtime > modification, and to handle cases without an mcount-like symbol, this Same as above. > patch adds an optional ftrace_init_nop() function that architectures can > implement, which does not pass a branch address. > > Where an architecture does not provide ftrace_init_nop(), we will fall > back to the existing behaviour of calling ftrace_make_nop() with > MCOUNT_ADDR. > > At the same time, ftrace_code_disable() is renamed to > ftrace_nop_initialize() to make it clearer that it is intended to > intialize a callsite into a disabled state, and is not for disabling a > callsite that has been runtime enabled. The kerneldoc description of rec > arguments is updated to cover non-mcount callsites. > > Signed-off-by: Mark Rutland <mark.rutland@arm.com> > Reviewed-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> > Cc: Ingo Molnar <mingo@redhat.com> > Cc: Steven Rostedt <rostedt@goodmis.org> > Cc: Torsten Duwe <duwe@suse.de> > --- > include/linux/ftrace.h | 35 ++++++++++++++++++++++++++++++++--- > kernel/trace/ftrace.c | 6 +++--- > 2 files changed, 35 insertions(+), 6 deletions(-) > > diff --git a/include/linux/ftrace.h b/include/linux/ftrace.h > index 8a8cb3c401b2..9867d90d635e 100644 > --- a/include/linux/ftrace.h > +++ b/include/linux/ftrace.h > @@ -499,7 +499,7 @@ static inline int ftrace_disable_ftrace_graph_caller(void) { return 0; } > /** > * ftrace_make_nop - convert code into nop > * @mod: module structure if called by module load initialization > - * @rec: the mcount call site record > + * @rec: the call site record (e.g. mcount/fentry) > * @addr: the address that the call site should be calling > * > * This is a very sensitive operation and great care needs > @@ -520,9 +520,38 @@ static inline int ftrace_disable_ftrace_graph_caller(void) { return 0; } > extern int ftrace_make_nop(struct module *mod, > struct dyn_ftrace *rec, unsigned long addr); > > + > +/** > + * ftrace_init_nop - initialize a nop call site > + * @mod: module structure if called by module load initialization > + * @rec: the call site record (e.g. mcount/fentry) > + * > + * This is a very sensitive operation and great care needs > + * to be taken by the arch. The operation should carefully > + * read the location, check to see if what is read is indeed > + * what we expect it to be, and then on success of the compare, > + * it should write to the location. > + * > + * The code segment at @rec->ip should contain the contents created by > + * the compiler Nit: Will it be better to write it as "@rec->ip should store the adjusted ftrace entry address of the call site" or something like that. > + * > + * Return must be: > + * 0 on success > + * -EFAULT on error reading the location > + * -EINVAL on a failed compare of the contents > + * -EPERM on error writing to the location > + * Any other value will be considered a failure. > + */ > +#ifndef ftrace_init_nop > +static inline int ftrace_init_nop(struct module *mod, struct dyn_ftrace *rec) > +{ > + return ftrace_make_nop(mod, rec, MCOUNT_ADDR); > +} > +#endif > + Now that ftrace_init_nop is also an arch implemented function so it may be added in Documentation/trace/ftrace-design.rst along with ftrace_make_nop. In general also, adding some description about patchable-function-entry in kernel Documentation will be useful. Thanks, Amit Daniel > /** > * ftrace_make_call - convert a nop call site into a call to addr > - * @rec: the mcount call site record > + * @rec: the call site record (e.g. mcount/fentry) > * @addr: the address that the call site should call > * > * This is a very sensitive operation and great care needs > @@ -545,7 +574,7 @@ extern int ftrace_make_call(struct dyn_ftrace *rec, unsigned long addr); > #ifdef CONFIG_DYNAMIC_FTRACE_WITH_REGS > /** > * ftrace_modify_call - convert from one addr to another (no nop) > - * @rec: the mcount call site record > + * @rec: the call site record (e.g. mcount/fentry) > * @old_addr: the address expected to be currently called to > * @addr: the address to change to > * > diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c > index f296d89be757..5259d4dea675 100644 > --- a/kernel/trace/ftrace.c > +++ b/kernel/trace/ftrace.c > @@ -2494,14 +2494,14 @@ struct dyn_ftrace *ftrace_rec_iter_record(struct ftrace_rec_iter *iter) > } > > static int > -ftrace_code_disable(struct module *mod, struct dyn_ftrace *rec) > +ftrace_nop_initialize(struct module *mod, struct dyn_ftrace *rec) > { > int ret; > > if (unlikely(ftrace_disabled)) > return 0; > > - ret = ftrace_make_nop(mod, rec, MCOUNT_ADDR); > + ret = ftrace_init_nop(mod, rec); > if (ret) { > ftrace_bug_type = FTRACE_BUG_INIT; > ftrace_bug(ret, rec); > @@ -2943,7 +2943,7 @@ static int ftrace_update_code(struct module *mod, struct ftrace_page *new_pgs) > * to the NOP instructions. > */ > if (!__is_defined(CC_USING_NOP_MCOUNT) && > - !ftrace_code_disable(mod, p)) > + !ftrace_nop_initialize(mod, p)) > break; > > update_cnt++; >
next prev parent reply index Thread overview: 48+ messages / expand[flat|nested] mbox.gz Atom feed top 2019-10-29 16:58 [PATCHv2 0/8] arm64: ftrace cleanup + FTRACE_WITH_REGS Mark Rutland 2019-10-29 16:58 ` [PATCHv2 1/8] ftrace: add ftrace_init_nop() Mark Rutland 2019-10-30 15:00 ` Miroslav Benes 2019-11-02 12:19 ` Amit Daniel Kachhap [this message] 2019-11-04 13:11 ` Steven Rostedt 2019-11-05 6:59 ` Amit Kachhap 2019-11-04 13:36 ` Mark Rutland 2019-11-05 6:47 ` Amit Kachhap 2019-11-06 14:15 ` Mark Rutland 2019-11-07 4:40 ` Amit Kachhap 2019-11-04 13:16 ` Steven Rostedt 2019-11-04 13:38 ` Mark Rutland 2019-11-04 13:53 ` Steven Rostedt 2019-10-29 16:58 ` [PATCHv2 2/8] module/ftrace: handle patchable-function-entry Mark Rutland 2019-10-30 15:03 ` Torsten Duwe 2019-10-31 9:02 ` Mark Rutland 2019-10-31 11:42 ` Torsten Duwe 2019-10-31 13:00 ` Mark Rutland 2019-11-04 13:28 ` Steven Rostedt 2019-11-04 14:00 ` Mark Rutland 2019-11-04 13:25 ` Steven Rostedt 2019-11-04 15:51 ` Mark Rutland 2019-11-04 20:58 ` Helge Deller 2019-11-05 8:59 ` Miroslav Benes 2019-10-29 16:58 ` [PATCHv2 3/8] arm64: module: rework special section handling Mark Rutland 2019-10-30 15:25 ` Miroslav Benes 2019-10-29 16:58 ` [PATCHv2 4/8] arm64: module/ftrace: intialize PLT at load time Mark Rutland 2019-11-02 12:20 ` Amit Daniel Kachhap 2019-11-04 13:55 ` Mark Rutland 2019-10-29 16:58 ` [PATCHv2 5/8] arm64: insn: add encoder for MOV (register) Mark Rutland 2019-10-29 16:58 ` [PATCHv2 6/8] arm64: asm-offsets: add S_FP Mark Rutland 2019-10-29 16:58 ` [PATCHv2 7/8] arm64: implement ftrace with regs Mark Rutland 2019-11-02 12:21 ` Amit Daniel Kachhap 2019-11-04 13:51 ` Mark Rutland [not found] ` <CANW9uyug8WKN2fR-FmcW-C_OO_OQ_AvukM+BR7wqiJ9eFQMO9Q@mail.gmail.com> 2019-11-15 7:45 ` Torsten Duwe 2019-11-15 13:59 ` Mark Rutland 2019-10-29 16:58 ` [PATCHv2 8/8] arm64: ftrace: minimize ifdeffery Mark Rutland 2019-10-30 17:02 ` [PATCHv2 0/8] arm64: ftrace cleanup + FTRACE_WITH_REGS Torsten Duwe 2019-10-31 17:16 ` Torsten Duwe 2019-11-01 9:08 ` Mark Rutland 2019-11-01 15:39 ` Sven Schnelle 2019-11-01 16:28 ` Mark Rutland 2019-11-02 12:12 ` Amit Daniel Kachhap 2019-11-04 12:56 ` Will Deacon 2019-11-04 13:03 ` Amit Kachhap 2019-11-04 14:04 ` Mark Rutland 2019-11-05 7:06 ` Amit Kachhap 2019-11-07 11:31 ` Catalin Marinas
Reply instructions: You may reply publically 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=daad0785-a33f-3cfb-cf0f-657b6c677257@arm.com \ --to=amit.kachhap@arm.com \ --cc=James.Bottomley@HansenPartnership.com \ --cc=catalin.marinas@arm.com \ --cc=deller@gmx.de \ --cc=duwe@suse.de \ --cc=james.morse@arm.com \ --cc=jeyu@kernel.org \ --cc=jpoimboe@redhat.com \ --cc=jthierry@redhat.com \ --cc=linux-arm-kernel@lists.infradead.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-parisc@vger.kernel.org \ --cc=mark.rutland@arm.com \ --cc=mingo@redhat.com \ --cc=peterz@infradead.org \ --cc=rostedt@goodmis.org \ --cc=svens@stackframe.org \ --cc=takahiro.akashi@linaro.org \ --cc=will@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
Linux-parisc archive on lore.kernel.org Archives are clonable: git clone --mirror https://lore.kernel.org/linux-parisc/0 linux-parisc/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 linux-parisc linux-parisc/ https://lore.kernel.org/linux-parisc \ linux-parisc@vger.kernel.org public-inbox-index linux-parisc Example config snippet for mirrors Newsgroup available over NNTP: nntp://nntp.lore.kernel.org/org.kernel.vger.linux-parisc AGPL code for this site: git clone https://public-inbox.org/public-inbox.git