diff options
author | avos <avos@FreeBSD.org> | 2016-06-29 17:25:46 +0000 |
---|---|---|
committer | avos <avos@FreeBSD.org> | 2016-06-29 17:25:46 +0000 |
commit | 19e196315ea112a4d6e5618f871df55902e3bb99 (patch) | |
tree | 7edfcd8a5ab830fc811418da4c0893551af5d185 /sys/net80211/ieee80211_var.h | |
parent | 5c68448b2f996875f54eceb0cf97c6a1a749748c (diff) | |
download | FreeBSD-src-19e196315ea112a4d6e5618f871df55902e3bb99.zip FreeBSD-src-19e196315ea112a4d6e5618f871df55902e3bb99.tar.gz |
net80211: fix LOR/deadlock in ieee80211_ff_node_cleanup().
Add new lock for stageq (part of ieee80211_superg structure) and
ni_tx_superg (part of ieee80211_node structure);
drop com_lock protection where it is used to protect them.
While here, drop duplicate OPACKETS counter incrementation.
ni_tx_ampdu is not protected with it (however, it is also used without
locking in other places; probably, it requires some other solution
to be thread-safe).
Tested with RTL8188CUS (AP) and RTL8188EU (STA).
NOTE: Since this change breaks KBI, all wireless drivers need to be
recompiled.
Reviewed by: adrian
Approved by: re (gjb)
Differential Revision: https://reviews.freebsd.org/D6958
Diffstat (limited to 'sys/net80211/ieee80211_var.h')
-rw-r--r-- | sys/net80211/ieee80211_var.h | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/sys/net80211/ieee80211_var.h b/sys/net80211/ieee80211_var.h index 3c33f0a..5ca3f43 100644 --- a/sys/net80211/ieee80211_var.h +++ b/sys/net80211/ieee80211_var.h @@ -121,6 +121,7 @@ struct ieee80211com { const char *ic_name; /* usually device name */ ieee80211_com_lock_t ic_comlock; /* state update lock */ ieee80211_tx_lock_t ic_txlock; /* ic/vap TX lock */ + ieee80211_ff_lock_t ic_fflock; /* stageq/ni_tx_superg lock */ LIST_ENTRY(ieee80211com) ic_next; /* on global list */ TAILQ_HEAD(, ieee80211vap) ic_vaps; /* list of vap instances */ int ic_headroom; /* driver tx headroom needs */ |