Messages in this thread | | | Date | Sat, 17 Nov 2007 11:17:30 +0100 | From | Roel Kluin <> | Subject | Re: [rfc-patch 07/11] 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. > > Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca> > Acked-by: Ananth N Mavinakayanahalli <ananth@in.ibm.com> > CC: prasanna@in.ibm.com > CC: ananth@in.ibm.com > CC: anil.s.keshavamurthy@intel.com > CC: davem@davemloft.net > --- > kernel/kprobes.c | 19 +++++++++++++------ > 1 file changed, 13 insertions(+), 6 deletions(-) > > Index: linux-2.6-lttng/kernel/kprobes.c > =================================================================== > --- linux-2.6-lttng.orig/kernel/kprobes.c 2007-09-07 10:12:06.000000000 -0400 > +++ linux-2.6-lttng/kernel/kprobes.c 2007-09-07 10:13:09.000000000 -0400 > @@ -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> > @@ -568,9 +569,10 @@ static int __kprobes __register_kprobe(s > 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, > @@ -578,7 +580,8 @@ static int __kprobes __register_kprobe(s > > if (kprobe_enabled) > arch_arm_kprobe(p); > - > +out_unlock_text: > + kernel_text_unlock(); > out: > mutex_unlock(&kprobe_mutex); > > @@ -621,8 +624,11 @@ valid_p: > * enabled - otherwise, the breakpoint would already have > * been removed. We save on flushing icache. > */ > - if (kprobe_enabled) > + if (kprobe_enabled) { > + kernel_text_lock(); > arch_disarm_kprobe(p); > + kernel_text_unlock(); > + } > hlist_del_rcu(&old_p->hlist); > cleanup_p = 1; > } else { > @@ -644,9 +650,7 @@ valid_p: > list_del_rcu(&p->list); > kfree(old_p); > } > - mutex_lock(&kprobe_mutex); > arch_remove_kprobe(p); > - mutex_unlock(&kprobe_mutex); > } else { > mutex_lock(&kprobe_mutex); > if (p->break_handler) > @@ -717,7 +721,6 @@ static int __kprobes pre_handler_kretpro > ri->rp = rp; > ri->task = current; > arch_prepare_kretprobe(ri, regs); > - > /* XXX(hch): why is there no hlist_move_head? */ > hlist_del(&ri->uflist); > hlist_add_head(&ri->uflist, &ri->rp->used_instances); > @@ -940,8 +943,10 @@ static void __kprobes enable_all_kprobes > > for (i = 0; i < KPROBE_TABLE_SIZE; i++) { > head = &kprobe_table[i]; > + kernel_text_lock(); > hlist_for_each_entry_rcu(p, node, head, hlist) > arch_arm_kprobe(p); > + kernel_text_unlock(); > }
isn't it better to put the kernel_text_lock around the for loop?
> > kprobe_enabled = true; > @@ -969,10 +974,12 @@ static void __kprobes disable_all_kprobe > printk(KERN_INFO "Kprobes globally disabled\n"); > for (i = 0; i < KPROBE_TABLE_SIZE; i++) { > head = &kprobe_table[i]; > + kernel_text_lock(); > hlist_for_each_entry_rcu(p, node, head, hlist) { > if (!arch_trampoline_kprobe(p)) > arch_disarm_kprobe(p); > } > + kernel_text_unlock(); > }
same question here
> > mutex_unlock(&kprobe_mutex); >
- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |