hyperv: Increase the buffer length for netvsc_channel_cb()
authorHaiyang Zhang <haiyangz@microsoft.com>
Fri, 15 Aug 2014 19:18:19 +0000 (19:18 +0000)
committerDavid S. Miller <davem@davemloft.net>
Fri, 22 Aug 2014 19:23:09 +0000 (12:23 -0700)
When the buffer is too small for a packet from VMBus, a bigger buffer will be
allocated in netvsc_channel_cb() and retry reading the packet from VMBus.
Increasing this buffer size will reduce the retry overhead.

Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
Reviewed-by: Dexuan Cui <decui@microsoft.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/hyperv/hyperv_net.h
drivers/net/hyperv/netvsc.c

index d5e07de..2f48f79 100644 (file)
@@ -591,7 +591,7 @@ struct nvsp_message {
 
 #define NETVSC_RECEIVE_BUFFER_ID               0xcafe
 
-#define NETVSC_PACKET_SIZE                      2048
+#define NETVSC_PACKET_SIZE                      4096
 
 #define VRSS_SEND_TAB_SIZE 16
 
@@ -642,7 +642,7 @@ struct netvsc_device {
        int ring_size;
 
        /* The primary channel callback buffer */
-       unsigned char cb_buffer[NETVSC_PACKET_SIZE];
+       unsigned char *cb_buffer;
        /* The sub channel callback buffer */
        unsigned char *sub_cb_buf;
 };
index 66979cf..5b5644a 100644 (file)
@@ -42,6 +42,12 @@ static struct netvsc_device *alloc_net_device(struct hv_device *device)
        if (!net_device)
                return NULL;
 
+       net_device->cb_buffer = kzalloc(NETVSC_PACKET_SIZE, GFP_KERNEL);
+       if (!net_device->cb_buffer) {
+               kfree(net_device);
+               return NULL;
+       }
+
        init_waitqueue_head(&net_device->wait_drain);
        net_device->start_remove = false;
        net_device->destroy = false;
@@ -52,6 +58,12 @@ static struct netvsc_device *alloc_net_device(struct hv_device *device)
        return net_device;
 }
 
+static void free_netvsc_device(struct netvsc_device *nvdev)
+{
+       kfree(nvdev->cb_buffer);
+       kfree(nvdev);
+}
+
 static struct netvsc_device *get_outbound_net_device(struct hv_device *device)
 {
        struct netvsc_device *net_device;
@@ -551,7 +563,7 @@ int netvsc_device_remove(struct hv_device *device)
        if (net_device->sub_cb_buf)
                vfree(net_device->sub_cb_buf);
 
-       kfree(net_device);
+       free_netvsc_device(net_device);
        return 0;
 }
 
@@ -1093,7 +1105,7 @@ close:
        vmbus_close(device->channel);
 
 cleanup:
-       kfree(net_device);
+       free_netvsc_device(net_device);
 
        return ret;
 }