On 6/23/08, Michael Buesch <mb@xxxxxxxxx> wrote: > On Monday 23 June 2008 10:30:47 Ivo Van Doorn wrote: >> On 6/23/08, Michael Buesch <mb@xxxxxxxxx> wrote: >> > On Monday 23 June 2008 00:42:41 Ivo van Doorn wrote: >> >> That function calls flush_workqueue() >> > >> > Uh wait. It shouldn't call that. Where exactly is this function called? >> >> It is called right before local->ops->remove_interface() which means the >> workqueue is flushed when it isn't even guaranteed that all interfaces are >> gone. >> >> net/mac80211/main.c:553 >> >> static int ieee80211_stop(struct net_device *dev) >> { >> <snip> >> switch (sdata->vif.type) { >> case IEEE80211_IF_TYPE_MESH_POINT: >> case IEEE80211_IF_TYPE_STA: >> case IEEE80211_IF_TYPE_IBSS: >> <snip> >> flush_workqueue(local->hw.workqueue); >> <snip> >> } >> <snip> >> } > > Oh right. I see. This is actually OK. I thought it would flush the global > wq. > The local mac80211 wq was introduced to workaround this rtnl deadlock, > so I'm surprised it happens again. Well it was caused by the recent introduction of the interface iterator. Question now is if we need to restrict the usage, remove the flush_workqueue, or change the locking in the interface iterator. :S Ivo -- 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