lkml.org 
[lkml]   [2019]   [Sep]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.19 41/57] Input: hyperv-keyboard: Use in-place iterator API in the channel callback
    Date
    [ Upstream commit d09bc83640d524b8467a660db7b1d15e6562a1de ]

    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: Dexuan Cui <decui@microsoft.com>
    Acked-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/input/serio/hyperv-keyboard.c | 35 +++++----------------------
    1 file changed, 6 insertions(+), 29 deletions(-)

    diff --git a/drivers/input/serio/hyperv-keyboard.c b/drivers/input/serio/hyperv-keyboard.c
    index a8b9be3e28db7..7d0a5ccf57751 100644
    --- a/drivers/input/serio/hyperv-keyboard.c
    +++ b/drivers/input/serio/hyperv-keyboard.c
    @@ -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)
    {
    + struct vmpacket_descriptor *desc;
    struct hv_device *hv_dev = context;
    - void *buffer;
    - int bufferlen = 0x100; /* Start with sensible size */
    u32 bytes_recvd;
    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,
    - bytes_recvd, req_id);
    - break;
    + foreach_vmbus_pkt(desc, hv_dev->channel) {
    + bytes_recvd = desc->len8 * 8;
    + req_id = desc->trans_id;

    - case -ENOBUFS:
    - kfree(buffer);
    - /* Handle large packet */
    - bufferlen = bytes_recvd;
    - buffer = kmalloc(bytes_recvd, GFP_ATOMIC);
    - if (!buffer)
    - return;
    - break;
    - }
    + hv_kbd_handle_received_packet(hv_dev, desc, bytes_recvd,
    + req_id);
    }
    }

    --
    2.20.1


    \
     
     \ /
      Last update: 2019-09-08 14:57    [W:4.029 / U:0.076 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site