]> git.ipfire.org Git - ipfire-2.x.git/blame - src/patches/linux/0003-Drivers-net-hyperv-Cleanup-the-netvsc-receive-callba.patch
make.sh limit build to 23 parallel threads.
[ipfire-2.x.git] / src / patches / linux / 0003-Drivers-net-hyperv-Cleanup-the-netvsc-receive-callba.patch
CommitLineData
a7b0967d
MT
1From c9f2db35ac4f789930522d9d36200cb71b442bed Mon Sep 17 00:00:00 2001
2From: KY Srinivasan <kys@microsoft.com>
3Date: Sun, 16 Feb 2014 16:38:45 -0800
4Subject: [PATCH 03/25] Drivers: net: hyperv: Cleanup the netvsc receive
5 callback functio
6
7Get rid of the buffer allocation in the receive path for normal packets.
8
9Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
10Signed-off-by: David S. Miller <davem@davemloft.net>
11---
12 drivers/net/hyperv/hyperv_net.h | 2 ++
13 drivers/net/hyperv/netvsc.c | 33 ++++++++++-----------------------
14 2 files changed, 12 insertions(+), 23 deletions(-)
15
16diff --git a/drivers/net/hyperv/hyperv_net.h b/drivers/net/hyperv/hyperv_net.h
17index 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 {
21
22 /* Holds rndis device info */
23 void *extension;
24+ /* The recive buffer for this device */
25+ unsigned char cb_buffer[NETVSC_PACKET_SIZE];
26 };
27
28 /* NdisInitialize message */
29diff --git a/drivers/net/hyperv/netvsc.c b/drivers/net/hyperv/netvsc.c
30index 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;
35 u32 bytes_recvd;
36 u64 request_id;
37- unsigned char *packet;
38 struct vmpacket_descriptor *desc;
39 unsigned char *buffer;
40 int bufferlen = NETVSC_PACKET_SIZE;
41 struct net_device *ndev;
42
43- packet = kzalloc(NETVSC_PACKET_SIZE * sizeof(unsigned char),
44- GFP_ATOMIC);
45- if (!packet)
46- return;
47- buffer = packet;
48-
49 net_device = get_inbound_net_device(device);
50 if (!net_device)
51- goto out;
52+ return;
53 ndev = net_device->ndev;
54+ buffer = net_device->cb_buffer;
55
56 do {
57 ret = vmbus_recvpacket_raw(device->channel, buffer, bufferlen,
58@@ -838,23 +832,16 @@ static void netvsc_channel_cb(void *context)
59 break;
60 }
61
62- /* reset */
63- if (bufferlen > NETVSC_PACKET_SIZE) {
64- kfree(buffer);
65- buffer = packet;
66- bufferlen = NETVSC_PACKET_SIZE;
67- }
68 } else {
69- /* reset */
70- if (bufferlen > NETVSC_PACKET_SIZE) {
71- kfree(buffer);
72- buffer = packet;
73- bufferlen = NETVSC_PACKET_SIZE;
74- }
75-
76+ /*
77+ * We are done for this pass.
78+ */
79 break;
80 }
81+
82 } else if (ret == -ENOBUFS) {
83+ if (bufferlen > NETVSC_PACKET_SIZE)
84+ kfree(buffer);
85 /* Handle large packet */
86 buffer = kmalloc(bytes_recvd, GFP_ATOMIC);
87 if (buffer == NULL) {
88@@ -869,8 +856,8 @@ static void netvsc_channel_cb(void *context)
89 }
90 } while (1);
91
92-out:
93- kfree(buffer);
94+ if (bufferlen > NETVSC_PACKET_SIZE)
95+ kfree(buffer);
96 return;
97 }
98
99--
1002.4.3
101