Revision ee297209bf0a25c6717b7c063e76795142d32f37 authored by Xiaotian Feng on 20 December 2012, 23:05:44 UTC, committed by Linus Torvalds on 21 December 2012, 01:40:20 UTC
Lockdep found an inconsistent lock state when rcu is processing delayed
work in softirq.  Currently, kernel is using spin_lock/spin_unlock to
protect proc_inum_ida, but proc_free_inum is called by rcu in softirq
context.

Use spin_lock_bh/spin_unlock_bh fix following lockdep warning.

  =================================
  [ INFO: inconsistent lock state ]
  3.7.0 #36 Not tainted
  ---------------------------------
  inconsistent {SOFTIRQ-ON-W} -> {IN-SOFTIRQ-W} usage.
  swapper/1/0 [HC0[0]:SC1[1]:HE1:SE0] takes:
   (proc_inum_lock){+.?...}, at: proc_free_inum+0x1c/0x50
  {SOFTIRQ-ON-W} state was registered at:
     __lock_acquire+0x8ae/0xca0
     lock_acquire+0x199/0x200
     _raw_spin_lock+0x41/0x50
     proc_alloc_inum+0x4c/0xd0
     alloc_mnt_ns+0x49/0xc0
     create_mnt_ns+0x25/0x70
     mnt_init+0x161/0x1c7
     vfs_caches_init+0x107/0x11a
     start_kernel+0x348/0x38c
     x86_64_start_reservations+0x131/0x136
     x86_64_start_kernel+0x103/0x112
  irq event stamp: 2993422
  hardirqs last  enabled at (2993422):  _raw_spin_unlock_irqrestore+0x55/0x80
  hardirqs last disabled at (2993421):  _raw_spin_lock_irqsave+0x29/0x70
  softirqs last  enabled at (2993394):  _local_bh_enable+0x13/0x20
  softirqs last disabled at (2993395):  call_softirq+0x1c/0x30

  other info that might help us debug this:
   Possible unsafe locking scenario:

         CPU0
         ----
    lock(proc_inum_lock);
    <Interrupt>
      lock(proc_inum_lock);

   *** DEADLOCK ***

  no locks held by swapper/1/0.

  stack backtrace:
  Pid: 0, comm: swapper/1 Not tainted 3.7.0 #36
  Call Trace:
   <IRQ>  [<ffffffff810a40f1>] ? vprintk_emit+0x471/0x510
    print_usage_bug+0x2a5/0x2c0
    mark_lock+0x33b/0x5e0
    __lock_acquire+0x813/0xca0
    lock_acquire+0x199/0x200
    _raw_spin_lock+0x41/0x50
    proc_free_inum+0x1c/0x50
    free_pid_ns+0x1c/0x50
    put_pid_ns+0x2e/0x50
    put_pid+0x4a/0x60
    delayed_put_pid+0x12/0x20
    rcu_process_callbacks+0x462/0x790
    __do_softirq+0x1b4/0x3b0
    call_softirq+0x1c/0x30
    do_softirq+0x59/0xd0
    irq_exit+0x54/0xd0
    smp_apic_timer_interrupt+0x95/0xa3
    apic_timer_interrupt+0x72/0x80
    cpuidle_enter_tk+0x10/0x20
    cpuidle_enter_state+0x17/0x50
    cpuidle_idle_call+0x287/0x520
    cpu_idle+0xba/0x130
    start_secondary+0x2b3/0x2bc

Signed-off-by: Xiaotian Feng <dannyfeng@tencent.com>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Cc: "Eric W. Biederman" <ebiederm@xmission.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
1 parent c4e1849
History
File Mode Size
9p
adfs
affs
afs
autofs4
befs
bfs
btrfs
cachefiles
ceph
cifs
coda
configfs
cramfs
debugfs
devpts
dlm
ecryptfs
efs
exofs
exportfs
ext2
ext3
ext4
fat
freevxfs
fscache
fuse
gfs2
hfs
hfsplus
hostfs
hpfs
hppfs
hugetlbfs
isofs
jbd
jbd2
jffs2
jfs
lockd
logfs
minix
ncpfs
nfs
nfs_common
nfsd
nilfs2
nls
notify
ntfs
ocfs2
omfs
openpromfs
proc
pstore
qnx4
qnx6
quota
ramfs
reiserfs
romfs
squashfs
sysfs
sysv
ubifs
udf
ufs
xfs
Kconfig -rw-r--r-- 6.2 KB
Kconfig.binfmt -rw-r--r-- 6.7 KB
Makefile -rw-r--r-- 4.1 KB
aio.c -rw-r--r-- 45.7 KB
anon_inodes.c -rw-r--r-- 6.4 KB
attr.c -rw-r--r-- 7.0 KB
bad_inode.c -rw-r--r-- 7.7 KB
binfmt_aout.c -rw-r--r-- 11.7 KB
binfmt_elf.c -rw-r--r-- 57.8 KB
binfmt_elf_fdpic.c -rw-r--r-- 48.5 KB
binfmt_em86.c -rw-r--r-- 2.7 KB
binfmt_flat.c -rw-r--r-- 26.7 KB
binfmt_misc.c -rw-r--r-- 15.0 KB
binfmt_script.c -rw-r--r-- 2.7 KB
binfmt_som.c -rw-r--r-- 7.1 KB
bio-integrity.c -rw-r--r-- 20.5 KB
bio.c -rw-r--r-- 40.2 KB
block_dev.c -rw-r--r-- 42.0 KB
buffer.c -rw-r--r-- 87.0 KB
char_dev.c -rw-r--r-- 14.0 KB
compat.c -rw-r--r-- 44.7 KB
compat_binfmt_elf.c -rw-r--r-- 3.6 KB
compat_ioctl.c -rw-r--r-- 45.5 KB
coredump.c -rw-r--r-- 16.5 KB
coredump.h -rw-r--r-- 106 bytes
dcache.c -rw-r--r-- 80.5 KB
dcookies.c -rw-r--r-- 6.8 KB
direct-io.c -rw-r--r-- 37.4 KB
drop_caches.c -rw-r--r-- 1.5 KB
eventfd.c -rw-r--r-- 11.3 KB
eventpoll.c -rw-r--r-- 54.0 KB
exec.c -rw-r--r-- 39.6 KB
fcntl.c -rw-r--r-- 16.3 KB
fhandle.c -rw-r--r-- 6.4 KB
fifo.c -rw-r--r-- 3.2 KB
file.c -rw-r--r-- 23.5 KB
file_table.c -rw-r--r-- 12.2 KB
filesystems.c -rw-r--r-- 6.4 KB
fs-writeback.c -rw-r--r-- 39.4 KB
fs_struct.c -rw-r--r-- 3.2 KB
generic_acl.c -rw-r--r-- 3.9 KB
inode.c -rw-r--r-- 48.7 KB
internal.h -rw-r--r-- 3.0 KB
ioctl.c -rw-r--r-- 15.6 KB
ioprio.c -rw-r--r-- 5.0 KB
libfs.c -rw-r--r-- 25.8 KB
locks.c -rw-r--r-- 58.7 KB
mbcache.c -rw-r--r-- 16.4 KB
mount.h -rw-r--r-- 2.3 KB
mpage.c -rw-r--r-- 20.0 KB
namei.c -rw-r--r-- 99.0 KB
namespace.c -rw-r--r-- 68.2 KB
no-block.c -rw-r--r-- 688 bytes
open.c -rw-r--r-- 24.3 KB
pipe.c -rw-r--r-- 28.9 KB
pnode.c -rw-r--r-- 8.8 KB
pnode.h -rw-r--r-- 1.5 KB
posix_acl.c -rw-r--r-- 9.2 KB
proc_namespace.c -rw-r--r-- 7.5 KB
read_write.c -rw-r--r-- 21.6 KB
read_write.h -rw-r--r-- 632 bytes
readdir.c -rw-r--r-- 6.8 KB
select.c -rw-r--r-- 24.0 KB
seq_file.c -rw-r--r-- 19.6 KB
signalfd.c -rw-r--r-- 8.3 KB
splice.c -rw-r--r-- 46.3 KB
stack.c -rw-r--r-- 2.5 KB
stat.c -rw-r--r-- 11.1 KB
statfs.c -rw-r--r-- 5.2 KB
super.c -rw-r--r-- 34.6 KB
sync.c -rw-r--r-- 10.6 KB
timerfd.c -rw-r--r-- 8.5 KB
utimes.c -rw-r--r-- 5.6 KB
xattr.c -rw-r--r-- 22.3 KB
xattr_acl.c -rw-r--r-- 4.3 KB

back to top