From: Masami Hiramatsu <mhiramat@redhat.com>
To: Jason Baron <jbaron@redhat.com>
Cc: linux-kernel@vger.kernel.org, mingo@elte.hu,
mathieu.desnoyers@polymtl.ca, hpa@zytor.com, tglx@linutronix.de,
rostedt@goodmis.org, andi@firstfloor.org, roland@redhat.com,
rth@redhat.com, fweisbec@gmail.com, avi@redhat.com
Subject: Re: [PATCH 9/9] jump label: jump_label_text_reserved() to reserve our jump points
Date: Fri, 09 Apr 2010 17:09:32 -0400 [thread overview]
Message-ID: <4BBF978C.8040606@redhat.com> (raw)
In-Reply-To: <ddd6aca6c907d81569a191bae6534bb89ec9abe8.1270839564.git.jbaron@redhat.com>
Jason Baron wrote:
> Add a jump_label_text_reserved(void *start, void *end), so that other
> pieces of code that want to modify kernel text, can first verify that
> jump label has not reserved the instruction.
>
> Signed-off-by: Jason Baron <jbaron@redhat.com>
Acked-by: Masami Hiramatsu <mhiramat@redhat.com>
At least kprobes parts. :)
Thank you,
> ---
> arch/x86/kernel/kprobes.c | 3 +-
> include/linux/jump_label.h | 6 +++
> kernel/jump_label.c | 83 ++++++++++++++++++++++++++++++++++++++++++++
> kernel/kprobes.c | 3 +-
> 4 files changed, 93 insertions(+), 2 deletions(-)
>
> diff --git a/arch/x86/kernel/kprobes.c b/arch/x86/kernel/kprobes.c
> index b43bbae..87bcf63 100644
> --- a/arch/x86/kernel/kprobes.c
> +++ b/arch/x86/kernel/kprobes.c
> @@ -1194,7 +1194,8 @@ static int __kprobes copy_optimized_instructions(u8 *dest, u8 *src)
> }
> /* Check whether the address range is reserved */
> if (ftrace_text_reserved(src, src + len - 1) ||
> - alternatives_text_reserved(src, src + len - 1))
> + alternatives_text_reserved(src, src + len - 1) ||
> + jump_label_text_reserved(src, src + len - 1))
> return -EBUSY;
>
> return len;
> diff --git a/include/linux/jump_label.h b/include/linux/jump_label.h
> index 7238805..90ca4b6 100644
> --- a/include/linux/jump_label.h
> +++ b/include/linux/jump_label.h
> @@ -31,6 +31,7 @@ extern void arch_jump_label_transform(struct jump_entry *entry,
> enum jump_label_type type);
>
> extern void jump_label_update(const char *name, enum jump_label_type type);
> +extern int jump_label_text_reserved(void *start, void *end);
>
> extern void apply_jump_label_nops(struct module *mod);
>
> @@ -65,6 +66,11 @@ static inline int apply_jump_label_nops(struct module *mod)
> return 0;
> }
>
> +static inline int jump_label_text_reserved(void *start, void *end)
> +{
> + return 0;
> +}
> +
> #endif
>
> #endif
> diff --git a/kernel/jump_label.c b/kernel/jump_label.c
> index 7e7458b..24bba61 100644
> --- a/kernel/jump_label.c
> +++ b/kernel/jump_label.c
> @@ -179,6 +179,89 @@ void jump_label_update(const char *name, enum jump_label_type type)
> mutex_unlock(&jump_label_mutex);
> }
>
> +static int addr_conflict(struct jump_entry *entry, void *start, void *end)
> +{
> + if (entry->code <= (unsigned long)end &&
> + entry->code + IDEAL_NOP_SIZE_5 > (unsigned long)start)
> + return 1;
> +
> + return 0;
> +}
> +
> +#ifdef CONFIG_MODULES
> +
> +static int module_conflict(void *start, void *end)
> +{
> + struct hlist_head *head;
> + struct hlist_node *node, *node_next, *module_node, *module_node_next;
> + struct jump_label_entry *e;
> + struct jump_label_module_entry *e_module;
> + struct jump_entry *iter;
> + int i, count;
> + int conflict = 0;
> +
> + for (i = 0; i < JUMP_LABEL_TABLE_SIZE; i++) {
> + head = &jump_label_table[i];
> + hlist_for_each_entry_safe(e, node, node_next, head, hlist) {
> + hlist_for_each_entry_safe(e_module, module_node,
> + module_node_next,
> + &(e->modules), hlist) {
> + count = e_module->nr_entries;
> + iter = e_module->table;
> + while (count--) {
> + if (addr_conflict(iter, start, end)) {
> + conflict = 1;
> + goto out;
> + }
> + iter++;
> + }
> + }
> + }
> + }
> +out:
> + return conflict;
> +}
> +
> +#endif
> +
> +/***
> + * jump_label_text_reserved - check if addr range is reserved
> + * @start: start text addr
> + * @end: end text addr
> + *
> + * checks if the text addr located between @start and @end
> + * overlaps with any of the jump label patch addresses. Code
> + * that wants to modify kernel text should first verify that
> + * it does not overlap with any of the jump label addresses.
> + *
> + * returns 1 if there is an overlap, 0 otherwise
> + */
> +int jump_label_text_reserved(void *start, void *end)
> +{
> + struct jump_entry *iter;
> + struct jump_entry *iter_start = __start___jump_table;
> + struct jump_entry *iter_stop = __start___jump_table;
> + int conflict = 0;
> +
> + mutex_lock(&jump_label_mutex);
> + iter = iter_start;
> + while (iter < iter_stop) {
> + if (addr_conflict(iter, start, end)) {
> + conflict = 1;
> + goto out;
> + }
> + iter++;
> + }
> +
> + /* now check modules */
> +#ifdef CONFIG_MODULES
> + conflict = module_conflict(start, end);
> +#endif
> +out:
> + mutex_unlock(&jump_label_mutex);
> + return conflict;
> +}
> +
> static int init_jump_label(void)
> {
> int ret;
> diff --git a/kernel/kprobes.c b/kernel/kprobes.c
> index fa034d2..a57755f 100644
> --- a/kernel/kprobes.c
> +++ b/kernel/kprobes.c
> @@ -1140,7 +1140,8 @@ int __kprobes register_kprobe(struct kprobe *p)
> preempt_disable();
> if (!kernel_text_address((unsigned long) p->addr) ||
> in_kprobes_functions((unsigned long) p->addr) ||
> - ftrace_text_reserved(p->addr, p->addr)) {
> + ftrace_text_reserved(p->addr, p->addr) ||
> + jump_label_text_reserved(p->addr, p->addr)) {
> preempt_enable();
> return -EINVAL;
> }
--
Masami Hiramatsu
e-mail: mhiramat@redhat.com
next prev parent reply other threads:[~2010-04-09 21:10 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-04-09 19:49 [PATCH 0/9] jump label v6 Jason Baron
2010-04-09 19:49 ` [PATCH 1/9] jump label: notifier atomic call chain notrace Jason Baron
2010-04-09 19:49 ` [PATCH 2/9] jump label: base patch Jason Baron
2010-04-09 19:49 ` [PATCH 3/9] jump label: x86 support Jason Baron
2010-04-09 19:49 ` [PATCH 4/9] jump label: tracepoint support Jason Baron
2010-04-09 19:49 ` [PATCH 5/9] jump label: add module support Jason Baron
2010-04-09 19:49 ` [PATCH 6/9] jump label: move ftrace_dyn_arch_init to common code Jason Baron
2010-04-09 19:49 ` [PATCH 7/9] jump label: sort jump table at build-time Jason Baron
2010-04-09 21:24 ` Vivek Goyal
2010-04-09 21:32 ` Roland McGrath
2010-04-09 19:50 ` [PATCH 8/9] jump label: initialize workqueue tracepoints *before* they are registered Jason Baron
2010-04-09 19:50 ` [PATCH 9/9] jump label: jump_label_text_reserved() to reserve our jump points Jason Baron
2010-04-09 21:09 ` Masami Hiramatsu [this message]
2010-04-09 20:36 ` [PATCH 0/9] jump label v6 Masami Hiramatsu
2010-04-09 21:37 ` Jason Baron
2010-04-09 21:58 ` Masami Hiramatsu
2010-04-10 6:16 ` David Miller
2010-04-10 6:22 ` H. Peter Anvin
2010-04-13 16:56 ` Mathieu Desnoyers
2010-04-14 19:34 ` Jason Baron
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=4BBF978C.8040606@redhat.com \
--to=mhiramat@redhat.com \
--cc=andi@firstfloor.org \
--cc=avi@redhat.com \
--cc=fweisbec@gmail.com \
--cc=hpa@zytor.com \
--cc=jbaron@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mathieu.desnoyers@polymtl.ca \
--cc=mingo@elte.hu \
--cc=roland@redhat.com \
--cc=rostedt@goodmis.org \
--cc=rth@redhat.com \
--cc=tglx@linutronix.de \
/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 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.