Skip to content
  • Mike Marciniszyn's avatar
    IB/qib: Fix lockdep splat in qib_alloc_lkey() · f3bdf344
    Mike Marciniszyn authored
    
    
    The following backtrace is reported with CONFIG_PROVE_RCU:
    
        drivers/infiniband/hw/qib/qib_keys.c:64 suspicious rcu_dereference_check() usage!
        other info that might help us debug this:
        rcu_scheduler_active = 1, debug_locks = 1
        4 locks held by kworker/0:1/56:
        #0:  (events){.+.+.+}, at: [<ffffffff8107a4f5>] process_one_work+0x165/0x4a0
        #1:  ((&wfc.work)){+.+.+.}, at: [<ffffffff8107a4f5>] process_one_work+0x165/0x4a0
        #2:  (device_mutex){+.+.+.}, at: [<ffffffffa0148dd8>] ib_register_device+0x38/0x220 [ib_core]
        #3:  (&(&dev->lk_table.lock)->rlock){......}, at: [<ffffffffa017e81c>] qib_alloc_lkey+0x3c/0x1b0 [ib_qib]
    
        stack backtrace:
        Pid: 56, comm: kworker/0:1 Not tainted 3.10.0-rc1+ #6
        Call Trace:
        [<ffffffff810c0b85>] lockdep_rcu_suspicious+0xe5/0x130
        [<ffffffffa017e8e1>] qib_alloc_lkey+0x101/0x1b0 [ib_qib]
        [<ffffffffa0184886>] qib_get_dma_mr+0xa6/0xd0 [ib_qib]
        [<ffffffffa01461aa>] ib_get_dma_mr+0x1a/0x50 [ib_core]
        [<ffffffffa01678dc>] ib_mad_port_open+0x12c/0x390 [ib_mad]
        [<ffffffff810c2c55>] ?  trace_hardirqs_on_caller+0x105/0x190
        [<ffffffffa0167b92>] ib_mad_init_device+0x52/0x110 [ib_mad]
        [<ffffffffa01917c0>] ?  sl2vl_attr_show+0x30/0x30 [ib_qib]
        [<ffffffffa0148f49>] ib_register_device+0x1a9/0x220 [ib_core]
        [<ffffffffa01b1685>] qib_register_ib_device+0x735/0xa40 [ib_qib]
        [<ffffffff8106ba98>] ? mod_timer+0x118/0x220
        [<ffffffffa017d425>] qib_init_one+0x1e5/0x400 [ib_qib]
        [<ffffffff812ce86e>] local_pci_probe+0x4e/0x90
        [<ffffffff81078118>] work_for_cpu_fn+0x18/0x30
        [<ffffffff8107a566>] process_one_work+0x1d6/0x4a0
        [<ffffffff8107a4f5>] ?  process_one_work+0x165/0x4a0
        [<ffffffff8107c9c9>] worker_thread+0x119/0x370
        [<ffffffff8107c8b0>] ?  manage_workers+0x180/0x180
        [<ffffffff8108294e>] kthread+0xee/0x100
        [<ffffffff81082860>] ?  __init_kthread_worker+0x70/0x70
        [<ffffffff815c04ac>] ret_from_fork+0x7c/0xb0
        [<ffffffff81082860>] ?  __init_kthread_worker+0x70/0x70
    
    Per Documentation/RCU/lockdep-splat.txt, the code now uses rcu_access_pointer()
    vs. rcu_dereference().
    
    Reported-by: default avatarJay Fenlason <fenlason@redhat.com>
    Reviewed-by: default avatarDean Luick <dean.luick@intel.com>
    Signed-off-by: default avatarMike Marciniszyn <mike.marciniszyn@intel.com>
    Signed-off-by: default avatarRoland Dreier <roland@purestorage.com>
    f3bdf344