From: Mark Rutland <mark.rutland@arm.com> To: linux-kernel@vger.kernel.org Cc: agordeev@linux.ibm.com, anil.s.keshavamurthy@intel.com, aou@eecs.berkeley.edu, bp@alien8.de, catalin.marinas@arm.com, dave.hansen@linux.intel.com, davem@davemloft.net, gor@linux.ibm.com, hca@linux.ibm.com, jarkko@kernel.org, jcalvinowens@gmail.com, linux-arm-kernel@lists.infradead.org, mark.rutland@arm.com, mhiramat@kernel.org, mingo@redhat.com, mpe@ellerman.id.au, naveen.n.rao@linux.ibm.com, palmer@dabbelt.com, paul.walmsley@sifive.com, tglx@linutronix.de, will@kernel.org Subject: [PATCH 4/4] kprobes: Remove core dependency on modules Date: Tue, 26 Mar 2024 16:36:24 +0000 [thread overview] Message-ID: <20240326163624.3253157-5-mark.rutland@arm.com> (raw) In-Reply-To: <20240326163624.3253157-1-mark.rutland@arm.com> From: Jarkko Sakkinen <jarkko@kernel.org> Tracing with kprobes while running a monolithic kernel is currently impossible because KPROBES depends on MODULES. While this dependency is necessary when KPROBES_USE_MODULE_ALLOC=y, all the other module-specific code only exist to handle the case when MODULES=y, and can be hidden behind ifdeffery. Add the necessary ifdeffery, and remove the dependency on MODULES=N when KPROBES_USE_MODULE_ALLOC=n. Currently this allows kprobes to be used when CONFIG_MODULES=n on arm64 and riscv, and other architectures can enable support by implementing their own kprobes_alloc_insn_page() and kprobes_free_insn_page() which do not depend on MODULES. Signed-off-by: Jarkko Sakkinen <jarkko@kernel.org> Link: https://lore.kernel.org/all/20240326012102.27438-1-jarkko@kernel.org/ [Mark: Remove execmem changes, depend on !KPROBES_USE_MODULE_ALLOC] Signed-off-by: Mark Rutland <mark.rutland@arm.com> Cc: Anil S Keshavamurthy <anil.s.keshavamurthy@intel.com> Cc: David S. Miller <davem@davemloft.net> Cc: Jarkko Sakkinen <jarkko@kernel.org> Cc: Masami Hiramatsu <mhiramat@kernel.org> Cc: Naveen N. Rao <naveen.n.rao@linux.ibm.com> --- arch/Kconfig | 2 +- kernel/kprobes.c | 12 +++++++++++- kernel/trace/trace_kprobe.c | 15 +++++++++++++-- 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/arch/Kconfig b/arch/Kconfig index 85bb59f7b8c07..cf43de9ffb5b9 100644 --- a/arch/Kconfig +++ b/arch/Kconfig @@ -52,7 +52,7 @@ config GENERIC_ENTRY config KPROBES bool "Kprobes" - depends on MODULES + depends on MODULES || !KPROBES_USE_MODULE_ALLOC depends on HAVE_KPROBES select KALLSYMS select TASKS_RCU if PREEMPTION diff --git a/kernel/kprobes.c b/kernel/kprobes.c index fa2ee4e59eca2..7c2f0b504cdcb 100644 --- a/kernel/kprobes.c +++ b/kernel/kprobes.c @@ -1582,6 +1582,7 @@ static int check_kprobe_address_safe(struct kprobe *p, goto out; } +#ifdef CONFIG_MODULES /* Check if 'p' is probing a module. */ *probed_mod = __module_text_address((unsigned long) p->addr); if (*probed_mod) { @@ -1605,6 +1606,8 @@ static int check_kprobe_address_safe(struct kprobe *p, ret = -ENOENT; } } +#endif + out: preempt_enable(); jump_label_unlock(); @@ -2484,6 +2487,7 @@ int kprobe_add_area_blacklist(unsigned long start, unsigned long end) return 0; } +#ifdef CONFIG_MODULES /* Remove all symbols in given area from kprobe blacklist */ static void kprobe_remove_area_blacklist(unsigned long start, unsigned long end) { @@ -2501,6 +2505,7 @@ static void kprobe_remove_ksym_blacklist(unsigned long entry) { kprobe_remove_area_blacklist(entry, entry + 1); } +#endif /* CONFIG_MODULES */ int __weak arch_kprobe_get_kallsym(unsigned int *symnum, unsigned long *value, char *type, char *sym) @@ -2566,6 +2571,7 @@ static int __init populate_kprobe_blacklist(unsigned long *start, return ret ? : arch_populate_kprobe_blacklist(); } +#ifdef CONFIG_MODULES static void add_module_kprobe_blacklist(struct module *mod) { unsigned long start, end; @@ -2662,6 +2668,9 @@ static int kprobes_module_callback(struct notifier_block *nb, mutex_unlock(&kprobe_mutex); return NOTIFY_DONE; } +#else +#define kprobes_module_callback (NULL) +#endif /* CONFIG_MODULES */ static struct notifier_block kprobe_module_nb = { .notifier_call = kprobes_module_callback, @@ -2726,7 +2735,8 @@ static int __init init_kprobes(void) err = arch_init_kprobes(); if (!err) err = register_die_notifier(&kprobe_exceptions_nb); - if (!err) + + if (!err && IS_ENABLED(CONFIG_MODULES)) err = register_module_notifier(&kprobe_module_nb); kprobes_initialized = (err == 0); diff --git a/kernel/trace/trace_kprobe.c b/kernel/trace/trace_kprobe.c index 14099cc17fc9e..c509ba776e679 100644 --- a/kernel/trace/trace_kprobe.c +++ b/kernel/trace/trace_kprobe.c @@ -111,6 +111,7 @@ static nokprobe_inline bool trace_kprobe_within_module(struct trace_kprobe *tk, return strncmp(module_name(mod), name, len) == 0 && name[len] == ':'; } +#ifdef CONFIG_MODULES static nokprobe_inline bool trace_kprobe_module_exist(struct trace_kprobe *tk) { char *p; @@ -129,6 +130,9 @@ static nokprobe_inline bool trace_kprobe_module_exist(struct trace_kprobe *tk) return ret; } +#else +#define trace_kprobe_module_exist(tk) false /* aka a module never exists */ +#endif /* CONFIG_MODULES */ static bool trace_kprobe_is_busy(struct dyn_event *ev) { @@ -670,6 +674,7 @@ static int register_trace_kprobe(struct trace_kprobe *tk) return ret; } +#ifdef CONFIG_MODULES /* Module notifier call back, checking event on the module */ static int trace_kprobe_module_callback(struct notifier_block *nb, unsigned long val, void *data) @@ -699,6 +704,9 @@ static int trace_kprobe_module_callback(struct notifier_block *nb, return NOTIFY_DONE; } +#else +#define trace_kprobe_module_callback (NULL) +#endif /* CONFIG_MODULES */ static struct notifier_block trace_kprobe_module_nb = { .notifier_call = trace_kprobe_module_callback, @@ -1933,8 +1941,11 @@ static __init int init_kprobe_trace_early(void) if (ret) return ret; - if (register_module_notifier(&trace_kprobe_module_nb)) - return -EINVAL; + if (IS_ENABLED(CONFIG_MODULES)) { + ret = register_module_notifier(&trace_kprobe_module_nb); + if (ret) + return -EINVAL; + } return 0; } -- 2.30.2
WARNING: multiple messages have this Message-ID (diff)
From: Mark Rutland <mark.rutland@arm.com> To: linux-kernel@vger.kernel.org Cc: agordeev@linux.ibm.com, anil.s.keshavamurthy@intel.com, aou@eecs.berkeley.edu, bp@alien8.de, catalin.marinas@arm.com, dave.hansen@linux.intel.com, davem@davemloft.net, gor@linux.ibm.com, hca@linux.ibm.com, jarkko@kernel.org, jcalvinowens@gmail.com, linux-arm-kernel@lists.infradead.org, mark.rutland@arm.com, mhiramat@kernel.org, mingo@redhat.com, mpe@ellerman.id.au, naveen.n.rao@linux.ibm.com, palmer@dabbelt.com, paul.walmsley@sifive.com, tglx@linutronix.de, will@kernel.org Subject: [PATCH 4/4] kprobes: Remove core dependency on modules Date: Tue, 26 Mar 2024 16:36:24 +0000 [thread overview] Message-ID: <20240326163624.3253157-5-mark.rutland@arm.com> (raw) In-Reply-To: <20240326163624.3253157-1-mark.rutland@arm.com> From: Jarkko Sakkinen <jarkko@kernel.org> Tracing with kprobes while running a monolithic kernel is currently impossible because KPROBES depends on MODULES. While this dependency is necessary when KPROBES_USE_MODULE_ALLOC=y, all the other module-specific code only exist to handle the case when MODULES=y, and can be hidden behind ifdeffery. Add the necessary ifdeffery, and remove the dependency on MODULES=N when KPROBES_USE_MODULE_ALLOC=n. Currently this allows kprobes to be used when CONFIG_MODULES=n on arm64 and riscv, and other architectures can enable support by implementing their own kprobes_alloc_insn_page() and kprobes_free_insn_page() which do not depend on MODULES. Signed-off-by: Jarkko Sakkinen <jarkko@kernel.org> Link: https://lore.kernel.org/all/20240326012102.27438-1-jarkko@kernel.org/ [Mark: Remove execmem changes, depend on !KPROBES_USE_MODULE_ALLOC] Signed-off-by: Mark Rutland <mark.rutland@arm.com> Cc: Anil S Keshavamurthy <anil.s.keshavamurthy@intel.com> Cc: David S. Miller <davem@davemloft.net> Cc: Jarkko Sakkinen <jarkko@kernel.org> Cc: Masami Hiramatsu <mhiramat@kernel.org> Cc: Naveen N. Rao <naveen.n.rao@linux.ibm.com> --- arch/Kconfig | 2 +- kernel/kprobes.c | 12 +++++++++++- kernel/trace/trace_kprobe.c | 15 +++++++++++++-- 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/arch/Kconfig b/arch/Kconfig index 85bb59f7b8c07..cf43de9ffb5b9 100644 --- a/arch/Kconfig +++ b/arch/Kconfig @@ -52,7 +52,7 @@ config GENERIC_ENTRY config KPROBES bool "Kprobes" - depends on MODULES + depends on MODULES || !KPROBES_USE_MODULE_ALLOC depends on HAVE_KPROBES select KALLSYMS select TASKS_RCU if PREEMPTION diff --git a/kernel/kprobes.c b/kernel/kprobes.c index fa2ee4e59eca2..7c2f0b504cdcb 100644 --- a/kernel/kprobes.c +++ b/kernel/kprobes.c @@ -1582,6 +1582,7 @@ static int check_kprobe_address_safe(struct kprobe *p, goto out; } +#ifdef CONFIG_MODULES /* Check if 'p' is probing a module. */ *probed_mod = __module_text_address((unsigned long) p->addr); if (*probed_mod) { @@ -1605,6 +1606,8 @@ static int check_kprobe_address_safe(struct kprobe *p, ret = -ENOENT; } } +#endif + out: preempt_enable(); jump_label_unlock(); @@ -2484,6 +2487,7 @@ int kprobe_add_area_blacklist(unsigned long start, unsigned long end) return 0; } +#ifdef CONFIG_MODULES /* Remove all symbols in given area from kprobe blacklist */ static void kprobe_remove_area_blacklist(unsigned long start, unsigned long end) { @@ -2501,6 +2505,7 @@ static void kprobe_remove_ksym_blacklist(unsigned long entry) { kprobe_remove_area_blacklist(entry, entry + 1); } +#endif /* CONFIG_MODULES */ int __weak arch_kprobe_get_kallsym(unsigned int *symnum, unsigned long *value, char *type, char *sym) @@ -2566,6 +2571,7 @@ static int __init populate_kprobe_blacklist(unsigned long *start, return ret ? : arch_populate_kprobe_blacklist(); } +#ifdef CONFIG_MODULES static void add_module_kprobe_blacklist(struct module *mod) { unsigned long start, end; @@ -2662,6 +2668,9 @@ static int kprobes_module_callback(struct notifier_block *nb, mutex_unlock(&kprobe_mutex); return NOTIFY_DONE; } +#else +#define kprobes_module_callback (NULL) +#endif /* CONFIG_MODULES */ static struct notifier_block kprobe_module_nb = { .notifier_call = kprobes_module_callback, @@ -2726,7 +2735,8 @@ static int __init init_kprobes(void) err = arch_init_kprobes(); if (!err) err = register_die_notifier(&kprobe_exceptions_nb); - if (!err) + + if (!err && IS_ENABLED(CONFIG_MODULES)) err = register_module_notifier(&kprobe_module_nb); kprobes_initialized = (err == 0); diff --git a/kernel/trace/trace_kprobe.c b/kernel/trace/trace_kprobe.c index 14099cc17fc9e..c509ba776e679 100644 --- a/kernel/trace/trace_kprobe.c +++ b/kernel/trace/trace_kprobe.c @@ -111,6 +111,7 @@ static nokprobe_inline bool trace_kprobe_within_module(struct trace_kprobe *tk, return strncmp(module_name(mod), name, len) == 0 && name[len] == ':'; } +#ifdef CONFIG_MODULES static nokprobe_inline bool trace_kprobe_module_exist(struct trace_kprobe *tk) { char *p; @@ -129,6 +130,9 @@ static nokprobe_inline bool trace_kprobe_module_exist(struct trace_kprobe *tk) return ret; } +#else +#define trace_kprobe_module_exist(tk) false /* aka a module never exists */ +#endif /* CONFIG_MODULES */ static bool trace_kprobe_is_busy(struct dyn_event *ev) { @@ -670,6 +674,7 @@ static int register_trace_kprobe(struct trace_kprobe *tk) return ret; } +#ifdef CONFIG_MODULES /* Module notifier call back, checking event on the module */ static int trace_kprobe_module_callback(struct notifier_block *nb, unsigned long val, void *data) @@ -699,6 +704,9 @@ static int trace_kprobe_module_callback(struct notifier_block *nb, return NOTIFY_DONE; } +#else +#define trace_kprobe_module_callback (NULL) +#endif /* CONFIG_MODULES */ static struct notifier_block trace_kprobe_module_nb = { .notifier_call = trace_kprobe_module_callback, @@ -1933,8 +1941,11 @@ static __init int init_kprobe_trace_early(void) if (ret) return ret; - if (register_module_notifier(&trace_kprobe_module_nb)) - return -EINVAL; + if (IS_ENABLED(CONFIG_MODULES)) { + ret = register_module_notifier(&trace_kprobe_module_nb); + if (ret) + return -EINVAL; + } return 0; } -- 2.30.2 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2024-03-26 16:36 UTC|newest] Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top 2024-03-26 16:36 [PATCH 0/4] kprobes: permit use without modules Mark Rutland 2024-03-26 16:36 ` Mark Rutland 2024-03-26 16:36 ` [PATCH 1/4] arm64: patching: always use fixmap Mark Rutland 2024-03-26 16:36 ` Mark Rutland 2024-03-26 16:36 ` [PATCH 2/4] kprobes/treewide: Add kprobes_ prefix to insn alloc/free functions Mark Rutland 2024-03-26 16:36 ` Mark Rutland 2024-03-26 17:11 ` Jarkko Sakkinen 2024-03-26 17:11 ` Jarkko Sakkinen 2024-03-26 16:36 ` [PATCH 3/4] kprobes/treewide: Explicitly override " Mark Rutland 2024-03-26 16:36 ` Mark Rutland 2024-04-13 7:22 ` Alexander Gordeev 2024-04-13 7:22 ` Alexander Gordeev 2024-03-26 16:36 ` Mark Rutland [this message] 2024-03-26 16:36 ` [PATCH 4/4] kprobes: Remove core dependency on modules Mark Rutland 2024-03-26 17:13 ` Jarkko Sakkinen 2024-03-26 17:13 ` Jarkko Sakkinen 2024-03-26 17:38 ` Mark Rutland 2024-03-26 17:38 ` Mark Rutland 2024-03-27 0:01 ` Masami Hiramatsu 2024-03-27 0:01 ` Masami Hiramatsu 2024-03-27 13:23 ` Jarkko Sakkinen 2024-03-27 13:23 ` Jarkko Sakkinen 2024-03-27 17:46 ` Jarkko Sakkinen 2024-03-27 17:46 ` Jarkko Sakkinen 2024-03-27 23:47 ` Masami Hiramatsu 2024-03-27 23:47 ` Masami Hiramatsu 2024-03-30 11:32 ` Jarkko Sakkinen 2024-03-30 11:32 ` Jarkko Sakkinen 2024-04-03 11:20 ` Mark Rutland 2024-04-03 11:20 ` Mark Rutland 2024-04-03 16:10 ` Jarkko Sakkinen 2024-04-03 16:10 ` Jarkko Sakkinen
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=20240326163624.3253157-5-mark.rutland@arm.com \ --to=mark.rutland@arm.com \ --cc=agordeev@linux.ibm.com \ --cc=anil.s.keshavamurthy@intel.com \ --cc=aou@eecs.berkeley.edu \ --cc=bp@alien8.de \ --cc=catalin.marinas@arm.com \ --cc=dave.hansen@linux.intel.com \ --cc=davem@davemloft.net \ --cc=gor@linux.ibm.com \ --cc=hca@linux.ibm.com \ --cc=jarkko@kernel.org \ --cc=jcalvinowens@gmail.com \ --cc=linux-arm-kernel@lists.infradead.org \ --cc=linux-kernel@vger.kernel.org \ --cc=mhiramat@kernel.org \ --cc=mingo@redhat.com \ --cc=mpe@ellerman.id.au \ --cc=naveen.n.rao@linux.ibm.com \ --cc=palmer@dabbelt.com \ --cc=paul.walmsley@sifive.com \ --cc=tglx@linutronix.de \ --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: 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.