• Emmanuel Grumbach's avatar
    mac80211: fix race between the AGG SM and the Tx data path · 2a1e0fd1
    Emmanuel Grumbach authored
    When a packet is supposed to sent be as an a-MPDU, mac80211 sets
    IEEE80211_TX_CTL_AMPDU to let the driver know. On the other
    hand, mac80211 configures the driver for aggregration with the
    ampdu_action callback.
    There is race between these two mechanisms since the following
    scenario can occur when the BA agreement is torn down:
    
    Tx softIRQ	 			drv configuration
    ==========				=================
    
    check OPERATIONAL bit
    Set the TX_CTL_AMPDU bit in the packet
    
    					clear OPERATIONAL bit
    					stop Tx AGG
    Pass Tx packet to the driver.
    
    In that case the driver would get a packet with TX_CTL_AMPDU set
    although it has already been notified that the BA session has been
    torn down.
    
    To fix this, we need to synchronize all the Qdisc activity after we
    cleared the OPERATIONAL bit. After that step, all the following
    packets will be buffered until the driver reports it is ready to get
    new packets for this RA / TID. This buffering allows not to run into
    another race that would send packets with TX_CTL_AMPDU unset while
    the driver hasn't been requested to tear down the BA session yet.
    
    This race occurs in practice and iwlwifi complains with a WARN_ON
    when it happens.
    
    Cc: stable@kernel.org
    Signed-off-by: default avatarEmmanuel Grumbach <emmanuel.grumbach@intel.com>
    Reviewed-by: default avatarJohannes Berg <johannes@sipsolutions.net>
    Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
    2a1e0fd1
agg-tx.c 23.6 KB