On Wed, 2007-09-05 at 16:16 +0200, Michael Buesch wrote: > > > 1) Use ieee80211_stop_queues() in ->configure_filter() and > > > ieee80211_wake_queues() at the end of the workqueue function. > > > > > > 2) Throw away all packets until the workqueue function > > > terminates. > > > > > > 3) Implement our own tx queue. > > > > > > I prefer to do option (1) because it wouldn't require adding > > > additional fields to our private structure beside the work_struct > > > for the workqueue function, it is simple to implement and it would > > > not throw away any packets. Are there any side effects that I have > > > overlooked? > > > > I think Michael says it's currently buggy if called outside of ->tx(). > > Yes, we had a bug in b43 where we used it in the periodic workqueue. > It causes really hard to track down system freezes on UP > systems due to races with the TX code. > It will hang and busy wait in the qdisc code when this triggers. > I didn't see a fix for this, yet. > But I think a fix could probably be to take the netif_tx_lock > in the ieee80211_stop_queues() function, so we make sure that no > TX is in progress while we stop it. Ok. Of course, for zd1211 it'd be easy to set a flag in configure_filter() and check that flag in tx() and if it's set then call stop_queues(). johannes
Attachment:
signature.asc
Description: This is a digitally signed message part