All of lore.kernel.org
 help / color / mirror / Atom feed
* [RFC][PROTO][PATCH -tip 4/7] kprobes: add get_optinsn_slot()/free_optinsn_slot() for optimized kprobes
@ 2009-04-06 21:42 Masami Hiramatsu
  0 siblings, 0 replies; only message in thread
From: Masami Hiramatsu @ 2009-04-06 21:42 UTC (permalink / raw)
  To: Ananth N Mavinakayanahalli, Jim Keniston, Ingo Molnar,
	Andrew Morton
  Cc: Vegard Nossum, H. Peter Anvin, Frederic Weisbecker,
	Steven Rostedt, Andi Kleen, Avi Kivity, Frank Ch. Eigler,
	systemtap-ml, LKML, Satoshi Oshima

Add get_optinsn_slot() and free_optinsn_slot() for optimized_probes.
optinsn_slot will be bigger than normal insn_slot because optinsn_slot may
include interrupt emulation code and several instructions which will be
replaced by a jump instruction.

Signed-off-by: Masami Hiramatsu <mhiramat@redhat.com>
---

 include/linux/kprobes.h |    2 ++
 kernel/kprobes.c        |   30 ++++++++++++++++++++++++++++++
 2 files changed, 32 insertions(+), 0 deletions(-)


diff --git a/include/linux/kprobes.h b/include/linux/kprobes.h
index 065bb24..c7674bf 100644
--- a/include/linux/kprobes.h
+++ b/include/linux/kprobes.h
@@ -270,6 +270,8 @@ extern int  arch_optimize_kprobe(struct optimized_kprobe *op);
 extern void arch_unoptimize_kprobe(struct optimized_kprobe *op);
 extern int arch_detour_optimized_kprobe(struct optimized_kprobe *op,
 					struct pt_regs *regs);
+extern kprobe_opcode_t *get_optinsn_slot(void);
+extern void free_optinsn_slot(kprobe_opcode_t *slot, int dirty);
 #endif

 /* Get the kprobe at this addr (if any) - called with preemption disabled */
diff --git a/kernel/kprobes.c b/kernel/kprobes.c
index ba731ff..ddc1d38 100644
--- a/kernel/kprobes.c
+++ b/kernel/kprobes.c
@@ -296,6 +296,31 @@ void __kprobes free_insn_slot(kprobe_opcode_t * slot, int dirty)
 	__free_insn_slot(&kprobe_insn_slots, slot, dirty);
 	mutex_unlock(&kprobe_insn_mutex);
 }
+#ifdef CONFIG_OPTPROBES
+/* For optimized_kprobe buffer */
+static DEFINE_MUTEX(kprobe_optinsn_mutex); /* Protects kprobe_optinsn_slots */
+static struct kprobe_insn_cache kprobe_optinsn_slots = {
+	.pages = LIST_HEAD_INIT(kprobe_optinsn_slots.pages),
+	/* .insn_size is initialized later */
+	.nr_garbage = 0,
+};
+/* Get a slot for optimized_kprobe buffer */
+kprobe_opcode_t __kprobes *get_optinsn_slot(void)
+{
+	kprobe_opcode_t *ret = NULL;
+	mutex_lock(&kprobe_optinsn_mutex);
+	ret = __get_insn_slot(&kprobe_optinsn_slots);
+	mutex_unlock(&kprobe_optinsn_mutex);
+	return ret;
+}
+
+void __kprobes free_optinsn_slot(kprobe_opcode_t * slot, int dirty)
+{
+	mutex_lock(&kprobe_optinsn_mutex);
+	__free_insn_slot(&kprobe_optinsn_slots, slot, dirty);
+	mutex_unlock(&kprobe_optinsn_mutex);
+}
+#endif
 #endif

 /* We have preemption disabled.. so it is safe to use __ versions */
@@ -1388,6 +1413,11 @@ static int __init init_kprobes(void)
 		}
 	}

+#if defined(CONFIG_OPTPROBES) && defined(__ARCH_WANT_KPROBES_INSN_SLOT)
+	/* Init kprobe_optinsn_slots */
+	kprobe_optinsn_slots.insn_size = MAX_OPTINSN_SIZE;
+#endif
+
 	/* By default, kprobes are armed */
 	kprobes_all_disarmed = false;

-- 
Masami Hiramatsu

Software Engineer
Hitachi Computer Products (America) Inc.
Software Solutions Division

e-mail: mhiramat@redhat.com


^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2009-04-06 21:42 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-04-06 21:42 [RFC][PROTO][PATCH -tip 4/7] kprobes: add get_optinsn_slot()/free_optinsn_slot() for optimized kprobes Masami Hiramatsu

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.