diff options
author | Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com> | 2006-12-06 23:38:11 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.osdl.org> | 2006-12-07 11:39:38 -0500 |
commit | b4c6c34a530b4d1c626f4ac0a884e0a9b849378c (patch) | |
tree | 5705a4621b6668bced1969396465800256d76c76 /arch | |
parent | c15bb296403f1ce448384d58742e0dc04f49d664 (diff) |
[PATCH] kprobes: enable booster on the preemptible kernel
When we are unregistering a kprobe-booster, we can't release its
instruction buffer immediately on the preemptive kernel, because some
processes might be preempted on the buffer. The freeze_processes() and
thaw_processes() functions can clean most of processes up from the buffer.
There are still some non-frozen threads who have the PF_NOFREEZE flag. If
those threads are sleeping (not preempted) at the known place outside the
buffer, we can ensure safety of freeing.
However, the processing of this check routine takes a long time. So, this
patch introduces the garbage collection mechanism of insn_slot. It also
introduces the "dirty" flag to free_insn_slot because of efficiency.
The "clean" instruction slots (dirty flag is cleared) are released
immediately. But the "dirty" slots which are used by boosted kprobes, are
marked as garbages. collect_garbage_slots() will be invoked to release
"dirty" slots if there are more than INSNS_PER_PAGE garbage slots or if
there are no unused slots.
Cc: "Keshavamurthy, Anil S" <anil.s.keshavamurthy@intel.com>
Cc: Ananth N Mavinakayanahalli <ananth@in.ibm.com>
Cc: "bibo,mao" <bibo.mao@intel.com>
Cc: Prasanna S Panchamukhi <prasanna@in.ibm.com>
Cc: Yumiko Sugita <yumiko.sugita.yf@hitachi.com>
Cc: Satoshi Oshima <soshima@redhat.com>
Cc: Hideo Aoki <haoki@redhat.com>
Signed-off-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Acked-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/i386/kernel/kprobes.c | 4 | ||||
-rw-r--r-- | arch/ia64/kernel/kprobes.c | 2 | ||||
-rw-r--r-- | arch/powerpc/kernel/kprobes.c | 2 | ||||
-rw-r--r-- | arch/s390/kernel/kprobes.c | 2 | ||||
-rw-r--r-- | arch/x86_64/kernel/kprobes.c | 2 |
5 files changed, 6 insertions, 6 deletions
diff --git a/arch/i386/kernel/kprobes.c b/arch/i386/kernel/kprobes.c index fc79e1e859c4..af1d53344993 100644 --- a/arch/i386/kernel/kprobes.c +++ b/arch/i386/kernel/kprobes.c | |||
@@ -184,7 +184,7 @@ void __kprobes arch_disarm_kprobe(struct kprobe *p) | |||
184 | void __kprobes arch_remove_kprobe(struct kprobe *p) | 184 | void __kprobes arch_remove_kprobe(struct kprobe *p) |
185 | { | 185 | { |
186 | mutex_lock(&kprobe_mutex); | 186 | mutex_lock(&kprobe_mutex); |
187 | free_insn_slot(p->ainsn.insn); | 187 | free_insn_slot(p->ainsn.insn, (p->ainsn.boostable == 1)); |
188 | mutex_unlock(&kprobe_mutex); | 188 | mutex_unlock(&kprobe_mutex); |
189 | } | 189 | } |
190 | 190 | ||
@@ -333,7 +333,7 @@ static int __kprobes kprobe_handler(struct pt_regs *regs) | |||
333 | return 1; | 333 | return 1; |
334 | 334 | ||
335 | ss_probe: | 335 | ss_probe: |
336 | #ifndef CONFIG_PREEMPT | 336 | #if !defined(CONFIG_PREEMPT) || defined(CONFIG_PM) |
337 | if (p->ainsn.boostable == 1 && !p->post_handler){ | 337 | if (p->ainsn.boostable == 1 && !p->post_handler){ |
338 | /* Boost up -- we can execute copied instructions directly */ | 338 | /* Boost up -- we can execute copied instructions directly */ |
339 | reset_current_kprobe(); | 339 | reset_current_kprobe(); |
diff --git a/arch/ia64/kernel/kprobes.c b/arch/ia64/kernel/kprobes.c index 51217d63285e..4d592ee9300b 100644 --- a/arch/ia64/kernel/kprobes.c +++ b/arch/ia64/kernel/kprobes.c | |||
@@ -481,7 +481,7 @@ void __kprobes arch_disarm_kprobe(struct kprobe *p) | |||
481 | void __kprobes arch_remove_kprobe(struct kprobe *p) | 481 | void __kprobes arch_remove_kprobe(struct kprobe *p) |
482 | { | 482 | { |
483 | mutex_lock(&kprobe_mutex); | 483 | mutex_lock(&kprobe_mutex); |
484 | free_insn_slot(p->ainsn.insn); | 484 | free_insn_slot(p->ainsn.insn, 0); |
485 | mutex_unlock(&kprobe_mutex); | 485 | mutex_unlock(&kprobe_mutex); |
486 | } | 486 | } |
487 | /* | 487 | /* |
diff --git a/arch/powerpc/kernel/kprobes.c b/arch/powerpc/kernel/kprobes.c index 7b8d12b9026c..4657563f8813 100644 --- a/arch/powerpc/kernel/kprobes.c +++ b/arch/powerpc/kernel/kprobes.c | |||
@@ -85,7 +85,7 @@ void __kprobes arch_disarm_kprobe(struct kprobe *p) | |||
85 | void __kprobes arch_remove_kprobe(struct kprobe *p) | 85 | void __kprobes arch_remove_kprobe(struct kprobe *p) |
86 | { | 86 | { |
87 | mutex_lock(&kprobe_mutex); | 87 | mutex_lock(&kprobe_mutex); |
88 | free_insn_slot(p->ainsn.insn); | 88 | free_insn_slot(p->ainsn.insn, 0); |
89 | mutex_unlock(&kprobe_mutex); | 89 | mutex_unlock(&kprobe_mutex); |
90 | } | 90 | } |
91 | 91 | ||
diff --git a/arch/s390/kernel/kprobes.c b/arch/s390/kernel/kprobes.c index 67914fe7f317..576368c4f605 100644 --- a/arch/s390/kernel/kprobes.c +++ b/arch/s390/kernel/kprobes.c | |||
@@ -200,7 +200,7 @@ void __kprobes arch_disarm_kprobe(struct kprobe *p) | |||
200 | void __kprobes arch_remove_kprobe(struct kprobe *p) | 200 | void __kprobes arch_remove_kprobe(struct kprobe *p) |
201 | { | 201 | { |
202 | mutex_lock(&kprobe_mutex); | 202 | mutex_lock(&kprobe_mutex); |
203 | free_insn_slot(p->ainsn.insn); | 203 | free_insn_slot(p->ainsn.insn, 0); |
204 | mutex_unlock(&kprobe_mutex); | 204 | mutex_unlock(&kprobe_mutex); |
205 | } | 205 | } |
206 | 206 | ||
diff --git a/arch/x86_64/kernel/kprobes.c b/arch/x86_64/kernel/kprobes.c index ac241567e682..209c8c0bec71 100644 --- a/arch/x86_64/kernel/kprobes.c +++ b/arch/x86_64/kernel/kprobes.c | |||
@@ -224,7 +224,7 @@ void __kprobes arch_disarm_kprobe(struct kprobe *p) | |||
224 | void __kprobes arch_remove_kprobe(struct kprobe *p) | 224 | void __kprobes arch_remove_kprobe(struct kprobe *p) |
225 | { | 225 | { |
226 | mutex_lock(&kprobe_mutex); | 226 | mutex_lock(&kprobe_mutex); |
227 | free_insn_slot(p->ainsn.insn); | 227 | free_insn_slot(p->ainsn.insn, 0); |
228 | mutex_unlock(&kprobe_mutex); | 228 | mutex_unlock(&kprobe_mutex); |
229 | } | 229 | } |
230 | 230 | ||