On Fri, 2008-11-14 at 13:12 -0800, Luis R. Rodriguez wrote: > mac80211's ieee80211_register_hw() is often called within the > probe path so it cannot assume the device's driver structure > has been attached yet so to create a workqueue instead of > using driver->name use the wiphy's phy%d name. > > This should fix sporadic oopses found when we race to beat the > driver pointer setting. Not even sure how this was working properly. > > http://www.kerneloops.org/search.php?search=ieee80211_register_hw Ok, umm, very odd. Why is it sometimes working? It should always fail... Patch looks ok though, the name of the thing doesn't really matter anyway... > Signed-off-by: Luis R. Rodriguez <lrodriguez@xxxxxxxxxxx> Acked-by: Johannes Berg <johannes@xxxxxxxxxxxxxxxx> > --- > > Tested with iwlagn. If you are running into this oops please test. > > net/mac80211/main.c | 5 ++--- > 1 files changed, 2 insertions(+), 3 deletions(-) > > diff --git a/net/mac80211/main.c b/net/mac80211/main.c > index d631dc9..cec9b6d 100644 > --- a/net/mac80211/main.c > +++ b/net/mac80211/main.c > @@ -722,7 +722,6 @@ EXPORT_SYMBOL(ieee80211_alloc_hw); > int ieee80211_register_hw(struct ieee80211_hw *hw) > { > struct ieee80211_local *local = hw_to_local(hw); > - const char *name; > int result; > enum ieee80211_band band; > struct net_device *mdev; > @@ -787,8 +786,8 @@ int ieee80211_register_hw(struct ieee80211_hw *hw) > mdev->header_ops = &ieee80211_header_ops; > mdev->set_multicast_list = ieee80211_master_set_multicast_list; > > - name = wiphy_dev(local->hw.wiphy)->driver->name; > - local->hw.workqueue = create_freezeable_workqueue(name); > + local->hw.workqueue = > + create_freezeable_workqueue(wiphy_name(local->hw.wiphy)); > if (!local->hw.workqueue) { > result = -ENOMEM; > goto fail_workqueue;
Attachment:
signature.asc
Description: This is a digitally signed message part