Commit 13809609 authored by Florian Westphal's avatar Florian Westphal Committed by Jeff Kirsher

e1000: convert to build_skb

Instead of preallocating Rx skbs, allocate them right before sending
inbound packet up the stack.

e1000-kvm, mtu1500, netperf TCP_STREAM:
Size   Size    Size     Time     Throughput
bytes  bytes   bytes    secs.    10^6bits/sec
old: 87380  16384  16384    60.00    4532.40
new: 87380  16384  16384    60.00    4599.05
Signed-off-by: default avatarFlorian Westphal <fw@strlen.de>
Tested-by: default avatarAaron Brown <aaron.f.brown@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
parent 580f321d
...@@ -160,9 +160,11 @@ struct e1000_tx_buffer { ...@@ -160,9 +160,11 @@ struct e1000_tx_buffer {
}; };
struct e1000_rx_buffer { struct e1000_rx_buffer {
struct sk_buff *skb; union {
struct page *page; /* jumbo: alloc_page */
u8 *data; /* else, netdev_alloc_frag */
} rxbuf;
dma_addr_t dma; dma_addr_t dma;
struct page *page;
}; };
struct e1000_tx_ring { struct e1000_tx_ring {
......
...@@ -970,8 +970,7 @@ static void e1000_free_desc_rings(struct e1000_adapter *adapter) ...@@ -970,8 +970,7 @@ static void e1000_free_desc_rings(struct e1000_adapter *adapter)
rxdr->buffer_info[i].dma, rxdr->buffer_info[i].dma,
E1000_RXBUFFER_2048, E1000_RXBUFFER_2048,
DMA_FROM_DEVICE); DMA_FROM_DEVICE);
if (rxdr->buffer_info[i].skb) kfree(rxdr->buffer_info[i].rxbuf.data);
dev_kfree_skb(rxdr->buffer_info[i].skb);
} }
} }
...@@ -1095,24 +1094,25 @@ static int e1000_setup_desc_rings(struct e1000_adapter *adapter) ...@@ -1095,24 +1094,25 @@ static int e1000_setup_desc_rings(struct e1000_adapter *adapter)
for (i = 0; i < rxdr->count; i++) { for (i = 0; i < rxdr->count; i++) {
struct e1000_rx_desc *rx_desc = E1000_RX_DESC(*rxdr, i); struct e1000_rx_desc *rx_desc = E1000_RX_DESC(*rxdr, i);
struct sk_buff *skb; u8 *buf;
skb = alloc_skb(E1000_RXBUFFER_2048 + NET_IP_ALIGN, GFP_KERNEL); buf = kzalloc(E1000_RXBUFFER_2048 + NET_SKB_PAD + NET_IP_ALIGN,
if (!skb) { GFP_KERNEL);
if (!buf) {
ret_val = 7; ret_val = 7;
goto err_nomem; goto err_nomem;
} }
skb_reserve(skb, NET_IP_ALIGN); rxdr->buffer_info[i].rxbuf.data = buf;
rxdr->buffer_info[i].skb = skb;
rxdr->buffer_info[i].dma = rxdr->buffer_info[i].dma =
dma_map_single(&pdev->dev, skb->data, dma_map_single(&pdev->dev,
buf + NET_SKB_PAD + NET_IP_ALIGN,
E1000_RXBUFFER_2048, DMA_FROM_DEVICE); E1000_RXBUFFER_2048, DMA_FROM_DEVICE);
if (dma_mapping_error(&pdev->dev, rxdr->buffer_info[i].dma)) { if (dma_mapping_error(&pdev->dev, rxdr->buffer_info[i].dma)) {
ret_val = 8; ret_val = 8;
goto err_nomem; goto err_nomem;
} }
rx_desc->buffer_addr = cpu_to_le64(rxdr->buffer_info[i].dma); rx_desc->buffer_addr = cpu_to_le64(rxdr->buffer_info[i].dma);
memset(skb->data, 0x00, skb->len);
} }
return 0; return 0;
...@@ -1385,13 +1385,13 @@ static void e1000_create_lbtest_frame(struct sk_buff *skb, ...@@ -1385,13 +1385,13 @@ static void e1000_create_lbtest_frame(struct sk_buff *skb,
memset(&skb->data[frame_size / 2 + 12], 0xAF, 1); memset(&skb->data[frame_size / 2 + 12], 0xAF, 1);
} }
static int e1000_check_lbtest_frame(struct sk_buff *skb, static int e1000_check_lbtest_frame(const unsigned char *data,
unsigned int frame_size) unsigned int frame_size)
{ {
frame_size &= ~1; frame_size &= ~1;
if (skb->data[3] == 0xFF) { if (*(data + 3) == 0xFF) {
if (skb->data[frame_size / 2 + 10] == 0xBE && if ((*(data + frame_size / 2 + 10) == 0xBE) &&
skb->data[frame_size / 2 + 12] == 0xAF) { (*(data + frame_size / 2 + 12) == 0xAF)) {
return 0; return 0;
} }
} }
...@@ -1443,7 +1443,8 @@ static int e1000_run_loopback_test(struct e1000_adapter *adapter) ...@@ -1443,7 +1443,8 @@ static int e1000_run_loopback_test(struct e1000_adapter *adapter)
DMA_FROM_DEVICE); DMA_FROM_DEVICE);
ret_val = e1000_check_lbtest_frame( ret_val = e1000_check_lbtest_frame(
rxdr->buffer_info[l].skb, rxdr->buffer_info[l].rxbuf.data +
NET_SKB_PAD + NET_IP_ALIGN,
1024); 1024);
if (!ret_val) if (!ret_val)
good_cnt++; good_cnt++;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment