1 From c9f2db35ac4f789930522d9d36200cb71b442bed Mon Sep 17 00:00:00 2001
2 From: KY Srinivasan <kys@microsoft.com>
3 Date: Sun, 16 Feb 2014 16:38:45 -0800
4 Subject: [PATCH 03/25] Drivers: net: hyperv: Cleanup the netvsc receive
7 Get rid of the buffer allocation in the receive path for normal packets.
9 Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
10 Signed-off-by: David S. Miller <davem@davemloft.net>
12 drivers/net/hyperv/hyperv_net.h | 2 ++
13 drivers/net/hyperv/netvsc.c | 33 ++++++++++-----------------------
14 2 files changed, 12 insertions(+), 23 deletions(-)
16 diff --git a/drivers/net/hyperv/hyperv_net.h b/drivers/net/hyperv/hyperv_net.h
17 index 7645ba38bde8..01a16ea77a5a 100644
18 --- a/drivers/net/hyperv/hyperv_net.h
19 +++ b/drivers/net/hyperv/hyperv_net.h
20 @@ -506,6 +506,8 @@ struct netvsc_device {
22 /* Holds rndis device info */
24 + /* The recive buffer for this device */
25 + unsigned char cb_buffer[NETVSC_PACKET_SIZE];
28 /* NdisInitialize message */
29 diff --git a/drivers/net/hyperv/netvsc.c b/drivers/net/hyperv/netvsc.c
30 index 7fa2bbade327..9a0e9c6f1414 100644
31 --- a/drivers/net/hyperv/netvsc.c
32 +++ b/drivers/net/hyperv/netvsc.c
33 @@ -795,22 +795,16 @@ static void netvsc_channel_cb(void *context)
34 struct netvsc_device *net_device;
37 - unsigned char *packet;
38 struct vmpacket_descriptor *desc;
39 unsigned char *buffer;
40 int bufferlen = NETVSC_PACKET_SIZE;
41 struct net_device *ndev;
43 - packet = kzalloc(NETVSC_PACKET_SIZE * sizeof(unsigned char),
49 net_device = get_inbound_net_device(device);
53 ndev = net_device->ndev;
54 + buffer = net_device->cb_buffer;
57 ret = vmbus_recvpacket_raw(device->channel, buffer, bufferlen,
58 @@ -838,23 +832,16 @@ static void netvsc_channel_cb(void *context)
63 - if (bufferlen > NETVSC_PACKET_SIZE) {
66 - bufferlen = NETVSC_PACKET_SIZE;
70 - if (bufferlen > NETVSC_PACKET_SIZE) {
73 - bufferlen = NETVSC_PACKET_SIZE;
77 + * We are done for this pass.
82 } else if (ret == -ENOBUFS) {
83 + if (bufferlen > NETVSC_PACKET_SIZE)
85 /* Handle large packet */
86 buffer = kmalloc(bytes_recvd, GFP_ATOMIC);
88 @@ -869,8 +856,8 @@ static void netvsc_channel_cb(void *context)
94 + if (bufferlen > NETVSC_PACKET_SIZE)