Search Linux Wireless

Re: [PATCH] mac80211: Limit TID buffering during BA session setup/teardown

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, Mar 7, 2012 at 6:00 PM, Johannes Berg <johannes@xxxxxxxxxxxxxxxx> wrote:
> On Wed, 2012-03-07 at 17:20 +0100, Helmut Schaa wrote:
>> While setting up or tearing down a BA session mac80211 is buffering
>> pending frames for the according TID. However, there's currently no
>> limit on how many frames are buffered possibly leading to an out-of-
>> memory situation. This can happen on systems with little memory when
>> the CPU is fully loaded since the BA session work is executed in
>> process context while frames can still come via softirq.
>>
>> Apply a limitation to the TIDs pending queue to avoid consuming
>> too much memory in this situation.
>>
>> Signed-off-by: Helmut Schaa <helmut.schaa@xxxxxxxxxxxxxx>
>> ---
>>  net/mac80211/tx.c |    6 ++++++
>>  1 files changed, 6 insertions(+), 0 deletions(-)
>>
>> diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c
>> index 1be0ca2..4b07828 100644
>> --- a/net/mac80211/tx.c
>> +++ b/net/mac80211/tx.c
>> @@ -1060,6 +1060,7 @@ static bool ieee80211_tx_prep_agg(struct ieee80211_tx_data *tx,
>>  {
>>       bool queued = false;
>>       bool reset_agg_timer = false;
>> +     struct sk_buff *purge_skb = NULL;
>>
>>       if (test_bit(HT_AGG_STATE_OPERATIONAL, &tid_tx->state)) {
>>               info->flags |= IEEE80211_TX_CTL_AMPDU;
>> @@ -1101,8 +1102,13 @@ static bool ieee80211_tx_prep_agg(struct ieee80211_tx_data *tx,
>>                       info->control.vif = &tx->sdata->vif;
>>                       info->flags |= IEEE80211_TX_INTFL_NEED_TXPROCESSING;
>>                       __skb_queue_tail(&tid_tx->pending, skb);
>> +                     if (skb_queue_len(&tid_tx->pending) > STA_MAX_TX_BUFFER)
>> +                             purge_skb = __skb_dequeue(&tid_tx->pending);
>>               }
>>               spin_unlock(&tx->sta->lock);
>> +
>> +             if (purge_skb)
>> +                     dev_kfree_skb(purge_skb);
>
> Shouldn't we stop the netdev queues or something instead?

As discussed privately (because I was unable to use the mail client on
my mobile phone
correctly :) ) it would be possible to stop the netdev queues instead
of dropping frames for
this STA/TID here.

But since the situation can also be triggered externally (by delaying
the ADDBA response
for example) I think stopping the netdev queues in this case is
problematic as it will affect
all STAs/TIDs and not only the one.

Hence, I still think the taken approach is reasonable.

Helmut
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Wireless Personal Area Network]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite Hiking]     [MIPS Linux]     [ARM Linux]     [Linux RAID]

  Powered by Linux