• Jeff Mahoney's avatar
    btrfs: fix lockdep warning with reclaim lock inversion · ed55b6ac
    Jeff Mahoney authored
    When encountering memory pressure, testers have run into the following
    lockdep warning. It was caused by __link_block_group calling kobject_add
    with the groups_sem held. kobject_add calls kvasprintf with GFP_KERNEL,
    which gets us into reclaim context. The kobject doesn't actually need
    to be added under the lock -- it just needs to ensure that it's only
    added for the first block group to be linked.
    
    =========================================================
    [ INFO: possible irq lock inversion dependency detected ]
    3.14.0-rc8-default #1 Not tainted
    ---------------------------------------------------------
    kswapd0/169 just changed the state of lock:
     (&delayed_node->mutex){+.+.-.}, at: [<ffffffffa018baea>] __btrfs_release_delayed_node+0x3a/0x200 [btrfs]
    but this lock took another, RECLAIM_FS-unsafe lock in the past:
     (&found->groups_sem){+++++.}
    
    and interrupts could create inverse lock ordering between them.
    
    other info that might help us debug this:
     Possible interrupt unsafe locking scenario:
           CPU0                    CPU1
           ----                    ----
      lock(&found->groups_sem);
                                   local_irq_disable();
                                   lock(&delayed_node->mutex);
                                   lock(&found->groups_sem);
      <Interrupt>
        lock(&delayed_node->mutex);
    
     *** DEADLOCK ***
    2 locks held by kswapd0/169:
     #0:  (shrinker_rwsem){++++..}, at: [<ffffffff81159e8a>] shrink_slab+0x3a/0x160
     #1:  (&type->s_umount_key#27){++++..}, at: [<ffffffff811bac6f>] grab_super_passive+0x3f/0x90
    Signed-off-by: default avatarJeff Mahoney <jeffm@suse.com>
    Signed-off-by: default avatarChris Mason <clm@fb.com>
    ed55b6ac
extent-tree.c 239 KB