diff options
Diffstat (limited to 'drivers/net/ethernet/sfc/rx.c')
| -rw-r--r-- | drivers/net/ethernet/sfc/rx.c | 12 | 
1 files changed, 10 insertions, 2 deletions
diff --git a/drivers/net/ethernet/sfc/rx.c b/drivers/net/ethernet/sfc/rx.c index 48588ddf81b0..c0ad95d2f63d 100644 --- a/drivers/net/ethernet/sfc/rx.c +++ b/drivers/net/ethernet/sfc/rx.c @@ -462,6 +462,7 @@ efx_rx_packet_gro(struct efx_channel *channel, struct efx_rx_buffer *rx_buf,  	skb_record_rx_queue(skb, channel->rx_queue.core_index); +	skb_mark_napi_id(skb, &channel->napi_str);  	gro_result = napi_gro_frags(napi);  	if (gro_result != GRO_DROP)  		channel->irq_mod_score += 2; @@ -480,8 +481,10 @@ static struct sk_buff *efx_rx_mk_skb(struct efx_channel *channel,  	skb = netdev_alloc_skb(efx->net_dev,  			       efx->rx_ip_align + efx->rx_prefix_size +  			       hdr_len); -	if (unlikely(skb == NULL)) +	if (unlikely(skb == NULL)) { +		atomic_inc(&efx->n_rx_noskb_drops);  		return NULL; +	}  	EFX_BUG_ON_PARANOID(rx_buf->len < hdr_len); @@ -518,6 +521,8 @@ static struct sk_buff *efx_rx_mk_skb(struct efx_channel *channel,  	/* Move past the ethernet header */  	skb->protocol = eth_type_trans(skb, efx->net_dev); +	skb_mark_napi_id(skb, &channel->napi_str); +  	return skb;  } @@ -528,6 +533,8 @@ void efx_rx_packet(struct efx_rx_queue *rx_queue, unsigned int index,  	struct efx_channel *channel = efx_rx_queue_channel(rx_queue);  	struct efx_rx_buffer *rx_buf; +	rx_queue->rx_packets++; +  	rx_buf = efx_rx_buffer(rx_queue, index);  	rx_buf->flags |= flags; @@ -662,7 +669,8 @@ void __efx_rx_packet(struct efx_channel *channel)  	if (unlikely(!(efx->net_dev->features & NETIF_F_RXCSUM)))  		rx_buf->flags &= ~EFX_RX_PKT_CSUMMED; -	if ((rx_buf->flags & EFX_RX_PKT_TCP) && !channel->type->receive_skb) +	if ((rx_buf->flags & EFX_RX_PKT_TCP) && !channel->type->receive_skb && +	    !efx_channel_busy_polling(channel))  		efx_rx_packet_gro(channel, rx_buf, channel->rx_pkt_n_frags, eh);  	else  		efx_rx_deliver(channel, eh, rx_buf, channel->rx_pkt_n_frags);  |