• Johannes Berg's avatar
    mac80211: add ieee80211_iterate_active_interfaces_rtnl() · c7c71066
    Johannes Berg authored
    If it is needed to disconnect multiple virtual interfaces after
    (WoWLAN-) suspend, the most obvious approach would be to iterate
    all interfaces by calling ieee80211_iterate_active_interfaces()
    and then call ieee80211_resume_disconnect() for each one. This
    is what the iwlmvm driver does.
    
    Unfortunately, this causes a locking dependency from mac80211's
    iflist_mtx to the key_mtx. This is problematic as the former is
    intentionally never held while calling any driver operation to
    allow drivers to iterate with their own locks held. The key_mtx
    is held while installing a key into the driver though, so this
    new lock dependency means drivers implementing the logic above
    can no longer hold their own lock while iterating.
    
    To fix this, add a new ieee80211_iterate_active_interfaces_rtnl()
    function that iterates while the RTNL is already held. This is
    true during suspend/resume, so that then the locking dependency
    isn't introduced.
    
    While at it, also refactor the various interface iterators and
    keep only a single implementation called by the various cases.
    Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
    c7c71066
util.c 58.6 KB