aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKY Srinivasan <kys@microsoft.com>2014-08-02 13:42:02 -0400
committerDavid S. Miller <davem@davemloft.net>2014-08-04 18:07:14 -0400
commit06b47aac4924180d63aad50727a11230d876c348 (patch)
tree3aca663540404cc99138c94e42ee396dee593a09
parent9041263ca9128b9f54fce9c215b09850615ff810 (diff)
Drivers: net-next: hyperv: Increase the size of the sendbuf region
Intel did some benchmarking on our network throughput when Linux on Hyper-V is as used as a gateway. This fix gave us almost a 1 Gbps additional throughput on about 5Gbps base throughput we hadi, prior to increasing the sendbuf size. The sendbuf mechanism is a copy based transport that we have which is clearly more optimal than the copy-free page flipping mechanism (for small packets). In the forwarding scenario, we deal only with MTU sized packets, and increasing the size of the senbuf area gave us the additional performance. For what it is worth, Windows guests on Hyper-V, I am told use similar sendbuf size as well. The exact value of sendbuf I think is less important than the fact that it needs to be larger than what Linux can allocate as physically contiguous memory. Thus the change over to allocating via vmalloc(). We currently allocate 16MB receive buffer and we use vmalloc there for allocation. Also the low level channel code has already been modified to deal with physically dis-contiguous memory in the ringbuffer setup. Based on experimentation Intel did, they say there was some improvement in throughput as the sendbuf size was increased up to 16MB and there was no effect on throughput beyond 16MB. Thus I have chosen 16MB here. Increasing the sendbuf value makes a material difference in small packet handling In this version of the patch, based on David's feedback, I have added additional details in the commit log. Signed-off-by: K. Y. Srinivasan <kys@microsoft.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/hyperv/hyperv_net.h2
-rw-r--r--drivers/net/hyperv/netvsc.c7
2 files changed, 3 insertions, 6 deletions
diff --git a/drivers/net/hyperv/hyperv_net.h b/drivers/net/hyperv/hyperv_net.h
index 24441ae832d1..02a3ee282eee 100644
--- a/drivers/net/hyperv/hyperv_net.h
+++ b/drivers/net/hyperv/hyperv_net.h
@@ -585,7 +585,7 @@ struct nvsp_message {
585 585
586#define NETVSC_RECEIVE_BUFFER_SIZE (1024*1024*16) /* 16MB */ 586#define NETVSC_RECEIVE_BUFFER_SIZE (1024*1024*16) /* 16MB */
587#define NETVSC_RECEIVE_BUFFER_SIZE_LEGACY (1024*1024*15) /* 15MB */ 587#define NETVSC_RECEIVE_BUFFER_SIZE_LEGACY (1024*1024*15) /* 15MB */
588#define NETVSC_SEND_BUFFER_SIZE (1024 * 1024) /* 1MB */ 588#define NETVSC_SEND_BUFFER_SIZE (1024 * 1024 * 16) /* 16MB */
589#define NETVSC_INVALID_INDEX -1 589#define NETVSC_INVALID_INDEX -1
590 590
591 591
diff --git a/drivers/net/hyperv/netvsc.c b/drivers/net/hyperv/netvsc.c
index 592977a6547c..66979cf7fca6 100644
--- a/drivers/net/hyperv/netvsc.c
+++ b/drivers/net/hyperv/netvsc.c
@@ -193,8 +193,7 @@ static int netvsc_destroy_buf(struct netvsc_device *net_device)
193 } 193 }
194 if (net_device->send_buf) { 194 if (net_device->send_buf) {
195 /* Free up the receive buffer */ 195 /* Free up the receive buffer */
196 free_pages((unsigned long)net_device->send_buf, 196 vfree(net_device->send_buf);
197 get_order(net_device->send_buf_size));
198 net_device->send_buf = NULL; 197 net_device->send_buf = NULL;
199 } 198 }
200 kfree(net_device->send_section_map); 199 kfree(net_device->send_section_map);
@@ -303,9 +302,7 @@ static int netvsc_init_buf(struct hv_device *device)
303 302
304 /* Now setup the send buffer. 303 /* Now setup the send buffer.
305 */ 304 */
306 net_device->send_buf = 305 net_device->send_buf = vzalloc(net_device->send_buf_size);
307 (void *)__get_free_pages(GFP_KERNEL|__GFP_ZERO,
308 get_order(net_device->send_buf_size));
309 if (!net_device->send_buf) { 306 if (!net_device->send_buf) {
310 netdev_err(ndev, "unable to allocate send " 307 netdev_err(ndev, "unable to allocate send "
311 "buffer of size %d\n", net_device->send_buf_size); 308 "buffer of size %d\n", net_device->send_buf_size);