Message ID | 1271337401.16881.2563.camel@edumazet-laptop |
---|---|
State | Superseded, archived |
Delegated to: | David Miller |
Headers | show |
Le jeudi 15 avril 2010 à 15:16 +0200, Eric Dumazet a écrit : > Le lundi 12 avril 2010 à 21:40 +0200, Eric Dumazet a écrit : > > Good spot, RPS changed a bit netif_rx() requirements. > > > > I would change ip_dev_loopback_xmit() to call netif_rx_ni() instead... > > > > David, Tom ? > > > > diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c > > index c65f18e..d1bcc9f 100644 > > --- a/net/ipv4/ip_output.c > > +++ b/net/ipv4/ip_output.c > > @@ -120,7 +120,7 @@ static int ip_dev_loopback_xmit(struct sk_buff *newskb) > > newskb->pkt_type = PACKET_LOOPBACK; > > newskb->ip_summed = CHECKSUM_UNNECESSARY; > > WARN_ON(!skb_dst(newskb)); > > - netif_rx(newskb); > > + netif_rx_ni(newskb); > > return 0; > > } > > > > After some confusion, it seems this was the right fix after all :) > > [PATCH] ip: Fix ip_dev_loopback_xmit() > > 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. > > Reported-by: Eric Paris <eparis@redhat.com> > Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com> > --- > diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c > index c65f18e..d1bcc9f 100644 > --- a/net/ipv4/ip_output.c > +++ b/net/ipv4/ip_output.c > @@ -120,7 +120,7 @@ static int ip_dev_loopback_xmit(struct sk_buff *newskb) > newskb->pkt_type = PACKET_LOOPBACK; > newskb->ip_summed = CHECKSUM_UNNECESSARY; > WARN_ON(!skb_dst(newskb)); > - netif_rx(newskb); > + netif_rx_ni(newskb); > return 0; > } > Oops silly me, I forgot ipv6 updated patch in a couple of minutes -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c index c65f18e..d1bcc9f 100644 --- a/net/ipv4/ip_output.c +++ b/net/ipv4/ip_output.c @@ -120,7 +120,7 @@ static int ip_dev_loopback_xmit(struct sk_buff *newskb) newskb->pkt_type = PACKET_LOOPBACK; newskb->ip_summed = CHECKSUM_UNNECESSARY; WARN_ON(!skb_dst(newskb)); - netif_rx(newskb); + netif_rx_ni(newskb); return 0; }