This contains just a single fix for a crash I happened to randomly
run into today during testing. It's clearly been around for a while, but is pretty hard to trigger, even when I tried explicitly (and modified the code to make it more likely) it rarely did. -----BEGIN PGP SIGNATURE----- iQIcBAABCAAGBQJVG/WSAAoJEDBSmw7B7bqrzmgQALygsyo0GrmHHorg0wkO+PBK l6kVknRwlsMil+vmB6mPTnwgUaGnEWJeRXl4zPJeA4Z+Xr58K1lyTFcMC0nu2MVb MNcTJycRmF4Lqyycd52zFaA+1vMsgG7AZb6vXLYppchUFTmbLVNX/IWhJGNOAsKZ HjYdvLr2kbJunIRofc/0PCC/8J4qFQj2ZphF5WfMckhNrh8+SQjIqmscFdRIqcgj R+LtyxscyKWspQ97J6OdoTsKpxTKSZ8mi9IvohdJhkJVnzBEkJx+Krf6PNs+Xnh1 Z4x1Dkn1RoM8+7cakq2tTwwxokEw7de/3v/s90W+yVuZWNKsaiKHcnU+KGHu6t0J 2766PXv6hC3KSWN6XrfTxYP7CBsT46Vf5+7FSlDsck1tUbn3W55c2kPFMBKk79yi CHjz1O82wzx4bAVNdaKMpR8rz6bSyhZijmduMuYxxrvnKkl5BSHype9IAUo+etVz KxPnwGq9yJjf0RYdr9tttxiwXJaADD6/R/bO21SIi1JeKa5sCyoAA5nLDyJfXwyt KtlrzzM9NWqoQUi2SGmurHHEIBBmgg9RBBWvq+MNM0Ik7d9kIawCBlvPerVc4IH4 bUvIXEnrQNOEwxmY/9nsUShQvkzuQbkwR3rpEYA3XemO0qW1t0Tkdp/3UY3TY6Sq EOTi9LkOquZnKd9GB7yl =Imm5 -----END PGP SIGNATURE----- Merge tag 'mac80211-for-davem-2015-04-01' of git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211 Johannes Berg says: ==================== This contains just a single fix for a crash I happened to randomly run into today during testing. It's clearly been around for a while, but is pretty hard to trigger, even when I tried explicitly (and modified the code to make it more likely) it rarely did. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
af3e09e666
|
@ -49,8 +49,6 @@ static void ieee80211_free_tid_rx(struct rcu_head *h)
|
|||
container_of(h, struct tid_ampdu_rx, rcu_head);
|
||||
int i;
|
||||
|
||||
del_timer_sync(&tid_rx->reorder_timer);
|
||||
|
||||
for (i = 0; i < tid_rx->buf_size; i++)
|
||||
__skb_queue_purge(&tid_rx->reorder_buf[i]);
|
||||
kfree(tid_rx->reorder_buf);
|
||||
|
@ -93,6 +91,12 @@ void ___ieee80211_stop_rx_ba_session(struct sta_info *sta, u16 tid,
|
|||
|
||||
del_timer_sync(&tid_rx->session_timer);
|
||||
|
||||
/* make sure ieee80211_sta_reorder_release() doesn't re-arm the timer */
|
||||
spin_lock_bh(&tid_rx->reorder_lock);
|
||||
tid_rx->removed = true;
|
||||
spin_unlock_bh(&tid_rx->reorder_lock);
|
||||
del_timer_sync(&tid_rx->reorder_timer);
|
||||
|
||||
call_rcu(&tid_rx->rcu_head, ieee80211_free_tid_rx);
|
||||
}
|
||||
|
||||
|
|
|
@ -873,9 +873,10 @@ static void ieee80211_sta_reorder_release(struct ieee80211_sub_if_data *sdata,
|
|||
|
||||
set_release_timer:
|
||||
|
||||
mod_timer(&tid_agg_rx->reorder_timer,
|
||||
tid_agg_rx->reorder_time[j] + 1 +
|
||||
HT_RX_REORDER_BUF_TIMEOUT);
|
||||
if (!tid_agg_rx->removed)
|
||||
mod_timer(&tid_agg_rx->reorder_timer,
|
||||
tid_agg_rx->reorder_time[j] + 1 +
|
||||
HT_RX_REORDER_BUF_TIMEOUT);
|
||||
} else {
|
||||
del_timer(&tid_agg_rx->reorder_timer);
|
||||
}
|
||||
|
|
|
@ -175,6 +175,7 @@ struct tid_ampdu_tx {
|
|||
* @reorder_lock: serializes access to reorder buffer, see below.
|
||||
* @auto_seq: used for offloaded BA sessions to automatically pick head_seq_and
|
||||
* and ssn.
|
||||
* @removed: this session is removed (but might have been found due to RCU)
|
||||
*
|
||||
* This structure's lifetime is managed by RCU, assignments to
|
||||
* the array holding it must hold the aggregation mutex.
|
||||
|
@ -199,6 +200,7 @@ struct tid_ampdu_rx {
|
|||
u16 timeout;
|
||||
u8 dialog_token;
|
||||
bool auto_seq;
|
||||
bool removed;
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
Loading…
Reference in New Issue