From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753593Ab2GUCV7 (ORCPT ); Fri, 20 Jul 2012 22:21:59 -0400 Received: from hrndva-omtalb.mail.rr.com ([71.74.56.122]:22835 "EHLO hrndva-omtalb.mail.rr.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752288Ab2GUCVM (ORCPT ); Fri, 20 Jul 2012 22:21:12 -0400 X-Authority-Analysis: v=2.0 cv=IOWA+3TG c=1 sm=0 a=s5Htg7xnQOKvHEu9STBOug==:17 a=OpT9cpI26MMA:10 a=Ciwy3NGCPMMA:10 a=Q_ByO0nFTV8A: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=oxaXq_tzS96xDOGSeD8A: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=7I5HPDJ98-sc7iuvJv4A:9 a=s5Htg7xnQOKvHEu9STBOug==:117 X-Cloudmark-Score: 0 X-Originating-IP: 72.230.195.127 Message-Id: <20120721022111.319657868@goodmis.org> User-Agent: quilt/0.60-1 Date: Fri, 20 Jul 2012 22:19:59 -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 16/19] kprobes: Move locks into appropriate functions References: <20120721021943.274162381@goodmis.org> Content-Disposition: inline; filename=0016-kprobes-Move-locks-into-appropriate-functions.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 Break a big critical region into fine-grained pieces at registering kprobe path. This helps us to solve circular locking dependency when introducing ftrace-based kprobes. Link: http://lkml.kernel.org/r/20120605102826.27845.81689.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 Signed-off-by: Steven Rostedt --- kernel/kprobes.c | 63 ++++++++++++++++++++++++++++++++++++--------------= ---- 1 file changed, 42 insertions(+), 21 deletions(-) diff --git a/kernel/kprobes.c b/kernel/kprobes.c index 6137fe3..9e47f44 100644 --- a/kernel/kprobes.c +++ b/kernel/kprobes.c @@ -759,20 +759,28 @@ static __kprobes void try_to_optimize_kprobe(struct k= probe *p) struct kprobe *ap; struct optimized_kprobe *op; =20 + /* For preparing optimization, jump_label_text_reserved() is called */ + jump_label_lock(); + mutex_lock(&text_mutex); + ap =3D alloc_aggr_kprobe(p); if (!ap) - return; + goto out; =20 op =3D container_of(ap, struct optimized_kprobe, kp); if (!arch_prepared_optinsn(&op->optinsn)) { /* If failed to setup optimizing, fallback to kprobe */ arch_remove_optimized_kprobe(op); kfree(op); - return; + goto out; } =20 init_aggr_kprobe(ap, p); - optimize_kprobe(ap); + optimize_kprobe(ap); /* This just kicks optimizer thread */ + +out: + mutex_unlock(&text_mutex); + jump_label_unlock(); } =20 #ifdef CONFIG_SYSCTL @@ -1144,12 +1152,6 @@ static int __kprobes add_new_kprobe(struct kprobe *a= p, struct kprobe *p) if (p->post_handler && !ap->post_handler) ap->post_handler =3D aggr_post_handler; =20 - if (kprobe_disabled(ap) && !kprobe_disabled(p)) { - ap->flags &=3D ~KPROBE_FLAG_DISABLED; - if (!kprobes_all_disarmed) - /* Arm the breakpoint again. */ - __arm_kprobe(ap); - } return 0; } =20 @@ -1189,11 +1191,22 @@ static int __kprobes register_aggr_kprobe(struct kp= robe *orig_p, int ret =3D 0; struct kprobe *ap =3D orig_p; =20 + /* For preparing optimization, jump_label_text_reserved() is called */ + jump_label_lock(); + /* + * Get online CPUs to avoid text_mutex deadlock.with stop machine, + * which is invoked by unoptimize_kprobe() in add_new_kprobe() + */ + get_online_cpus(); + mutex_lock(&text_mutex); + if (!kprobe_aggrprobe(orig_p)) { /* If orig_p is not an aggr_kprobe, create new aggr_kprobe. */ ap =3D alloc_aggr_kprobe(orig_p); - if (!ap) - return -ENOMEM; + if (!ap) { + ret =3D -ENOMEM; + goto out; + } init_aggr_kprobe(ap, orig_p); } else if (kprobe_unused(ap)) /* This probe is going to die. Rescue it */ @@ -1213,7 +1226,7 @@ static int __kprobes register_aggr_kprobe(struct kpro= be *orig_p, * free aggr_probe. It will be used next time, or * freed by unregister_kprobe. */ - return ret; + goto out; =20 /* Prepare optimized instructions if possible. */ prepare_optimized_kprobe(ap); @@ -1228,7 +1241,20 @@ static int __kprobes register_aggr_kprobe(struct kpr= obe *orig_p, =20 /* Copy ap's insn slot to p */ copy_kprobe(ap, p); - return add_new_kprobe(ap, p); + ret =3D add_new_kprobe(ap, p); + +out: + mutex_unlock(&text_mutex); + put_online_cpus(); + jump_label_unlock(); + + if (ret =3D=3D 0 && kprobe_disabled(ap) && !kprobe_disabled(p)) { + ap->flags &=3D ~KPROBE_FLAG_DISABLED; + if (!kprobes_all_disarmed) + /* Arm the breakpoint again. */ + arm_kprobe(ap); + } + return ret; } =20 static int __kprobes in_kprobes_functions(unsigned long addr) @@ -1387,10 +1413,6 @@ int __kprobes register_kprobe(struct kprobe *p) return ret; =20 mutex_lock(&kprobe_mutex); - jump_label_lock(); /* needed to call jump_label_text_reserved() */ - - get_online_cpus(); /* For avoiding text_mutex deadlock. */ - mutex_lock(&text_mutex); =20 old_p =3D get_kprobe(p->addr); if (old_p) { @@ -1399,7 +1421,9 @@ int __kprobes register_kprobe(struct kprobe *p) goto out; } =20 + mutex_lock(&text_mutex); /* Avoiding text modification */ ret =3D arch_prepare_kprobe(p); + mutex_unlock(&text_mutex); if (ret) goto out; =20 @@ -1408,15 +1432,12 @@ int __kprobes register_kprobe(struct kprobe *p) &kprobe_table[hash_ptr(p->addr, KPROBE_HASH_BITS)]); =20 if (!kprobes_all_disarmed && !kprobe_disabled(p)) - __arm_kprobe(p); + arm_kprobe(p); =20 /* Try to optimize kprobe */ try_to_optimize_kprobe(p); =20 out: - mutex_unlock(&text_mutex); - put_online_cpus(); - jump_label_unlock(); mutex_unlock(&kprobe_mutex); =20 if (probed_mod) --=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) iQIcBAABAgAGBQJQChIXAAoJEIy3vGnGbaoAMSYP+wWOFsX1zs6W1/5PEsCqxS09 ZTF1wnKlVTk4YOW16aT+DNhtbdPWfab/tQ8PMQTi1kdPqOnZAuaudQlG7/KAzOIA vw/RyGEJSDG8qzkz9nnZI4Grd/GhBC9QIyQ+d9gP/NSOGDfRVkHDJWxiqQHK2c+s 8/4tTwEAHTungLpSsiye37SXoI1x5fGLeMU39Gp8LGfL7KQ+8FsLH3Yu1tZCK3bb 6Scnc+qr0/NMI1TO+aQwuUeJOwIPPDUNnMMyNQLHI6RYKRyk3uqDM3BQ/2h1rNda rzMoUAzZEn6ELRxgTxjlZCNoV89qkvxQeDbgWJGaP4bUv9vDe4o6w3+I0CAfxCsp KWyd3/OOh4RMXaTUdYeXIeaanMUMxb3Q9AmNrl3Zl9j7uxwoBojfln6OFM3P6LgJ 8cItmScdkLxGJkXbc+Iy4/OyiFQV7n8skqZElka4aLMQQ9MnGGAwVRw0q5IOZ84A zmERFZesDyMJ/I3Y/9VeHEIDQWuVyMqT5dNczfDcPmdXn5J/yoa1Sz5LwnSIvG4s dVfTMFvA2pAjaIZUsxLHeOUlE/pNWXF+8IyFRqGotuj69tufnXXk1xj3YouqVaPA xQ5lmKiHLg16vBYPrfZlzNLP+qyNdg3h0fqQolkD6sODw1/o+WX2xg3tqlNFrMeU mXvKzly7EW5WjZ1KO3Ph =WMjl -----END PGP SIGNATURE----- --00GvhwF7k39YY--