• Bob Copeland's avatar
    mac80211: mesh: flush paths outside of plink lock · e596af82
    Bob Copeland authored
    Lockdep warned of a lock dependency between the mesh_plink lock
    and the internal lock for the rhashtable.  The problem is that
    the rhashtable code uses a spin lock with softirqs enabled, while
    mesh_plink_timer executes a walk (to flush paths on a state change)
    inside a softirq with the plink lock held.
    
    This leads to the following deadlock if the timer fires while rht
    lock is held on this CPU, and plink lock is held on another CPU:
    
       CPU0                         CPU1
       ----                         ----
       lock(&(&ht->lock)->rlock);
                                    local_irq_disable();
                                    lock(&(&sta->mesh->plink_lock)->rlock);
                                    lock(&(&ht->lock)->rlock);
       <Interrupt>
       lock(&(&sta->mesh->plink_lock)->rlock);
       *** DEADLOCK ***
    
    Fix by waiting until we drop the plink lock to flush paths.
    
    Fixes: d48a1b7cd439 ("mac80211: mesh: convert path table to rhashtable")
    Signed-off-by: default avatarBob Copeland <me@bobcopeland.com>
    Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
    e596af82
mesh_plink.c 30.9 KB