|
@@ -795,22 +795,16 @@ static void netvsc_channel_cb(void *context)
|
|
struct netvsc_device *net_device;
|
|
struct netvsc_device *net_device;
|
|
u32 bytes_recvd;
|
|
u32 bytes_recvd;
|
|
u64 request_id;
|
|
u64 request_id;
|
|
- unsigned char *packet;
|
|
|
|
struct vmpacket_descriptor *desc;
|
|
struct vmpacket_descriptor *desc;
|
|
unsigned char *buffer;
|
|
unsigned char *buffer;
|
|
int bufferlen = NETVSC_PACKET_SIZE;
|
|
int bufferlen = NETVSC_PACKET_SIZE;
|
|
struct net_device *ndev;
|
|
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);
|
|
net_device = get_inbound_net_device(device);
|
|
if (!net_device)
|
|
if (!net_device)
|
|
- goto out;
|
|
|
|
|
|
+ return;
|
|
ndev = net_device->ndev;
|
|
ndev = net_device->ndev;
|
|
|
|
+ buffer = net_device->cb_buffer;
|
|
|
|
|
|
do {
|
|
do {
|
|
ret = vmbus_recvpacket_raw(device->channel, buffer, bufferlen,
|
|
ret = vmbus_recvpacket_raw(device->channel, buffer, bufferlen,
|
|
@@ -838,23 +832,16 @@ static void netvsc_channel_cb(void *context)
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
- /* reset */
|
|
|
|
- if (bufferlen > NETVSC_PACKET_SIZE) {
|
|
|
|
- kfree(buffer);
|
|
|
|
- buffer = packet;
|
|
|
|
- bufferlen = NETVSC_PACKET_SIZE;
|
|
|
|
- }
|
|
|
|
} else {
|
|
} else {
|
|
- /* reset */
|
|
|
|
- if (bufferlen > NETVSC_PACKET_SIZE) {
|
|
|
|
- kfree(buffer);
|
|
|
|
- buffer = packet;
|
|
|
|
- bufferlen = NETVSC_PACKET_SIZE;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
|
|
+ /*
|
|
|
|
+ * We are done for this pass.
|
|
|
|
+ */
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
+
|
|
} else if (ret == -ENOBUFS) {
|
|
} else if (ret == -ENOBUFS) {
|
|
|
|
+ if (bufferlen > NETVSC_PACKET_SIZE)
|
|
|
|
+ kfree(buffer);
|
|
/* Handle large packet */
|
|
/* Handle large packet */
|
|
buffer = kmalloc(bytes_recvd, GFP_ATOMIC);
|
|
buffer = kmalloc(bytes_recvd, GFP_ATOMIC);
|
|
if (buffer == NULL) {
|
|
if (buffer == NULL) {
|
|
@@ -869,8 +856,8 @@ static void netvsc_channel_cb(void *context)
|
|
}
|
|
}
|
|
} while (1);
|
|
} while (1);
|
|
|
|
|
|
-out:
|
|
|
|
- kfree(buffer);
|
|
|
|
|
|
+ if (bufferlen > NETVSC_PACKET_SIZE)
|
|
|
|
+ kfree(buffer);
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|