mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-15 09:34:17 +00:00
Drivers: net: hyperv: Cleanup the netvsc receive callback functio
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>
This commit is contained in:
parent
97c1723a61
commit
ee0c4c39c5
@ -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 */
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user