• X
    b44: Use dev_kfree_skb_irq() in b44_tx() · 15ac2b08
    Xander Hover 提交于
    Reported issues when using dev_kfree_skb() on UP systems and
    systems with low numbers of cores.  dev_kfree_skb_irq() will
    properly save IRQ state before freeing the skb.
    
    Tested on 3.1.1 and 3.2_rc2
    
    Example of reproducible trace of kernel 3.1.1
    ------------[ cut here ]------------
       WARNING: at kernel/softirq.c:159 local_bh_enable+0x32/0x79()
       ...
       Pid: 0, comm: swapper Not tainted 3.1.1-gentoo #1
       Call Trace:
        [<c1022970>] warn_slowpath_common+0x65/0x7a
        [<c102699e>] ? local_bh_enable+0x32/0x79
        [<c1022994>] warn_slowpath_null+0xf/0x13
        [<c102699e>] local_bh_enable+0x32/0x79
        [<c134bfd8>] destroy_conntrack+0x7c/0x9b
        [<c134890b>] nf_conntrack_destroy+0x1f/0x26
        [<c132e3a6>] skb_release_head_state+0x74/0x83
        [<c132e286>] __kfree_skb+0xb/0x6b
        [<c132e30a>] consume_skb+0x24/0x26
        [<c127c925>] b44_poll+0xaa/0x449
        [<c1333ca1>] net_rx_action+0x3f/0xea
        [<c1026a44>] __do_softirq+0x5f/0xd5
        [<c10269e5>] ? local_bh_enable+0x79/0x79
        <IRQ>  [<c1026c32>] ? irq_exit+0x34/0x8d
        [<c1003628>] ? do_IRQ+0x74/0x87
        [<c13f5329>] ? common_interrupt+0x29/0x30
        [<c1006e18>] ? default_idle+0x29/0x3e
        [<c10015a7>] ? cpu_idle+0x2f/0x5d
        [<c13e91c5>] ? rest_init+0x79/0x7b
        [<c15c66a9>] ? start_kernel+0x297/0x29c
        [<c15c60b0>] ? i386_start_kernel+0xb0/0xb7
       ---[ end trace 583f33bb1aa207a9 ]---
    Signed-off-by: NXander Hover <LKML@hover.be>
    Signed-off-by: NDavid S. Miller <davem@davemloft.net>
    15ac2b08
b44.c 57.9 KB