RFT: if_ath HAL refactoring

Rui Paulo rpaulo at FreeBSD.org
Wed Sep 22 22:48:19 UTC 2010


On 22 Sep 2010, at 23:42, PseudoCylon wrote:

> 
> 
> 
> 
> ----- Original Message ----
>> From: Bernhard Schmidt <bschmidt at techwires.net>
>> To: freebsd-current at freebsd.org
>> Cc: PseudoCylon <moonlightakkiy at yahoo.ca>; Adrian Chadd <adrian at freebsd.org>
>> Sent: Wed, September 22, 2010 12:09:36 AM
>> Subject: Re: RFT: if_ath HAL refactoring
>> 
>> On Wednesday, September 22, 2010 06:04:49 PseudoCylon wrote:
>>> -----  Original Message ----
>>> 
>>>> From: Adrian Chadd <adrian at freebsd.org>
>>>> To:  PseudoCylon <moonlightakkiy at yahoo.ca>
>>>> Cc: freebsd-current at freebsd.org
>>>> Sent: Tue, September 21, 2010 7:04:37 AM
>>>> Subject: Re: RFT:  if_ath HAL refactoring
>>>> 
>>>> On 21 September 2010 11:58,  PseudoCylon <moonlightakkiy at yahoo.ca>   
> wrote:
>>>>> Just in case anyone wonders, I've added 11n support to  run(4)  (USB
>>>>> NIC). http://gitorious.org/run/run/trees/11n_beta2
>>>>> 
>>>>> It still has some issues,
>>>>> 
>>>>> *  doesn't work well with atheros chips
>>>>> 
>>>>>  * HT + AP + bridge = Tx may stall (seems OK with nat)
>>>>> 
>>>>> So, use it at your  own discretion.
>>>> 
>>>> Want to put together a patch?
>>> 
>>> sure!
>>> 
>>>> Does  it introduce  issues in the non-11n case?
>>> 
>>> No, only in 11n  mode.
>>> 
>>> What I have found so far is that Ralink's driver checks  MAC address of
>>> other end and identify atheros chip by oui. Then, sets  special prot mode
>>> for it. Does this ring a bell?
>> 
>> Are your sure  that this is based on the actual MAC addresses? Atheros drivers 
> 
>> tend to  announce additional capabilities in beacons and probe responses.
> 
> It is based on the actual MAC, but it is Broadcom's oui (00904c). sorry.
> 
>> 
>>> Has  node lock in ieee80211_node_timeout() cased dead lock in HT + AP +
>>> bridge?
>> 
>> I'm not aware of any issues there, though, I'm not very familiar  with HT use 
>> cases.
> 
> I attached witness messages. Those 2 LORs always happen together before 
> deadlock. I hooked iv_input() and unlock/lock node lock to avoid deadlock. (I 
> don't know if it's safe.)
> 
> I wonder if this is run(4) specific problem.
> 
> 
> AK
> 
> 
> lock order reversal:
> 1st 0xffffff8000a267d0 run0_node_lock (run0_node_lock) @ 
> /usr/src/sys/net80211/ieee80211_node.c:1360
> 2nd 0xffffff0001716818 if_bridge (if_bridge) @ 
> /usr/src/sys/net/if_bridge.c:2184
> KDB: stack backtrace:
> db_trace_self_wrapper() at db_trace_self_wrapper+0x2a
> _witness_debugger() at _witness_debugger+0x2e
> witness_checkorder() at witness_checkorder+0x81e
> _mtx_lock_flags() at _mtx_lock_flags+0x78
> bridge_input() at bridge_input+0x7e
> ether_input() at ether_input+0x143
> hostap_input() at hostap_input+0x4ea
> ampdu_rx_flush() at ampdu_rx_flush+0x5e
> ieee80211_ht_node_age() at ieee80211_ht_node_age+0x7b
> ieee80211_node_timeout() at ieee80211_node_timeout+0x2dc
> softclock() at softclock+0x2a0
> intr_event_execute_handlers() at intr_event_execute_handlers+0x66
> ithread_loop() at ithread_loop+0xb2
> fork_exit() at fork_exit+0x12a
> fork_trampoline() at fork_trampoline+0xe
> --- trap 0, rip = 0, rsp = 0xffffff8000052d30, rbp = 0 ---
> 
> lock order reversal:
> 1st 0xffffff8000a267d0 run0_node_lock (run0_node_lock) @ 
> /usr/src/sys/net80211/ieee80211_node.c:1360
> 2nd 0xffffffff80a186c8 tcp (tcp) @ /usr/src/sys/netinet/tcp_input.c:498
> KDB: stack backtrace:
> db_trace_self_wrapper() at db_trace_self_wrapper+0x2a
> _witness_debugger() at _witness_debugger+0x2e
> witness_checkorder() at witness_checkorder+0x81e
> _rw_rlock() at _rw_rlock+0x5f
> tcp_input() at tcp_input+0xa58
> ip_input() at ip_input+0xbc
> netisr_dispatch_src() at netisr_dispatch_src+0xb8
> ether_demux() at ether_demux+0x17d
> ether_input() at ether_input+0x175
> hostap_input() at hostap_input+0x4ea
> ampdu_rx_flush() at ampdu_rx_flush+0x5e
> ieee80211_ht_node_age() at ieee80211_ht_node_age+0x7b
> ieee80211_node_timeout() at ieee80211_node_timeout+0x2dc
> softclock() at softclock+0x2a0
> intr_event_execute_handlers() at intr_event_execute_handlers+0x66
> ithread_loop() at ithread_loop+0xb2
> fork_exit() at fork_exit+0x12a
> fork_trampoline() at fork_trampoline+0xe
> --- trap 0, rip = 0, rsp = 0xffffff8000052d30, rbp = 0 --- 

Can you explain why the run0_node_lock is locked ? I don't have the code at hand..

Regards,
--
Rui Paulo




More information about the freebsd-current mailing list