Messages in this thread | | | Date | Mon, 02 Mar 2009 19:10:25 -0500 | From | Masami Hiramatsu <> | Subject | Re: [PATCH] Text Edit Lock - kprobes architecture independent support |
| |
Mathieu Desnoyers wrote: > Use the mutual exclusion provided by the text edit lock in the kprobes code. It > allows coherent manipulation of the kernel code by other subsystems.
Oh, I see what you said... This seems really useful.
Acked-by: Masami Hiramatsu <mhiramat@redhat.com>
> > Changelog: > > Move the kernel_text_lock/unlock out of the for loops. > > (applies on 2.6.29-rc6) > > Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca> > Acked-by: Ananth N Mavinakayanahalli <ananth@in.ibm.com> > CC: ananth@in.ibm.com > CC: anil.s.keshavamurthy@intel.com > CC: davem@davemloft.net > CC: Roel Kluin <12o3l@tiscali.nl> > --- > kernel/kprobes.c | 17 +++++++++++++---- > 1 file changed, 13 insertions(+), 4 deletions(-) > > Index: linux-2.6-lttng/kernel/kprobes.c > =================================================================== > --- linux-2.6-lttng.orig/kernel/kprobes.c 2009-01-30 10:24:45.000000000 -0500 > +++ linux-2.6-lttng/kernel/kprobes.c 2009-01-30 10:27:56.000000000 -0500 > @@ -43,6 +43,7 @@ > #include <linux/seq_file.h> > #include <linux/debugfs.h> > #include <linux/kdebug.h> > +#include <linux/memory.h> > > #include <asm-generic/sections.h> > #include <asm/cacheflush.h> > @@ -699,9 +700,10 @@ int __kprobes register_kprobe(struct kpr > goto out; > } > > + kernel_text_lock(); > ret = arch_prepare_kprobe(p); > if (ret) > - goto out; > + goto out_unlock_text; > > INIT_HLIST_NODE(&p->hlist); > hlist_add_head_rcu(&p->hlist, > @@ -709,7 +711,8 @@ int __kprobes register_kprobe(struct kpr > > if (kprobe_enabled) > arch_arm_kprobe(p); > - > +out_unlock_text: > + kernel_text_unlock(); > out: > mutex_unlock(&kprobe_mutex); > > @@ -746,8 +749,11 @@ valid_p: > * enabled and not gone - otherwise, the breakpoint would > * already have been removed. We save on flushing icache. > */ > - if (kprobe_enabled && !kprobe_gone(old_p)) > + if (kprobe_enabled && !kprobe_gone(old_p)) { > + kernel_text_lock(); > arch_disarm_kprobe(p); > + kernel_text_unlock(); > + } > hlist_del_rcu(&old_p->hlist); > } else { > if (p->break_handler && !kprobe_gone(p)) > @@ -918,7 +924,6 @@ static int __kprobes pre_handler_kretpro > } > > arch_prepare_kretprobe(ri, regs); > - > /* XXX(hch): why is there no hlist_move_head? */ > INIT_HLIST_NODE(&ri->hlist); > kretprobe_table_lock(hash, &flags); > @@ -1280,12 +1285,14 @@ static void __kprobes enable_all_kprobes > if (kprobe_enabled) > goto already_enabled; > > + kernel_text_lock(); > for (i = 0; i < KPROBE_TABLE_SIZE; i++) { > head = &kprobe_table[i]; > hlist_for_each_entry_rcu(p, node, head, hlist) > if (!kprobe_gone(p)) > arch_arm_kprobe(p); > } > + kernel_text_unlock(); > > kprobe_enabled = true; > printk(KERN_INFO "Kprobes globally enabled\n"); > @@ -1310,6 +1317,7 @@ static void __kprobes disable_all_kprobe > > kprobe_enabled = false; > printk(KERN_INFO "Kprobes globally disabled\n"); > + kernel_text_lock(); > for (i = 0; i < KPROBE_TABLE_SIZE; i++) { > head = &kprobe_table[i]; > hlist_for_each_entry_rcu(p, node, head, hlist) { > @@ -1317,6 +1325,7 @@ static void __kprobes disable_all_kprobe > arch_disarm_kprobe(p); > } > } > + kernel_text_unlock(); > > mutex_unlock(&kprobe_mutex); > /* Allow all currently running kprobes to complete */
-- Masami Hiramatsu
Software Engineer Hitachi Computer Products (America) Inc. Software Solutions Division
e-mail: mhiramat@redhat.com
| |