Search Linux Wireless

Re: [PATCH] mac80211: Fix deadlock in ieee80211_do_stop.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, 2010-12-09 at 15:34 +0100, Tejun Heo wrote:

>    [<78447ce1>] flush_work+0x23/0x27
>    [<f91a2646>] ieee80211_do_stop+0x25c/0x403 [mac80211]

>    [<787001fe>] rtnetlink_rcv+0x1b/0x22		<- rtnl lock

Right, so we're flushing here under RTNL ... I believe this is the one
that Ben hacked up to not flush or so?

>    [<7878cdab>] _cond_resched+0x2b/0x44
>    [<7878d84f>] mutex_lock_nested+0x22/0x3b
>    [<f919fddc>] ieee80211_sta_rx_queued_mgmt+0x2d/0x3a6 [mac80211]
>    [<f91a2f53>] ieee80211_iface_work+0x1ff/0x282 [mac80211]

> But, sdata->work is busy running ieee80211_iface_work().  I _suspect_
> for some reason iee80211_iface_work() isn't finishing.

It's trying to acquire a mutex here, which must be &ifmgd->mtx or
&local->mtx, but neither of them ever nest around the RTNL.

> That, or, the
> new flush_work() implementation is broken and it's failing to flush
> when a work is being executed back to back.  I'll prep a debug patch
> to determine what's going on.

Thanks.

I wonder if Ben can attempt to reproduce this using compat-wireless
against a kernel that doesn't have the workqueue changes, was the last
one without those 2.6.34? 2.6.35?

> The rest of the system going down the toilet after this is mostly
> caused by the held rtnl_lock above.

Indeed, the rtnl is pretty important :-)

johannes

--
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


[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Device Mapper]
  Powered by Linux