diff options
author | Masami Hiramatsu <mhiramat@redhat.com> | 2009-01-06 17:41:50 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-01-06 18:59:20 -0500 |
commit | 129415607845d4daea11ddcba706005c69dcb942 (patch) | |
tree | 9046ea79a0b81c8823b9d42f00fd7c158861ed5c /arch | |
parent | a06f6211ef9b1785922f9d0e8766d63ac4e66de1 (diff) |
kprobes: add kprobe_insn_mutex and cleanup arch_remove_kprobe()
Add kprobe_insn_mutex for protecting kprobe_insn_pages hlist, and remove
kprobe_mutex from architecture dependent code.
This allows us to call arch_remove_kprobe() (and free_insn_slot) while
holding kprobe_mutex.
Signed-off-by: Masami Hiramatsu <mhiramat@redhat.com>
Acked-by: Ananth N Mavinakayanahalli <ananth@in.ibm.com>
Cc: Anil S Keshavamurthy <anil.s.keshavamurthy@intel.com>
Cc: Russell King <rmk@arm.linux.org.uk>
Cc: "Luck, Tony" <tony.luck@intel.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/arm/kernel/kprobes.c | 2 | ||||
-rw-r--r-- | arch/ia64/kernel/kprobes.c | 8 | ||||
-rw-r--r-- | arch/powerpc/kernel/kprobes.c | 7 | ||||
-rw-r--r-- | arch/s390/kernel/kprobes.c | 7 | ||||
-rw-r--r-- | arch/x86/kernel/kprobes.c | 7 |
5 files changed, 17 insertions, 14 deletions
diff --git a/arch/arm/kernel/kprobes.c b/arch/arm/kernel/kprobes.c index 3f9abe0e9aff..f692efddd449 100644 --- a/arch/arm/kernel/kprobes.c +++ b/arch/arm/kernel/kprobes.c | |||
@@ -92,9 +92,7 @@ void __kprobes arch_disarm_kprobe(struct kprobe *p) | |||
92 | void __kprobes arch_remove_kprobe(struct kprobe *p) | 92 | void __kprobes arch_remove_kprobe(struct kprobe *p) |
93 | { | 93 | { |
94 | if (p->ainsn.insn) { | 94 | if (p->ainsn.insn) { |
95 | mutex_lock(&kprobe_mutex); | ||
96 | free_insn_slot(p->ainsn.insn, 0); | 95 | free_insn_slot(p->ainsn.insn, 0); |
97 | mutex_unlock(&kprobe_mutex); | ||
98 | p->ainsn.insn = NULL; | 96 | p->ainsn.insn = NULL; |
99 | } | 97 | } |
100 | } | 98 | } |
diff --git a/arch/ia64/kernel/kprobes.c b/arch/ia64/kernel/kprobes.c index f07688da947c..097b84d54e73 100644 --- a/arch/ia64/kernel/kprobes.c +++ b/arch/ia64/kernel/kprobes.c | |||
@@ -670,9 +670,11 @@ void __kprobes arch_disarm_kprobe(struct kprobe *p) | |||
670 | 670 | ||
671 | void __kprobes arch_remove_kprobe(struct kprobe *p) | 671 | void __kprobes arch_remove_kprobe(struct kprobe *p) |
672 | { | 672 | { |
673 | mutex_lock(&kprobe_mutex); | 673 | if (p->ainsn.insn) { |
674 | free_insn_slot(p->ainsn.insn, p->ainsn.inst_flag & INST_FLAG_BOOSTABLE); | 674 | free_insn_slot(p->ainsn.insn, |
675 | mutex_unlock(&kprobe_mutex); | 675 | p->ainsn.inst_flag & INST_FLAG_BOOSTABLE); |
676 | p->ainsn.insn = NULL; | ||
677 | } | ||
676 | } | 678 | } |
677 | /* | 679 | /* |
678 | * We are resuming execution after a single step fault, so the pt_regs | 680 | * We are resuming execution after a single step fault, so the pt_regs |
diff --git a/arch/powerpc/kernel/kprobes.c b/arch/powerpc/kernel/kprobes.c index de79915452c8..989edcdf0297 100644 --- a/arch/powerpc/kernel/kprobes.c +++ b/arch/powerpc/kernel/kprobes.c | |||
@@ -96,9 +96,10 @@ void __kprobes arch_disarm_kprobe(struct kprobe *p) | |||
96 | 96 | ||
97 | void __kprobes arch_remove_kprobe(struct kprobe *p) | 97 | void __kprobes arch_remove_kprobe(struct kprobe *p) |
98 | { | 98 | { |
99 | mutex_lock(&kprobe_mutex); | 99 | if (p->ainsn.insn) { |
100 | free_insn_slot(p->ainsn.insn, 0); | 100 | free_insn_slot(p->ainsn.insn, 0); |
101 | mutex_unlock(&kprobe_mutex); | 101 | p->ainsn.insn = NULL; |
102 | } | ||
102 | } | 103 | } |
103 | 104 | ||
104 | static void __kprobes prepare_singlestep(struct kprobe *p, struct pt_regs *regs) | 105 | static void __kprobes prepare_singlestep(struct kprobe *p, struct pt_regs *regs) |
diff --git a/arch/s390/kernel/kprobes.c b/arch/s390/kernel/kprobes.c index 569079ec4ff0..9b92856632cf 100644 --- a/arch/s390/kernel/kprobes.c +++ b/arch/s390/kernel/kprobes.c | |||
@@ -218,9 +218,10 @@ void __kprobes arch_disarm_kprobe(struct kprobe *p) | |||
218 | 218 | ||
219 | void __kprobes arch_remove_kprobe(struct kprobe *p) | 219 | void __kprobes arch_remove_kprobe(struct kprobe *p) |
220 | { | 220 | { |
221 | mutex_lock(&kprobe_mutex); | 221 | if (p->ainsn.insn) { |
222 | free_insn_slot(p->ainsn.insn, 0); | 222 | free_insn_slot(p->ainsn.insn, 0); |
223 | mutex_unlock(&kprobe_mutex); | 223 | p->ainsn.insn = NULL; |
224 | } | ||
224 | } | 225 | } |
225 | 226 | ||
226 | static void __kprobes prepare_singlestep(struct kprobe *p, struct pt_regs *regs) | 227 | static void __kprobes prepare_singlestep(struct kprobe *p, struct pt_regs *regs) |
diff --git a/arch/x86/kernel/kprobes.c b/arch/x86/kernel/kprobes.c index 6c27679ec6aa..eead6f8f9218 100644 --- a/arch/x86/kernel/kprobes.c +++ b/arch/x86/kernel/kprobes.c | |||
@@ -376,9 +376,10 @@ void __kprobes arch_disarm_kprobe(struct kprobe *p) | |||
376 | 376 | ||
377 | void __kprobes arch_remove_kprobe(struct kprobe *p) | 377 | void __kprobes arch_remove_kprobe(struct kprobe *p) |
378 | { | 378 | { |
379 | mutex_lock(&kprobe_mutex); | 379 | if (p->ainsn.insn) { |
380 | free_insn_slot(p->ainsn.insn, (p->ainsn.boostable == 1)); | 380 | free_insn_slot(p->ainsn.insn, (p->ainsn.boostable == 1)); |
381 | mutex_unlock(&kprobe_mutex); | 381 | p->ainsn.insn = NULL; |
382 | } | ||
382 | } | 383 | } |
383 | 384 | ||
384 | static void __kprobes save_previous_kprobe(struct kprobe_ctlblk *kcb) | 385 | static void __kprobes save_previous_kprobe(struct kprobe_ctlblk *kcb) |