From: Peter Zijlstra <peterz@infradead.org> To: x86@kernel.org Cc: peterz@infradead.org, linux-kernel@vger.kernel.org, rostedt@goodmis.org, mhiramat@kernel.org, bristot@redhat.com, jbaron@akamai.com, torvalds@linux-foundation.org, tglx@linutronix.de, mingo@kernel.org, namit@vmware.com, hpa@zytor.com, luto@kernel.org, ard.biesheuvel@linaro.org, jpoimboe@redhat.com, jeyu@kernel.org Subject: [PATCH v4 16/16] ftrace: Merge ftrace_module_{init,enable}() Date: Fri, 18 Oct 2019 09:35:41 +0200 [thread overview] Message-ID: <20191018074634.858645375@infradead.org> (raw) In-Reply-To: <20191018073525.768931536@infradead.org> Because of how some architectures used set_all_modules_text_*() there was a dependency between the module state and its memory protection state. This then required ftrace to be split into two functions, see commit: a949ae560a51 ("ftrace/module: Hardcode ftrace_module_init() call into load_module()") Now that set_all_modules_text_*() is dead and burried, this is no longer relevant and we can merge the ftrace_module hooks again. Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Cc: Steven Rostedt <rostedt@goodmis.org> --- include/linux/ftrace.h | 2 kernel/module.c | 3 - kernel/trace/ftrace.c | 124 +++++++++++++++++++------------------------------ 3 files changed, 49 insertions(+), 80 deletions(-) --- a/include/linux/ftrace.h +++ b/include/linux/ftrace.h @@ -579,7 +579,6 @@ static inline int ftrace_modify_call(str extern int ftrace_arch_read_dyn_info(char *buf, int size); extern int skip_trace(unsigned long ip); -extern void ftrace_module_init(struct module *mod); extern void ftrace_module_enable(struct module *mod); extern void ftrace_release_mod(struct module *mod); @@ -590,7 +589,6 @@ static inline int skip_trace(unsigned lo static inline int ftrace_force_update(void) { return 0; } static inline void ftrace_disable_daemon(void) { } static inline void ftrace_enable_daemon(void) { } -static inline void ftrace_module_init(struct module *mod) { } static inline void ftrace_module_enable(struct module *mod) { } static inline void ftrace_release_mod(struct module *mod) { } static inline int ftrace_text_reserved(const void *start, const void *end) --- a/kernel/module.c +++ b/kernel/module.c @@ -3836,9 +3836,6 @@ static int load_module(struct load_info dynamic_debug_setup(mod, info->debug, info->num_debug); - /* Ftrace init must be called in the MODULE_STATE_UNFORMED state */ - ftrace_module_init(mod); - /* Finally it's fully formed, ready to start executing. */ err = complete_formation(mod, info); if (err) --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c @@ -5564,6 +5564,8 @@ static int ftrace_cmp_ips(const void *a, return 0; } +static int referenced_filters(struct dyn_ftrace *rec); + static int ftrace_process_locs(struct module *mod, unsigned long *start, unsigned long *end) @@ -5656,6 +5658,49 @@ static int ftrace_process_locs(struct mo ftrace_update_code(mod, start_pg); if (!mod) local_irq_restore(flags); + +#ifdef CONFIG_MODULES + if (ftrace_disabled || !mod) + goto out_loop; + + do_for_each_ftrace_rec(pg, rec) { + int cnt; + /* + * do_for_each_ftrace_rec() is a double loop. + * module text shares the pg. If a record is + * not part of this module, then skip this pg, + * which the "break" will do. + */ + if (!within_module_core(rec->ip, mod) && + !within_module_init(rec->ip, mod)) + break; + + cnt = 0; + + /* + * When adding a module, we need to check if tracers are + * currently enabled and if they are, and can trace this record, + * we need to enable the module functions as well as update the + * reference counts for those function records. + */ + if (ftrace_start_up) + cnt += referenced_filters(rec); + + /* This clears FTRACE_FL_DISABLED */ + rec->flags = cnt; + + if (ftrace_start_up && cnt) { + int failed = __ftrace_replace_code(rec, 1); + if (failed) { + ftrace_bug(failed, rec); + goto out_loop; + } + } + + } while_for_each_ftrace_rec(); + + out_loop: +#endif ret = 0; out: mutex_unlock(&ftrace_lock); @@ -5823,85 +5868,14 @@ void ftrace_release_mod(struct module *m void ftrace_module_enable(struct module *mod) { - struct dyn_ftrace *rec; - struct ftrace_page *pg; - - mutex_lock(&ftrace_lock); - - if (ftrace_disabled) - goto out_unlock; - - /* - * If the tracing is enabled, go ahead and enable the record. - * - * The reason not to enable the record immediately is the - * inherent check of ftrace_make_nop/ftrace_make_call for - * correct previous instructions. Making first the NOP - * conversion puts the module to the correct state, thus - * passing the ftrace_make_call check. - * - * We also delay this to after the module code already set the - * text to read-only, as we now need to set it back to read-write - * so that we can modify the text. - */ - if (ftrace_start_up) - ftrace_arch_code_modify_prepare(); - - do_for_each_ftrace_rec(pg, rec) { - int cnt; - /* - * do_for_each_ftrace_rec() is a double loop. - * module text shares the pg. If a record is - * not part of this module, then skip this pg, - * which the "break" will do. - */ - if (!within_module_core(rec->ip, mod) && - !within_module_init(rec->ip, mod)) - break; - - cnt = 0; - - /* - * When adding a module, we need to check if tracers are - * currently enabled and if they are, and can trace this record, - * we need to enable the module functions as well as update the - * reference counts for those function records. - */ - if (ftrace_start_up) - cnt += referenced_filters(rec); - - /* This clears FTRACE_FL_DISABLED */ - rec->flags = cnt; - - if (ftrace_start_up && cnt) { - int failed = __ftrace_replace_code(rec, 1); - if (failed) { - ftrace_bug(failed, rec); - goto out_loop; - } - } - - } while_for_each_ftrace_rec(); - - out_loop: - if (ftrace_start_up) - ftrace_arch_code_modify_post_process(); - - out_unlock: - mutex_unlock(&ftrace_lock); + if (!(ftrace_disabled || !mod->num_ftrace_callsites)) { + ftrace_process_locs(mod, mod->ftrace_callsites, + mod->ftrace_callsites + mod->num_ftrace_callsites); + } process_cached_mods(mod->name); } -void ftrace_module_init(struct module *mod) -{ - if (ftrace_disabled || !mod->num_ftrace_callsites) - return; - - ftrace_process_locs(mod, mod->ftrace_callsites, - mod->ftrace_callsites + mod->num_ftrace_callsites); -} - static void save_ftrace_mod_rec(struct ftrace_mod_map *mod_map, struct dyn_ftrace *rec) {
next prev parent reply other threads:[~2019-10-18 7:52 UTC|newest] Thread overview: 70+ messages / expand[flat|nested] mbox.gz Atom feed top 2019-10-18 7:35 [PATCH v4 00/16] Rewrite x86/ftrace to use text_poke (and more) Peter Zijlstra 2019-10-18 7:35 ` [PATCH v4 01/16] x86/alternatives: Teach text_poke_bp() to emulate instructions Peter Zijlstra 2019-10-18 7:35 ` [PATCH v4 02/16] x86/alternatives: Update int3_emulate_push() comment Peter Zijlstra 2019-10-18 7:35 ` [PATCH v4 03/16] x86/alternatives,jump_label: Provide better text_poke() batching interface Peter Zijlstra 2019-10-21 8:48 ` Ingo Molnar 2019-10-21 9:21 ` Peter Zijlstra 2019-10-18 7:35 ` [PATCH v4 04/16] x86/alternatives: Add and use text_gen_insn() helper Peter Zijlstra 2019-10-18 7:35 ` [PATCH v4 05/16] x86/ftrace: Use text_poke() Peter Zijlstra 2019-10-18 7:35 ` [PATCH v4 06/16] x86/mm: Remove set_kernel_text_r[ow]() Peter Zijlstra 2019-10-18 7:35 ` [PATCH v4 07/16] x86/alternative: Add text_opcode_size() Peter Zijlstra 2019-10-18 7:35 ` [PATCH v4 08/16] x86/ftrace: Use text_gen_insn() Peter Zijlstra 2019-10-18 7:35 ` [PATCH v4 09/16] x86/alternative: Remove text_poke_loc::len Peter Zijlstra 2019-10-21 8:58 ` Ingo Molnar 2019-10-21 9:02 ` Ingo Molnar 2019-10-18 7:35 ` [PATCH v4 10/16] x86/alternative: Shrink text_poke_loc Peter Zijlstra 2019-10-21 9:01 ` Ingo Molnar 2019-10-21 9:25 ` Peter Zijlstra 2019-10-21 9:33 ` Ingo Molnar 2019-10-18 7:35 ` [PATCH v4 11/16] x86/kprobes: Convert to text-patching.h Peter Zijlstra 2019-10-21 14:57 ` Masami Hiramatsu 2019-10-18 7:35 ` [PATCH v4 12/16] x86/kprobes: Fix ordering Peter Zijlstra 2019-10-22 1:35 ` Masami Hiramatsu 2019-10-22 10:31 ` Peter Zijlstra 2019-10-18 7:35 ` [PATCH v4 13/16] arm/ftrace: Use __patch_text_real() Peter Zijlstra 2019-10-28 16:25 ` Will Deacon 2019-10-28 16:34 ` Peter Zijlstra 2019-10-28 16:35 ` Peter Zijlstra 2019-10-28 16:47 ` Will Deacon 2019-10-28 16:55 ` Peter Zijlstra 2019-10-18 7:35 ` [PATCH v4 14/16] module: Remove set_all_modules_text_*() Peter Zijlstra 2019-10-18 7:35 ` [PATCH v4 15/16] module: Move where we mark modules RO,X Peter Zijlstra 2019-10-21 13:53 ` Josh Poimboeuf 2019-10-21 14:14 ` Peter Zijlstra 2019-10-21 15:34 ` Peter Zijlstra 2019-10-21 15:44 ` Peter Zijlstra 2019-10-21 16:11 ` Peter Zijlstra 2019-10-22 11:31 ` Heiko Carstens 2019-10-22 12:31 ` Peter Zijlstra 2019-10-23 11:48 ` Peter Zijlstra 2019-10-23 15:16 ` Peter Zijlstra 2019-10-23 17:15 ` Josh Poimboeuf 2019-10-24 10:59 ` Peter Zijlstra 2019-10-24 18:31 ` Josh Poimboeuf 2019-10-24 20:33 ` Peter Zijlstra 2019-10-23 17:00 ` Josh Poimboeuf 2019-10-24 13:16 ` Peter Zijlstra 2019-10-25 6:44 ` Petr Mladek 2019-10-25 8:43 ` Peter Zijlstra 2019-10-25 10:06 ` Peter Zijlstra 2019-10-25 13:50 ` Josh Poimboeuf 2019-10-26 1:17 ` Josh Poimboeuf 2019-10-28 10:07 ` Peter Zijlstra 2019-10-28 10:43 ` Peter Zijlstra 2019-10-25 9:16 ` Peter Zijlstra 2019-10-22 2:21 ` Steven Rostedt 2019-10-22 20:24 ` Peter Zijlstra 2019-10-22 20:40 ` Steven Rostedt 2019-10-23 9:07 ` Peter Zijlstra 2019-10-23 18:52 ` Steven Rostedt 2019-10-24 10:16 ` Peter Zijlstra 2019-10-24 10:18 ` Peter Zijlstra 2019-10-24 15:00 ` Steven Rostedt 2019-10-24 16:43 ` Peter Zijlstra 2019-10-24 18:17 ` Steven Rostedt 2019-10-24 20:24 ` Peter Zijlstra 2019-10-24 20:28 ` Steven Rostedt 2019-10-18 7:35 ` Peter Zijlstra [this message] 2019-10-18 8:20 ` [PATCH v4 16/16] ftrace: Merge ftrace_module_{init,enable}() Peter Zijlstra 2019-10-21 9:09 ` [PATCH v4 00/16] Rewrite x86/ftrace to use text_poke (and more) Ingo Molnar 2019-10-21 13:38 ` 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=20191018074634.858645375@infradead.org \ --to=peterz@infradead.org \ --cc=ard.biesheuvel@linaro.org \ --cc=bristot@redhat.com \ --cc=hpa@zytor.com \ --cc=jbaron@akamai.com \ --cc=jeyu@kernel.org \ --cc=jpoimboe@redhat.com \ --cc=linux-kernel@vger.kernel.org \ --cc=luto@kernel.org \ --cc=mhiramat@kernel.org \ --cc=mingo@kernel.org \ --cc=namit@vmware.com \ --cc=rostedt@goodmis.org \ --cc=tglx@linutronix.de \ --cc=torvalds@linux-foundation.org \ --cc=x86@kernel.org \ --subject='Re: [PATCH v4 16/16] ftrace: Merge ftrace_module_{init,enable}()' \ /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
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.