Skip to content
  • Jiri Kosina's avatar
    mm: mmap: annotate vm_lock_anon_vma locking properly for lockdep · 572043c9
    Jiri Kosina authored
    Commit 5a505085 ("mm/rmap: Convert the struct anon_vma::mutex to an
    rwsem") turned anon_vma mutex to rwsem.
    
    However, the properly annotated nested locking in mm_take_all_locks()
    has been converted from
    
    	mutex_lock_nest_lock(&anon_vma->root->mutex, &mm->mmap_sem);
    
    to
    
    	down_write(&anon_vma->root->rwsem);
    
    which is incomplete, and causes the false positive report from lockdep
    below.
    
    Annotate the fact that mmap_sem is used as an outter lock to serialize
    taking of all the anon_vma rwsems at once no matter the order, using the
    down_write_nest_lock() primitive.
    
    This patch fixes this lockdep report:
    
     =============================================
     [ INFO: possible recursive locking detected ]
     3.8.0-rc2-00036-g5f738967 #171 Not tainted
     ---------------------------------------------
     qemu-kvm/2315 is trying to acquire lock:
      (&anon_vma->rwsem){+.+...}, at: mm_take_all_locks+0x149/0x1b0
    
     but task is already holding lock:
      (&anon_vma->rwsem){+.+...}, at: mm_take_all_locks+0x149/0x1b0
    
     other info that might help us debug this:
      Possible unsafe locking scenario:
    
            CPU0
            ----
       lock(&anon_vma->rwsem);
       lock(&anon_vma->rwsem);
    
      *** DEADLOCK ***
    
      May be due to missing lock nesting notation
    
     4 locks held by qemu-kvm/2315:
      #0:  (&mm->mmap_sem){++++++}, at: do_mmu_notifier_register+0xfc/0x170
      #1:  (mm_all_locks_mutex){+.+...}, at: mm_take_all_locks+0x36/0x1b0
      #2:  (&mapping->i_mmap_mutex){+.+...}, at: mm_take_all_locks+0xc9/0x1b0
      #3:  (&anon_vma->rwsem){+.+...}, at: mm_take_all_locks+0x149/0x1b0
    
     stack backtrace:
     Pid: 2315, comm: qemu-kvm Not tainted 3.8.0-rc2-00036-g5f738967
    
     #171
     Call Trace:
       print_deadlock_bug+0xf2/0x100
       validate_chain+0x4f6/0x720
       __lock_acquire+0x359/0x580
       lock_acquire+0x121/0x190
       down_write+0x3f/0x70
       mm_take_all_locks+0x149/0x1b0
       do_mmu_notifier_register+0x68/0x170
       mmu_notifier_register+0xe/0x10
       kvm_create_vm+0x22b/0x330 [kvm]
       kvm_dev_ioctl+0xf8/0x1a0 [kvm]
       do_vfs_ioctl+0x9d/0x350
       sys_ioctl+0x91/0xb0
       system_call_fastpath+0x16/0x1b
    
    Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
    Cc: Rik van Riel <riel@redhat.com>
    Cc: Ingo Molnar <mingo@kernel.org>
    Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
    Cc: Mel Gorman <mel@csn.ul.ie>
    Tested-by: default avatarSedat Dilek <sedat.dilek@gmail.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    572043c9