On Mon, Apr 8, 2013 at 12:38 PM, Johannes Berg <johannes@xxxxxxxxxxxxxxxx> wrote: > On Mon, 2013-04-08 at 12:30 -0700, Thomas Pedersen wrote: > >> OK those functions are exported to the drivers. The 'enum >> queue_stop_reason' is defined in ieee80211_i.h, so the driver wouldn't >> be able to interpret them anyway? > > Oh, you're way underestimating the creativity of driver authors :-) > >> Would you prefer a utility function internal to mac80211 which does >> return the reason, > > That seems fine, although a bit more inefficient? > >> or just the following pattern? >> >> if (ieee80211_queue_stopped(hw, queue)) { >> qreason = hw_to_local(hw)->queue_stop_reasons[queue]; >> if (qreason & ~(ALLOWED_QUEUE_STOP_REASONS)) >> something; >> } > > That seems racy? Even asking whether it's stopped is racy though, what > are you even trying to accomplish? Yeah, that's why I'd like to get the reason the first time. _h_mesh_fwding() checks whether the outgoing queue is stopped, to avoid piling frames on the pending queue if the outgoing medium is busy. I guess the idea was to avoid queueing frames faster than the hardware could unload them. Maybe this doesn't actually happen, but we can be a little bit smarter about when to drop forwarded frames. Like if skbs are just being added to the outgoing queue, we probably shouldn't. This patch and the next one show a small improvement in throughput and loss % in the forwarding path. -- Thomas -- 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