lkml.org 
[lkml]   [2022]   [Oct]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 6.0 328/862] vhost/vsock: Use kvmalloc/kvfree for larger packets.
    Date
    From: Junichi Uekawa <uekawa@chromium.org>

    [ Upstream commit 0e3f72931fc47bb81686020cc643cde5d9cd0bb8 ]

    When copying a large file over sftp over vsock, data size is usually 32kB,
    and kmalloc seems to fail to try to allocate 32 32kB regions.

    vhost-5837: page allocation failure: order:4, mode:0x24040c0
    Call Trace:
    [<ffffffffb6a0df64>] dump_stack+0x97/0xdb
    [<ffffffffb68d6aed>] warn_alloc_failed+0x10f/0x138
    [<ffffffffb68d868a>] ? __alloc_pages_direct_compact+0x38/0xc8
    [<ffffffffb664619f>] __alloc_pages_nodemask+0x84c/0x90d
    [<ffffffffb6646e56>] alloc_kmem_pages+0x17/0x19
    [<ffffffffb6653a26>] kmalloc_order_trace+0x2b/0xdb
    [<ffffffffb66682f3>] __kmalloc+0x177/0x1f7
    [<ffffffffb66e0d94>] ? copy_from_iter+0x8d/0x31d
    [<ffffffffc0689ab7>] vhost_vsock_handle_tx_kick+0x1fa/0x301 [vhost_vsock]
    [<ffffffffc06828d9>] vhost_worker+0xf7/0x157 [vhost]
    [<ffffffffb683ddce>] kthread+0xfd/0x105
    [<ffffffffc06827e2>] ? vhost_dev_set_owner+0x22e/0x22e [vhost]
    [<ffffffffb683dcd1>] ? flush_kthread_worker+0xf3/0xf3
    [<ffffffffb6eb332e>] ret_from_fork+0x4e/0x80
    [<ffffffffb683dcd1>] ? flush_kthread_worker+0xf3/0xf3

    Work around by doing kvmalloc instead.

    Fixes: 433fc58e6bf2 ("VSOCK: Introduce vhost_vsock.ko")
    Signed-off-by: Junichi Uekawa <uekawa@chromium.org>
    Reviewed-by: Stefano Garzarella <sgarzare@redhat.com>
    Acked-by: Michael S. Tsirkin <mst@redhat.com>
    Link: https://lore.kernel.org/r/20220928064538.667678-1-uekawa@chromium.org
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/vhost/vsock.c | 2 +-
    net/vmw_vsock/virtio_transport_common.c | 2 +-
    2 files changed, 2 insertions(+), 2 deletions(-)

    diff --git a/drivers/vhost/vsock.c b/drivers/vhost/vsock.c
    index 368330417bde..5703775af129 100644
    --- a/drivers/vhost/vsock.c
    +++ b/drivers/vhost/vsock.c
    @@ -393,7 +393,7 @@ vhost_vsock_alloc_pkt(struct vhost_virtqueue *vq,
    return NULL;
    }

    - pkt->buf = kmalloc(pkt->len, GFP_KERNEL);
    + pkt->buf = kvmalloc(pkt->len, GFP_KERNEL);
    if (!pkt->buf) {
    kfree(pkt);
    return NULL;
    diff --git a/net/vmw_vsock/virtio_transport_common.c b/net/vmw_vsock/virtio_transport_common.c
    index ec2c2afbf0d0..3a12aee33e92 100644
    --- a/net/vmw_vsock/virtio_transport_common.c
    +++ b/net/vmw_vsock/virtio_transport_common.c
    @@ -1342,7 +1342,7 @@ EXPORT_SYMBOL_GPL(virtio_transport_recv_pkt);

    void virtio_transport_free_pkt(struct virtio_vsock_pkt *pkt)
    {
    - kfree(pkt->buf);
    + kvfree(pkt->buf);
    kfree(pkt);
    }
    EXPORT_SYMBOL_GPL(virtio_transport_free_pkt);
    --
    2.35.1


    \
     
     \ /
      Last update: 2022-10-19 11:03    [W:2.922 / U:0.152 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site