]>
Commit | Line | Data |
---|---|---|
a7b0967d MT |
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 |