forked from mirrors/linux
		
	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. Same change for ip6_dev_loopback_xmit() Reported-by: Eric Paris <eparis@redhat.com> Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									8728c544a9
								
							
						
					
					
						commit
						e30b38c298
					
				
					 2 changed files with 2 additions and 2 deletions
				
			
		|  | @ -120,7 +120,7 @@ static int ip_dev_loopback_xmit(struct sk_buff *newskb) | ||||||
| 	newskb->pkt_type = PACKET_LOOPBACK; | 	newskb->pkt_type = PACKET_LOOPBACK; | ||||||
| 	newskb->ip_summed = CHECKSUM_UNNECESSARY; | 	newskb->ip_summed = CHECKSUM_UNNECESSARY; | ||||||
| 	WARN_ON(!skb_dst(newskb)); | 	WARN_ON(!skb_dst(newskb)); | ||||||
| 	netif_rx(newskb); | 	netif_rx_ni(newskb); | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -108,7 +108,7 @@ static int ip6_dev_loopback_xmit(struct sk_buff *newskb) | ||||||
| 	newskb->ip_summed = CHECKSUM_UNNECESSARY; | 	newskb->ip_summed = CHECKSUM_UNNECESSARY; | ||||||
| 	WARN_ON(!skb_dst(newskb)); | 	WARN_ON(!skb_dst(newskb)); | ||||||
| 
 | 
 | ||||||
| 	netif_rx(newskb); | 	netif_rx_ni(newskb); | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Eric Dumazet
						Eric Dumazet