• Erez Shitrit's avatar
    IB/ipoib: Avoid flushing the workqueue from worker context · 4eae3748
    Erez Shitrit authored
    The error flow of ipoib_ib_dev_open() invokes ipoib_ib_dev_stop() with
    workqueue flushing enabled, which deadlocks if the open procedure
    itself was called by a worker thread.
    
    Fix this by adding a flush enabled flag to ipoib_ib_dev_open() and set
    it accordingly from the locations where such a call is made.
    
    The call trace was the following:
    
     [<ffffffff81095bc4>] ? flush_workqueue+0x54/0x80
     [<ffffffffa056c657>] ? ipoib_ib_dev_stop+0x447/0x650 [ib_ipoib]
     [<ffffffffa056cc34>] ? ipoib_ib_dev_open+0x284/0x430 [ib_ipoib]
     [<ffffffffa05674a8>] ? ipoib_open+0x78/0x1d0 [ib_ipoib]
     [<ffffffffa05697b8>] ? ipoib_pkey_open+0x38/0x40 [ib_ipoib]
     [<ffffffffa056cf3c>] ? __ipoib_ib_dev_flush+0x15c/0x2c0 [ib_ipoib]
     [<ffffffffa056ce56>] ? __ipoib_ib_dev_flush+0x76/0x2c0 [ib_ipoib]
     [<ffffffffa056d0a0>] ? ipoib_ib_dev_flush_heavy+0x0/0x20 [ib_ipoib]
     [<ffffffffa056d0ba>] ? ipoib_ib_dev_flush_heavy+0x1a/0x20 [ib_ipoib]
     [<ffffffff81094d20>] ? worker_thread+0x170/0x2a0
     [<ffffffff8109b2a0>] ? autoremove_wake_function+0x0/0x40
    Signed-off-by: default avatarErez Shitrit <erezsh@mellanox.com>
    Signed-off-by: default avatarOr Gerlitz <ogerlitz@mellanox.com>
    Acked-by: default avatarAlex Estrin <alex.estrin@intel.com>
    Signed-off-by: default avatarRoland Dreier <roland@purestorage.com>
    4eae3748
ipoib_main.c 43.8 KB