mac80211: synchronize_net() before flushing the queues
authorEmmanuel Grumbach <emmanuel.grumbach@intel.com>
Thu, 22 Jan 2015 21:30:19 +0000 (23:30 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Fri, 23 Jan 2015 09:54:21 +0000 (10:54 +0100)
commit14f2ae83d07a0a0d499d4760dd4a1bffd310b6ae
treebc12644be9bc7c8959464353f2fb63e5ce1aa930
parent9c74893441d3cf4b258a82b19cbf6bfd2ed6e549
mac80211: synchronize_net() before flushing the queues

When mac80211 disconnects, it drops all the packets on the
queues. This happens after the net stack has been notified
that we have no link anymore (netif_carrier_off).
netif_carrier_off ensures that no new packets are sent to
xmit() callback, but we might have older packets in the
middle of the Tx path. These packets will land in the
driver's queues after the latter have been flushed.
Synchronize_net() between netif_carrier_off and drv_flush()
will fix this.

Note that we can't call synchronize_net inside
ieee80211_flush_queues since there are flows that call
ieee80211_flush_queues and don't need synchronize_net()
which is an expensive operation.

Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
[reword comment to be more accurate]
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/mac80211/mlme.c