• Johannes Berg's avatar
    cfg80211: fix circular lock dependency (1) · bc43b28c
    Johannes Berg authored
    Luis reported this lockdep complaint, that he had also
    reported earlier but when trying to analyse I had been
    locking at the wrong code, and never saw the problem:
    (slightly abridged)
    [ INFO: possible circular locking dependency detected ]
    2.6.31-rc4-wl #6
    wpa_supplicant/3799 is trying to acquire lock:
     (cfg80211_mutex){+.+.+.}, at: [<ffffffffa009246a>] cfg80211_get_dev_from_ifindex+0x1a/0x90 [cfg80211]
    but task is already holding lock:
     (rtnl_mutex){+.+.+.}, at: [<ffffffff81400ff2>] rtnl_lock+0x12/0x20
    which lock already depends on the new lock.
    the existing dependency chain (in reverse order) is:
    -> #1 (rtnl_mutex){+.+.+.}:
           [<ffffffff810857b6>] __lock_acquire+0xd76/0x12b0
           [<ffffffff81085dd3>] lock_acquire+0xe3/0x120
           [<ffffffff814ee7a4>] mutex_lock_nested+0x44/0x350
           [<ffffffff81400ff2>] rtnl_lock+0x12/0x20
           [<ffffffffa009f6a5>] nl80211_send_reg_change_event+0x1f5/0x2a0 [cfg80211]
           [<ffffffffa009529e>] set_regdom+0x28e/0x4c0 [cfg80211]
    -> #0 (cfg80211_mutex){+.+.+.}:
           [<ffffffff8108587b>] __lock_acquire+0xe3b/0x12b0
           [<ffffffff81085dd3>] lock_acquire+0xe3/0x120
           [<ffffffff814ee7a4>] mutex_lock_nested+0x44/0x350
           [<ffffffffa009246a>] cfg80211_get_dev_from_ifindex+0x1a/0x90 [cfg80211]
           [<ffffffffa009813f>] get_rdev_dev_by_info_ifindex+0x6f/0xa0 [cfg80211]
           [<ffffffffa009b12b>] nl80211_set_interface+0x3b/0x260 [cfg80211]
    When looking at the correct code, the problem is quite
    obvious. I'm not entirely sure which code paths lead
    here, so until I can analyse it better let's just use
    RCU to avoid the problem.
    Signed-off-by: default avatarJohannes Berg <johannes@sipsolutions.net>
    Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
nl80211.c 114 KB