• Hugh Dickins's avatar
    lib/radix-tree.c: swapoff tmpfs radix_tree: remember to rcu_read_unlock · 5f30fc94
    Hugh Dickins authored
    Running fsx on tmpfs with concurrent memhog-swapoff-swapon, lots of
    
      BUG: sleeping function called from invalid context at kernel/fork.c:606
      in_atomic(): 0, irqs_disabled(): 0, pid: 1394, name: swapoff
      1 lock held by swapoff/1394:
       #0:  (rcu_read_lock){.+.+.+}, at: [<ffffffff812520a1>] radix_tree_locate_item+0x1f/0x2b6
    
    followed by
    
      ================================================
      [ BUG: lock held when returning to user space! ]
      3.14.0-rc1 #3 Not tainted
      ------------------------------------------------
      swapoff/1394 is leaving the kernel with locks still held!
      1 lock held by swapoff/1394:
       #0:  (rcu_read_lock){.+.+.+}, at: [<ffffffff812520a1>] radix_tree_locate_item+0x1f/0x2b6
    
    after which the system recovered nicely.
    
    Whoops, I long ago forgot the rcu_read_unlock() on one unlikely branch.
    
    Fixes e504f3fd ("tmpfs radix_tree: locate_item to speed up swapoff")
    Signed-off-by: default avatarHugh Dickins <hughd@google.com>
    Cc: Johannes Weiner <hannes@cmpxchg.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    5f30fc94
radix-tree.c 40.1 KB