From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from viefep18-int.chello.at ([213.46.255.22]:43498 "EHLO viefep20-int.chello.at" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752208AbXI1MOP (ORCPT ); Fri, 28 Sep 2007 08:14:15 -0400 Subject: Re: [PATCH 01/12] lockdep: syscall exit check From: Peter Zijlstra In-Reply-To: <20070928120331.GC25726@osiris.boeblingen.de.ibm.com> References: <20070928074200.436463000@chello.nl> <20070928080040.893443000@chello.nl> <20070928120331.GC25726@osiris.boeblingen.de.ibm.com> Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="=-E7nKGG+LonFD9TJBpAwI" Date: Fri, 28 Sep 2007 14:14:11 +0200 Message-Id: <1190981651.13204.6.camel@twins> Mime-Version: 1.0 Sender: linux-arch-owner@vger.kernel.org To: Heiko Carstens Cc: lkml , linux-arch@vger.kernel.org, Zach Brown , Ingo Molnar , akpm@linux-foundation.org List-ID: --=-E7nKGG+LonFD9TJBpAwI Content-Type: text/plain Content-Transfer-Encoding: quoted-printable On Fri, 2007-09-28 at 14:03 +0200, Heiko Carstens wrote: > > +void lockdep_sys_exit(void) > > +{ > > + struct task_struct *curr =3D current; > > + > > + if (unlikely(curr->lockdep_depth)) { > > + if (!debug_locks_off()) > > + return; > > + printk("\n=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D\n"); > > + printk( "[ BUG: lock held at syscall exit time! ]\n"); > > + printk( "----------------------------------------\n"); > > + printk("%s/%d is leaving the kernel with locks still held!\n", > > + curr->comm, curr->pid); > > + lockdep_print_held_locks(curr); > > + } > > +} >=20 > By the way, the s390 patch I just posted also checks if we hold any locks > when returning from interrupt context to user space. Maybe the above text > could be changed to "lock held when returning to user space" ? Good idea, I'll look at doing the same for i386/x86_64. Traps (page faults) would also make sense I guess. --- Subject: lockdep: syscall exit check Provide a check to validate that we do not hold any locks when switching back to user-space. Signed-off-by: Peter Zijlstra --- include/linux/lockdep.h | 2 ++ kernel/lockdep.c | 16 ++++++++++++++++ 2 files changed, 18 insertions(+) Index: linux-2.6/include/linux/lockdep.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- linux-2.6.orig/include/linux/lockdep.h +++ linux-2.6/include/linux/lockdep.h @@ -238,6 +238,7 @@ extern void lockdep_info(void); extern void lockdep_reset(void); extern void lockdep_reset_lock(struct lockdep_map *lock); extern void lockdep_free_key_range(void *start, unsigned long size); +extern void lockdep_sys_exit(void); =20 extern void lockdep_off(void); extern void lockdep_on(void); @@ -317,6 +318,7 @@ static inline void lockdep_on(void) # define INIT_LOCKDEP # define lockdep_reset() do { debug_locks =3D 1; } while (0) # define lockdep_free_key_range(start, size) do { } while (0) +# define lockdep_sys_exit() do { } while (0) /* * The class key takes no space if lockdep is disabled: */ Index: linux-2.6/kernel/lockdep.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- linux-2.6.orig/kernel/lockdep.c +++ linux-2.6/kernel/lockdep.c @@ -3199,3 +3199,19 @@ void debug_show_held_locks(struct task_s } =20 EXPORT_SYMBOL_GPL(debug_show_held_locks); + +void lockdep_sys_exit(void) +{ + struct task_struct *curr =3D current; + + if (unlikely(curr->lockdep_depth)) { + if (!debug_locks_off()) + return; + printk("\n=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D\n"); + printk( "[ BUG: lock held when returning to user space! ]\n"); + printk( "------------------------------------------------\n"); + printk("%s/%d is leaving the kernel with locks still held!\n", + curr->comm, curr->pid); + lockdep_print_held_locks(curr); + } +} --=-E7nKGG+LonFD9TJBpAwI Content-Type: application/pgp-signature; name=signature.asc Content-Description: This is a digitally signed message part -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.6 (GNU/Linux) iD8DBQBG/PATXA2jU0ANEf4RAphOAJ4komItPOy//HU5gT0OL3a7BvieMwCeJn9U h4iVTAhiK8VUCs1zBZC9v0g= =oNON -----END PGP SIGNATURE----- --=-E7nKGG+LonFD9TJBpAwI--