Comment 13 for bug 31857

Revision history for this message
Dan Lenski (lenski) wrote :

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:
    :ieee80211_rtl:rtl_ieee80211_stop_queue+0x20/0x60
    :ieee80211_rtl:rtl_ieee80211_softmac_xmit+0x74/0xc0
    :ieee80211_rtl:rtl_ieee80211_xmit+0x886/0x960
    __qdisc_run+0x11c/0x200
    dev_queue_xmit+0x125/0x270
    ip_output+0x217/0x270
    ip_queue_xmit+0x446/0x4a0
    tcp_transmit_skb+0x666/0x700
    tcp_push_one+0xfc/0x150
    tcp_sendmsg+0x88f/0xb10

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)
{
        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...