]> git.ipfire.org Git - ipfire-2.x.git/blob - 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
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
5 callback functio
6
7 Get rid of the buffer allocation in the receive path for normal packets.
8
9 Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
10 Signed-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
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 {
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 */
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;
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 --
100 2.4.3
101