Okay, I have tracked down a bit more info on this bug: it is evidently a soft lockup resulting from a spinlock. I can reproduce it by trying to upload a 1gb file to a remote server without limiting the upload rate... my system will freeze within a few seconds or minutes of starting this. The system freezes, and then a few seconds later it spews out debug info onto the console.
uname -a: Linux localhost 2.6.19-7-generic #2 SMP Mon Dec 4 12:39:22 UTC 2006 x86_64 GNU/Linux
Unfortunately I haven't got a serial console set up, but here are the top few levels of the call trace, which are always the same:
Here is the code of the offending function (in the file /usr/src/linux-source-2.6.19/ubuntu/wireless/rtl_ieee80211/rtl_ieee80211_softmac.c from the Ubuntu package linux-source-2.6.19):
void rtl_ieee80211_stop_queue(struct rtl_ieee80211_device *ieee)
{
unsigned long flags; spin_lock_irqsave(&ieee->lock,flags);
if (! netif_queue_stopped(ieee->dev)){ netif_stop_queue(ieee->dev); ieee->softmac_stats.swtxstop++;
} ieee->queue_stop = 1; spin_unlock_irqrestore(&ieee->lock,flags);
}
Okay, will this help get the ball rolling for finding a fix to this problem? Any hints on how to fix it? I haven't done much kernel hacking...
Okay, I have tracked down a bit more info on this bug: it is evidently a soft lockup resulting from a spinlock. I can reproduce it by trying to upload a 1gb file to a remote server without limiting the upload rate... my system will freeze within a few seconds or minutes of starting this. The system freezes, and then a few seconds later it spews out debug info onto the console.
uname -a: Linux localhost 2.6.19-7-generic #2 SMP Mon Dec 4 12:39:22 UTC 2006 x86_64 GNU/Linux
Unfortunately I haven't got a serial console set up, but here are the top few levels of the call trace, which are always the same:
Call trace: rtl:rtl_ ieee80211_ stop_queue+ 0x20/0x60 rtl:rtl_ ieee80211_ softmac_ xmit+0x74/ 0xc0 rtl:rtl_ ieee80211_ xmit+0x886/ 0x960 run+0x11c/ 0x200 queue_xmit+ 0x125/0x270 output+ 0x217/0x270 queue_xmit+ 0x446/0x4a0 transmit_ skb+0x666/ 0x700 push_one+ 0xfc/0x150 sendmsg+ 0x88f/0xb10
:ieee80211_
:ieee80211_
:ieee80211_
__qdisc_
dev_
ip_
ip_
tcp_
tcp_
tcp_
Code: 83 3f 00 7e fa eb f2 c3 0f 1f 80
00 00 00 00 0f 1f 80 00 00
Here is the code of the offending function (in the file /usr/src/ linux-source- 2.6.19/ ubuntu/ wireless/ rtl_ieee80211/ rtl_ieee80211_ softmac. c from the Ubuntu package linux-source- 2.6.19) :
void rtl_ieee80211_ stop_queue( struct rtl_ieee80211_ device *ieee)
spin_lock_ irqsave( &ieee-> lock,flags) ;
{
unsigned long flags;
if (! netif_queue_ stopped( ieee->dev) ){
netif_ stop_queue( ieee->dev) ;
ieee- >softmac_ stats.swtxstop+ +;
ieee-> queue_stop = 1;
spin_unlock_ irqrestore( &ieee-> lock,flags) ;
}
}
Okay, will this help get the ball rolling for finding a fix to this problem? Any hints on how to fix it? I haven't done much kernel hacking...