• R
    IB/mad: Fix possible lock-lock-timer deadlock · 6b2eef8f
    Roland Dreier 提交于
    Lockdep reported a possible deadlock with cm_id_priv->lock,
    mad_agent_priv->lock and mad_agent_priv->timed_work.timer; this
    happens because the mad module does
    
    	cancel_delayed_work(&mad_agent_priv->timed_work);
    
    while holding mad_agent_priv->lock.  cancel_delayed_work() internally
    does del_timer_sync(&mad_agent_priv->timed_work.timer).
    
    This can turn into a deadlock because mad_agent_priv->lock is taken
    inside cm_id_priv->lock, so we can get the following set of contexts
    that deadlock each other:
    
     A: holding cm_id_priv->lock, waiting for mad_agent_priv->lock
     B: holding mad_agent_priv->lock, waiting for del_timer_sync()
     C: interrupt during mad_agent_priv->timed_work.timer that takes
        cm_id_priv->lock
    
    Fix this by using the new __cancel_delayed_work() interface (which
    internally does del_timer() instead of del_timer_sync()) in all the
    places where we are holding a lock.
    
    Addresses: http://bugzilla.kernel.org/show_bug.cgi?id=13757Reported-by: NBart Van Assche <bart.vanassche@gmail.com>
    Signed-off-by: NRoland Dreier <rolandd@cisco.com>
    6b2eef8f
mad.c 83.6 KB