Skip to content

Commit

Permalink
mac80211: fix stopping RX BA session from timer
Browse files Browse the repository at this point in the history
Kalle reported that his system deadlocks since my
recent work in this area. The reason quickly became
apparent: we try to cancel_timer_sync() a timer
from within itself. Fix that by making the function
aware of the context it is called from.

Reported-by: Kalle Valo <kvalo@adurom.com>
Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Tested-by: Kalle Valo <kvalo@adurom.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
  • Loading branch information
Johannes Berg authored and John W. Linville committed Apr 19, 2010
1 parent 93d95b1 commit 2aab4c2
Showing 1 changed file with 13 additions and 5 deletions.
18 changes: 13 additions & 5 deletions net/mac80211/agg-rx.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,9 @@
#include "ieee80211_i.h"
#include "driver-ops.h"

void __ieee80211_stop_rx_ba_session(struct sta_info *sta, u16 tid,
u16 initiator, u16 reason)
static void ___ieee80211_stop_rx_ba_session(struct sta_info *sta, u16 tid,
u16 initiator, u16 reason,
bool from_timer)
{
struct ieee80211_local *local = sta->local;
struct tid_ampdu_rx *tid_rx;
Expand Down Expand Up @@ -69,10 +70,17 @@ void __ieee80211_stop_rx_ba_session(struct sta_info *sta, u16 tid,

spin_unlock_bh(&sta->lock);

del_timer_sync(&tid_rx->session_timer);
if (!from_timer)
del_timer_sync(&tid_rx->session_timer);
kfree(tid_rx);
}

void __ieee80211_stop_rx_ba_session(struct sta_info *sta, u16 tid,
u16 initiator, u16 reason)
{
___ieee80211_stop_rx_ba_session(sta, tid, initiator, reason, false);
}

/*
* After accepting the AddBA Request we activated a timer,
* resetting it after each frame that arrives from the originator.
Expand All @@ -91,8 +99,8 @@ static void sta_rx_agg_session_timer_expired(unsigned long data)
#ifdef CONFIG_MAC80211_HT_DEBUG
printk(KERN_DEBUG "rx session timer expired on tid %d\n", (u16)*ptid);
#endif
__ieee80211_stop_rx_ba_session(sta, *ptid, WLAN_BACK_RECIPIENT,
WLAN_REASON_QSTA_TIMEOUT);
___ieee80211_stop_rx_ba_session(sta, *ptid, WLAN_BACK_RECIPIENT,
WLAN_REASON_QSTA_TIMEOUT, true);
}

static void ieee80211_send_addba_resp(struct ieee80211_sub_if_data *sdata, u8 *da, u16 tid,
Expand Down

0 comments on commit 2aab4c2

Please sign in to comment.