Commit 1d42e40f authored by Dexuan Cui's avatar Dexuan Cui Committed by Greg Kroah-Hartman

Input: hyperv-keyboard: Use in-place iterator API in the channel callback

[ Upstream commit d09bc836 ]

Simplify the ring buffer handling with the in-place API.

Also avoid the dynamic allocation and the memory leak in the channel
callback function.
Signed-off-by: default avatarDexuan Cui <decui@microsoft.com>
Acked-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent e02aac3e
...@@ -245,40 +245,17 @@ static void hv_kbd_handle_received_packet(struct hv_device *hv_dev, ...@@ -245,40 +245,17 @@ static void hv_kbd_handle_received_packet(struct hv_device *hv_dev,
static void hv_kbd_on_channel_callback(void *context) static void hv_kbd_on_channel_callback(void *context)
{ {
struct vmpacket_descriptor *desc;
struct hv_device *hv_dev = context; struct hv_device *hv_dev = context;
void *buffer;
int bufferlen = 0x100; /* Start with sensible size */
u32 bytes_recvd; u32 bytes_recvd;
u64 req_id; u64 req_id;
int error;
buffer = kmalloc(bufferlen, GFP_ATOMIC);
if (!buffer)
return;
while (1) {
error = vmbus_recvpacket_raw(hv_dev->channel, buffer, bufferlen,
&bytes_recvd, &req_id);
switch (error) {
case 0:
if (bytes_recvd == 0) {
kfree(buffer);
return;
}
hv_kbd_handle_received_packet(hv_dev, buffer, foreach_vmbus_pkt(desc, hv_dev->channel) {
bytes_recvd, req_id); bytes_recvd = desc->len8 * 8;
break; req_id = desc->trans_id;
case -ENOBUFS: hv_kbd_handle_received_packet(hv_dev, desc, bytes_recvd,
kfree(buffer); req_id);
/* Handle large packet */
bufferlen = bytes_recvd;
buffer = kmalloc(bytes_recvd, GFP_ATOMIC);
if (!buffer)
return;
break;
}
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment