]> git.baikalelectronics.ru Git - kernel.git/commitdiff
vhost/vsock: Use kvmalloc/kvfree for larger packets.
authorJunichi Uekawa <uekawa@chromium.org>
Wed, 28 Sep 2022 06:45:38 +0000 (15:45 +0900)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 26 Oct 2022 11:22:25 +0000 (13:22 +0200)
[ Upstream commit 6ac0c55a5b5a47f25cd060d1ed2fb2a112f734b2 ]

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: 296c915921dd ("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
net/vmw_vsock/virtio_transport_common.c

index 308df62655dd2ac5552e6a04518f29ee5752a431..64806e562bf641c7cb9f8697113ce4696af34939 100644 (file)
@@ -353,7 +353,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;
index dde16a033a09d17388be689b62e0a60776c3b9b1..93c11ffae92bb0af2c969b019e9642006ebc82a9 100644 (file)
@@ -1146,7 +1146,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);