Skip to content

Commit 8d86c61

Browse files
santildavem330
authored andcommitted
ibmveth: Add rx_copybreak
For small packets, create a new skb and copy the packet into it so we avoid tearing down and creating a TCE entry. Signed-off-by: Anton Blanchard <anton@samba.org> Signed-off-by: Santiago Leon <santil@linux.vnet.ibm.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent c08cc3c commit 8d86c61

File tree

1 file changed

+23
-6
lines changed

1 file changed

+23
-6
lines changed

drivers/net/ibmveth.c

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,11 @@ module_param(tx_copybreak, uint, 0644);
122122
MODULE_PARM_DESC(tx_copybreak,
123123
"Maximum size of packet that is copied to a new buffer on transmit");
124124

125+
static unsigned int rx_copybreak __read_mostly = 128;
126+
module_param(rx_copybreak, uint, 0644);
127+
MODULE_PARM_DESC(rx_copybreak,
128+
"Maximum size of packet that is copied to a new buffer on receive");
129+
125130
struct ibmveth_stat {
126131
char name[ETH_GSTRING_LEN];
127132
int offset;
@@ -1002,8 +1007,6 @@ static int ibmveth_poll(struct napi_struct *napi, int budget)
10021007

10031008
restart_poll:
10041009
do {
1005-
struct sk_buff *skb;
1006-
10071010
if (!ibmveth_rxq_pending_buffer(adapter))
10081011
break;
10091012

@@ -1014,20 +1017,34 @@ static int ibmveth_poll(struct napi_struct *napi, int budget)
10141017
ibmveth_debug_printk("recycling invalid buffer\n");
10151018
ibmveth_rxq_recycle_buffer(adapter);
10161019
} else {
1020+
struct sk_buff *skb, *new_skb;
10171021
int length = ibmveth_rxq_frame_length(adapter);
10181022
int offset = ibmveth_rxq_frame_offset(adapter);
10191023
int csum_good = ibmveth_rxq_csum_good(adapter);
10201024

10211025
skb = ibmveth_rxq_get_buffer(adapter);
1022-
if (csum_good)
1023-
skb->ip_summed = CHECKSUM_UNNECESSARY;
10241026

1025-
ibmveth_rxq_harvest_buffer(adapter);
1027+
new_skb = NULL;
1028+
if (length < rx_copybreak)
1029+
new_skb = netdev_alloc_skb(netdev, length);
1030+
1031+
if (new_skb) {
1032+
skb_copy_to_linear_data(new_skb,
1033+
skb->data + offset,
1034+
length);
1035+
skb = new_skb;
1036+
ibmveth_rxq_recycle_buffer(adapter);
1037+
} else {
1038+
ibmveth_rxq_harvest_buffer(adapter);
1039+
skb_reserve(skb, offset);
1040+
}
10261041

1027-
skb_reserve(skb, offset);
10281042
skb_put(skb, length);
10291043
skb->protocol = eth_type_trans(skb, netdev);
10301044

1045+
if (csum_good)
1046+
skb->ip_summed = CHECKSUM_UNNECESSARY;
1047+
10311048
netif_receive_skb(skb); /* send it up */
10321049

10331050
netdev->stats.rx_packets++;

0 commit comments

Comments
 (0)