Drivers: net: hyperv: Cleanup the netvsc receive callback functio
authorKY Srinivasan <kys@microsoft.com>
Mon, 17 Feb 2014 00:38:45 +0000 (16:38 -0800)
committerDavid S. Miller <davem@davemloft.net>
Mon, 17 Feb 2014 21:32:32 +0000 (16:32 -0500)
Get rid of the buffer allocation in the receive path for normal packets.

Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/hyperv/hyperv_net.h
drivers/net/hyperv/netvsc.c

index 7645ba38bde8059f058e6d112956df4055c7a3d7..01a16ea77a5a7dc60d9ed32ff48141a0e946ab04 100644 (file)
@@ -506,6 +506,8 @@ struct netvsc_device {
 
        /* Holds rndis device info */
        void *extension;
+       /* The recive buffer for this device */
+       unsigned char cb_buffer[NETVSC_PACKET_SIZE];
 };
 
 /* NdisInitialize message */
index 7fa2bbade327cdaf2dcd5e97340b4ee6625c1b94..9a0e9c6f1414767093fdb9cf76d76c26e1f63b14 100644 (file)
@@ -795,22 +795,16 @@ static void netvsc_channel_cb(void *context)
        struct netvsc_device *net_device;
        u32 bytes_recvd;
        u64 request_id;
-       unsigned char *packet;
        struct vmpacket_descriptor *desc;
        unsigned char *buffer;
        int bufferlen = NETVSC_PACKET_SIZE;
        struct net_device *ndev;
 
-       packet = kzalloc(NETVSC_PACKET_SIZE * sizeof(unsigned char),
-                        GFP_ATOMIC);
-       if (!packet)
-               return;
-       buffer = packet;
-
        net_device = get_inbound_net_device(device);
        if (!net_device)
-               goto out;
+               return;
        ndev = net_device->ndev;
+       buffer = net_device->cb_buffer;
 
        do {
                ret = vmbus_recvpacket_raw(device->channel, buffer, bufferlen,
@@ -838,23 +832,16 @@ static void netvsc_channel_cb(void *context)
                                        break;
                                }
 
-                               /* reset */
-                               if (bufferlen > NETVSC_PACKET_SIZE) {
-                                       kfree(buffer);
-                                       buffer = packet;
-                                       bufferlen = NETVSC_PACKET_SIZE;
-                               }
                        } else {
-                               /* reset */
-                               if (bufferlen > NETVSC_PACKET_SIZE) {
-                                       kfree(buffer);
-                                       buffer = packet;
-                                       bufferlen = NETVSC_PACKET_SIZE;
-                               }
-
+                               /*
+                                * We are done for this pass.
+                                */
                                break;
                        }
+
                } else if (ret == -ENOBUFS) {
+                       if (bufferlen > NETVSC_PACKET_SIZE)
+                               kfree(buffer);
                        /* Handle large packet */
                        buffer = kmalloc(bytes_recvd, GFP_ATOMIC);
                        if (buffer == NULL) {
@@ -869,8 +856,8 @@ static void netvsc_channel_cb(void *context)
                }
        } while (1);
 
-out:
-       kfree(buffer);
+       if (bufferlen > NETVSC_PACKET_SIZE)
+               kfree(buffer);
        return;
 }