From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753850Ab2GUCWV (ORCPT ); Fri, 20 Jul 2012 22:22:21 -0400 Received: from hrndva-omtalb.mail.rr.com ([71.74.56.122]:28689 "EHLO hrndva-omtalb.mail.rr.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752671Ab2GUCVO (ORCPT ); Fri, 20 Jul 2012 22:21:14 -0400 X-Authority-Analysis: v=2.0 cv=AtpsLZBP c=1 sm=0 a=s5Htg7xnQOKvHEu9STBOug==:17 a=OpT9cpI26MMA:10 a=Ciwy3NGCPMMA:10 a=ZQvrKFj6Z-gA:10 a=5SG0PmZfjMsA:10 a=bbbx4UPp9XUA:10 a=meVymXHHAAAA:8 a=3nbZYyFuAAAA:8 a=VwQbUJbxAAAA:8 a=20KFwNOVAAAA:8 a=oGMlB6cnAAAA:8 a=VnNF1IyMAAAA:8 a=Z4Rwk6OoAAAA:8 a=pGLkceISAAAA:8 a=Y1Ot2RuyV6B7H7rStpgA:9 a=QEXdDO2ut3YA:10 a=EvKJbDF4Ut8A:10 a=Zh68SRI7RUMA:10 a=jEp0ucaQiEUA:10 a=CY6gl2JlH4YA:10 a=jbrJJM5MRmoA:10 a=MSl-tDqOz04A:10 a=jeBq3FmKZ4MA:10 a=t7H-DIIlBou0qIWqXKsA:9 a=s5Htg7xnQOKvHEu9STBOug==:117 X-Cloudmark-Score: 0 X-Originating-IP: 72.230.195.127 Message-Id: <20120721022112.621498660@goodmis.org> User-Agent: quilt/0.60-1 Date: Fri, 20 Jul 2012 22:20:02 -0400 From: Steven Rostedt To: linux-kernel@vger.kernel.org Cc: Ingo Molnar , Andrew Morton , Masami Hiramatsu , Frederic Weisbecker , Thomas Gleixner , "H. Peter Anvin" , Ingo Molnar , Ananth N Mavinakayanahalli , "Frank Ch. Eigler" Subject: [PATCH 19/19] kprobes/x86: ftrace based optimization for x86 References: <20120721021943.274162381@goodmis.org> Content-Disposition: inline; filename=0019-kprobes-x86-ftrace-based-optimization-for-x86.patch Content-Type: multipart/signed; micalg="pgp-sha1"; protocol="application/pgp-signature"; boundary="00GvhwF7k39YY" Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org --00GvhwF7k39YY Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable From: Masami Hiramatsu Add function tracer based kprobe optimization support handlers on x86. This allows kprobes to use function tracer for probing on mcount call. Link: http://lkml.kernel.org/r/20120605102838.27845.26317.stgit@localhost.l= ocaldomain Cc: Thomas Gleixner Cc: Ingo Molnar Cc: "H. Peter Anvin" Cc: Ananth N Mavinakayanahalli Cc: "Frank Ch. Eigler" Cc: Andrew Morton Cc: Frederic Weisbecker Signed-off-by: Masami Hiramatsu [ Updated to new port of ftrace save regs functions ] Signed-off-by: Steven Rostedt --- arch/x86/include/asm/kprobes.h | 1 + arch/x86/kernel/kprobes.c | 48 ++++++++++++++++++++++++++++++++++++= ++++ include/linux/kprobes.h | 2 +- kernel/kprobes.c | 2 +- 4 files changed, 51 insertions(+), 2 deletions(-) diff --git a/arch/x86/include/asm/kprobes.h b/arch/x86/include/asm/kprobes.h index 5478825..d3ddd17 100644 --- a/arch/x86/include/asm/kprobes.h +++ b/arch/x86/include/asm/kprobes.h @@ -27,6 +27,7 @@ #include =20 #define __ARCH_WANT_KPROBES_INSN_SLOT +#define ARCH_SUPPORTS_KPROBES_ON_FTRACE =20 struct pt_regs; struct kprobe; diff --git a/arch/x86/kernel/kprobes.c b/arch/x86/kernel/kprobes.c index e2f751e..47ae102 100644 --- a/arch/x86/kernel/kprobes.c +++ b/arch/x86/kernel/kprobes.c @@ -1052,6 +1052,54 @@ int __kprobes longjmp_break_handler(struct kprobe *p= , struct pt_regs *regs) return 0; } =20 +#ifdef KPROBES_CAN_USE_FTRACE +/* Ftrace callback handler for kprobes */ +void __kprobes kprobe_ftrace_handler(unsigned long ip, unsigned long paren= t_ip, + struct ftrace_ops *ops, struct pt_regs *regs) +{ + struct kprobe *p; + struct kprobe_ctlblk *kcb; + unsigned long flags; + + /* Disable irq for emulating a breakpoint and avoiding preempt */ + local_irq_save(flags); + + p =3D get_kprobe((kprobe_opcode_t *)ip); + if (unlikely(!p) || kprobe_disabled(p)) + goto end; + + kcb =3D get_kprobe_ctlblk(); + if (kprobe_running()) { + kprobes_inc_nmissed_count(p); + } else { + regs->ip +=3D sizeof(kprobe_opcode_t); + + __this_cpu_write(current_kprobe, p); + kcb->kprobe_status =3D KPROBE_HIT_ACTIVE; + if (p->pre_handler) + p->pre_handler(p, regs); + + if (unlikely(p->post_handler)) { + /* Emulate singlestep as if there is a 5byte nop */ + regs->ip =3D ip + MCOUNT_INSN_SIZE; + kcb->kprobe_status =3D KPROBE_HIT_SSDONE; + p->post_handler(p, regs, 0); + } + __this_cpu_write(current_kprobe, NULL); + regs->ip =3D ip; /* Recover for next callback */ + } +end: + local_irq_restore(flags); +} + +int __kprobes arch_prepare_kprobe_ftrace(struct kprobe *p) +{ + p->ainsn.insn =3D NULL; + p->ainsn.boostable =3D -1; + return 0; +} +#endif + int __init arch_init_kprobes(void) { return arch_init_optprobes(); diff --git a/include/linux/kprobes.h b/include/linux/kprobes.h index aa0d05e..23755ba 100644 --- a/include/linux/kprobes.h +++ b/include/linux/kprobes.h @@ -318,7 +318,7 @@ extern int proc_kprobes_optimization_handler(struct ctl= _table *table, #endif /* CONFIG_OPTPROBES */ #ifdef KPROBES_CAN_USE_FTRACE extern void kprobe_ftrace_handler(unsigned long ip, unsigned long parent_i= p, - struct pt_regs *regs); + struct ftrace_ops *ops, struct pt_regs *regs); extern int arch_prepare_kprobe_ftrace(struct kprobe *p); #endif =20 diff --git a/kernel/kprobes.c b/kernel/kprobes.c index 69c16ef..35b4315 100644 --- a/kernel/kprobes.c +++ b/kernel/kprobes.c @@ -921,7 +921,7 @@ static __kprobes struct kprobe *alloc_aggr_kprobe(struc= t kprobe *p) =20 #ifdef KPROBES_CAN_USE_FTRACE static struct ftrace_ops kprobe_ftrace_ops __read_mostly =3D { - .regs_func =3D kprobe_ftrace_handler, + .func =3D kprobe_ftrace_handler, .flags =3D FTRACE_OPS_FL_SAVE_REGS, }; static int kprobe_ftrace_enabled; --=20 1.7.10.4 --00GvhwF7k39YY Content-Type: application/pgp-signature; name="signature.asc" Content-Description: This is a digitally signed message part -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (GNU/Linux) iQIcBAABAgAGBQJQChIYAAoJEIy3vGnGbaoAmCkP/3sXUdsLmdqOU139jVpMuGz0 9ufWUfllWaMa3BpSwFoPfjMOCoG+jjmpn2ahddNCotS13t6to85LwljtNcJvk3ZK mjNALIGAFbWSDlY23nk589hLinnOoFinyDGVFhNVsE4IEjKkKc6q2IAql/vLpBo5 ztwwHOIS54NxJz+hUPLjbdahsIuTm4qU+iQojSHYyyN+V20HjzgU32lwLOreqmw+ Y3eg5169ERdtSpMqrY0FbetdSGwGqyhOG3AuURdcieJFSqYE/VCXSmrx21t8eNy8 qfbp/AZ445LYftq0Vi4tnsmnGZKgV6XxjDswfDl3u6MoeEnP34VUeYSeytedcf/2 R6nG6jolwFyHKGoBA96dnHUNHaMkpVMhK+GoXe9GnFsWK2y4OWCiT3hvgw83pHPr Yn0DAFYVuoprWQ4swuZCiA9d6TdZ6hTgSLPDseDtylpO2qypimqhgMkbcFVD1ML4 709MOYYJdcCpC9jlAXsP7hObepRAKynm1LmRJFkHH/q8LK/lQkhgEtj+thVQmKtn dpCVBc8QbhM48d7GgiD8HWeKK2+qVktmJJF+IheOHNqT9v5cFiy0IkAdavTVQGzD 3DkcE1z6fbAJdP1SSDh3pP1iEUuFjyRqy7oY7Skn5o+0TPIe2PToPcpW3rF3QKPg Gwsp28v9kXYZwmq08qK+ =/uBU -----END PGP SIGNATURE----- --00GvhwF7k39YY--