• Steve Wise's avatar
    RDMA/cxgb3: Fix deadlock in iw_cxgb3 (hang when configuring interface) · b3e123cf
    Steve Wise authored
    When the iw_cxgb3 module's cxgb3_client "add" func gets called by the
    cxgb3 module, the iwarp driver ends up calling the ethtool ops
    get_drvinfo function in cxgb3 to get the fw version and other info.
    Currently the iwarp driver grabs the rtnl lock around this down call
    to serialize.  As of 2.6.27 or so, things changed such that the rtnl
    lock is held around the call to the netdev driver open function.  Also
    the cxgb3_client "add" function doesn't get called if the device is
    down.
    
    So, if you load cxgb3, then load iw_cxgb3, then ifconfig up the
    device, the iw_cxgb3 add func gets called with the rtnl_lock held.  If
    you load cxgb3, ifconfig up the device, then load iw_cxgb3, the add
    func gets called without the rtnl_lock held.  The former causes the
    deadlock, the latter does not.
    
    In addition, there are iw_cxgb3 sysfs handlers that also can call down
    into cxgb3 to gather the fw and hw versions.  These can be called
    concurrently on different processors and at any time.  Thus we need to
    push this serialization down in the cxgb3 driver get_drvinfo func.
    
    The fix is to remove rtnl lock usage, and use a per-device lock in cxgb3.
    Signed-off-by: default avatarSteve Wise <swise@opengridcomputing.com>
    Acked-by: default avatarDivy Le Ray <divy@chelsio.com>
    Signed-off-by: default avatarRoland Dreier <rolandd@cisco.com>
    b3e123cf
iwch_provider.c 37 KB