• E
    ip: Fix ip_dev_loopback_xmit() · e30b38c2
    Eric Dumazet 提交于
    Eric Paris got following trace with a linux-next kernel
    
    [   14.203970] BUG: using smp_processor_id() in preemptible [00000000]
    code: avahi-daemon/2093
    [   14.204025] caller is netif_rx+0xfa/0x110
    [   14.204035] Call Trace:
    [   14.204064]  [<ffffffff81278fe5>] debug_smp_processor_id+0x105/0x110
    [   14.204070]  [<ffffffff8142163a>] netif_rx+0xfa/0x110
    [   14.204090]  [<ffffffff8145b631>] ip_dev_loopback_xmit+0x71/0xa0
    [   14.204095]  [<ffffffff8145b892>] ip_mc_output+0x192/0x2c0
    [   14.204099]  [<ffffffff8145d610>] ip_local_out+0x20/0x30
    [   14.204105]  [<ffffffff8145d8ad>] ip_push_pending_frames+0x28d/0x3d0
    [   14.204119]  [<ffffffff8147f1cc>] udp_push_pending_frames+0x14c/0x400
    [   14.204125]  [<ffffffff814803fc>] udp_sendmsg+0x39c/0x790
    [   14.204137]  [<ffffffff814891d5>] inet_sendmsg+0x45/0x80
    [   14.204149]  [<ffffffff8140af91>] sock_sendmsg+0xf1/0x110
    [   14.204189]  [<ffffffff8140dc6c>] sys_sendmsg+0x20c/0x380
    [   14.204233]  [<ffffffff8100ad82>] system_call_fastpath+0x16/0x1b
    
    While current linux-2.6 kernel doesnt emit this warning, bug is latent
    and might cause unexpected failures.
    
    ip_dev_loopback_xmit() runs in process context, preemption enabled, so
    must call netif_rx_ni() instead of netif_rx(), to make sure that we
    process pending software interrupt.
    
    Same change for ip6_dev_loopback_xmit()
    Reported-by: NEric Paris <eparis@redhat.com>
    Signed-off-by: NEric Dumazet <eric.dumazet@gmail.com>
    Signed-off-by: NDavid S. Miller <davem@davemloft.net>
    e30b38c2
ip6_output.c 38.4 KB