• Roland Dreier's avatar
    IB/ipath: Fix potential deadlock with multicast spinlocks · 8b8c8bca
    Roland Dreier authored
    Lockdep found the following potential deadlock between mcast_lock and
    n_mcast_grps_lock: mcast_lock is taken from both interrupt context and
    process context, so spin_lock_irqsave() must be used to take it.
    n_mcast_grps_lock is only taken from process context, so at first it
    seems safe to take it with plain spin_lock(); however, it also nests
    inside mcast_lock, and hence we could deadlock:
    
      cpu A                                   cpu B
        ipath_mcast_add():
          spin_lock_irq(&mcast_lock);
    
                                                ipath_mcast_detach():
                                                  spin_lock(&n_mcast_grps_lock);
    
                                                <enter interrupt>
    
                                                ipath_mcast_find():
                                                  spin_lock_irqsave(&mcast_lock);
    
          spin_lock(&n_mcast_grps_lock);
    
    Fix this by using spin_lock_irq() to take n_mcast_grps_lock.
    Signed-off-by: default avatarRoland Dreier <rolandd@cisco.com>
    8b8c8bca
ipath_verbs_mcast.c 8.35 KB