From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1761121AbXIXTRb (ORCPT ); Mon, 24 Sep 2007 15:17:31 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1755192AbXIXTRX (ORCPT ); Mon, 24 Sep 2007 15:17:23 -0400 Received: from canuck.infradead.org ([209.217.80.40]:42720 "EHLO canuck.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755564AbXIXTRX (ORCPT ); Mon, 24 Sep 2007 15:17:23 -0400 Date: Mon, 24 Sep 2007 21:14:24 +0200 From: Peter Zijlstra To: Dave Hansen Cc: akpm@osdl.org, linux-kernel@vger.kernel.org, adobriyan@sw.ru, Dave Hansen Subject: Re: [PATCH] make lockdep happy with r/o bind mounts Message-ID: <20070924211424.16582124@lappy> In-Reply-To: <20070924174658.2B3D54B8@kernel> References: <20070924174658.2B3D54B8@kernel> X-Mailer: Claws Mail 3.0.0 (GTK+ 2.11.6; i486-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org X-Mailing-List: linux-kernel@vger.kernel.org On Mon, 24 Sep 2007 10:46:58 -0700 Dave Hansen wrote: > > With the r/o bind mount patches, we can have as many > spinlocks nested as there are CPUs on the system. > Lockdep freaks out after 8. > > So, create a new lockdep class of locks for the > mnt_writer spinlocks, and initialize each of the > cpu locks to be in a different class. > > It should shut up warnings like this, while still > allowing some of the lockdep goodness to remain: > > ============================================= > [ INFO: possible recursive locking detected ] > 2.6.23-rc6 #6 > --------------------------------------------- > swapper/1 is trying to acquire lock: > (&writer->lock){--..}, at: [] lock_and_coalesce_cpu_mnt_writer_counts+0x29/0x5c > > but task is already holding lock: > (&writer->lock){--..}, at: [] lock_and_coalesce_cpu_mnt_writer_counts+0x29/0x5c > > other info that might help us debug this: > 1 lock held by swapper/1: > #0: (&writer->lock){--..}, at: [] lock_and_coalesce_cpu_mnt_writer_counts+0x29/0x5c > > stack backtrace: > [] show_trace_log_lvl+0x19/0x2e > [] show_trace+0x12/0x14 > [] dump_stack+0x14/0x16 > [] print_deadlock_bug+0xb7/0xc1 > [] check_deadlock+0x40/0x54 > [] validate_chain+0x26e/0x319 > [] __lock_acquire+0x6c4/0x731 > [] lock_acquire+0x7a/0x94 > [] _spin_lock+0x38/0x62 > [] lock_and_coalesce_cpu_mnt_writer_counts+0x29/0x5c > [] mntput_no_expire+0x38/0xad > [] path_release_on_umount+0x15/0x18 > [] sys_umount+0x67/0x6f > [] name_to_dev_t+0x22a/0x24c > [] prepare_namespace+0x89/0x187 > [] kernel_init+0x9a/0xa3 > [] kernel_thread_helper+0x7/0x10 > ======================= > > Signed-off-by: Dave Hansen Acked-by: Peter Zijlstra > --- > > lxc-dave/fs/namespace.c | 2 ++ > 1 file changed, 2 insertions(+) > > diff -puN fs/namespace.c~make-lockdep-happy-with-ro-bind-mounts fs/namespace.c > --- lxc/fs/namespace.c~make-lockdep-happy-with-ro-bind-mounts 2007-09-24 10:32:23.000000000 -0700 > +++ lxc-dave/fs/namespace.c 2007-09-24 10:41:37.000000000 -0700 > @@ -116,6 +116,7 @@ struct mnt_writer { > * must be ordered by cpu number. > */ > spinlock_t lock; > + struct lock_class_key lock_class; /* compiles out with !lockdep */ > unsigned long count; > struct vfsmount *mnt; > } ____cacheline_aligned_in_smp; > @@ -127,6 +128,7 @@ static int __init init_mnt_writers(void) > for_each_possible_cpu(cpu) { > struct mnt_writer *writer = &per_cpu(mnt_writers, cpu); > spin_lock_init(&writer->lock); > + lockdep_set_class(&writer->lock, &writer->lock_class); > writer->count = 0; > } > return 0; > diff -puN include/linux/lockdep.h~make-lockdep-happy-with-ro-bind-mounts include/linux/lockdep.h > _