Skip to content

Commit 03a92f0

Browse files
willdeaconmstsirkin
authored andcommitted
vsock/virtio: Resize receive buffers so that each SKB fits in a 4K page
When allocating receive buffers for the vsock virtio RX virtqueue, an SKB is allocated with a 4140 data payload (the 44-byte packet header + VIRTIO_VSOCK_DEFAULT_RX_BUF_SIZE). Even when factoring in the SKB overhead, the resulting 8KiB allocation thanks to the rounding in kmalloc_reserve() is wasteful (~3700 unusable bytes) and results in a higher-order page allocation on systems with 4KiB pages just for the sake of a few hundred bytes of packet data. Limit the vsock virtio RX buffers to 4KiB per SKB, resulting in much better memory utilisation and removing the need to allocate higher-order pages entirely. Reviewed-by: Stefano Garzarella <[email protected]> Signed-off-by: Will Deacon <[email protected]> Message-Id: <[email protected]> Signed-off-by: Michael S. Tsirkin <[email protected]>
1 parent 87dbae5 commit 03a92f0

File tree

2 files changed

+7
-2
lines changed

2 files changed

+7
-2
lines changed

include/linux/virtio_vsock.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,12 @@ static inline size_t virtio_vsock_skb_len(struct sk_buff *skb)
106106
return (size_t)(skb_end_pointer(skb) - skb->head);
107107
}
108108

109-
#define VIRTIO_VSOCK_DEFAULT_RX_BUF_SIZE (1024 * 4)
109+
/* Dimension the RX SKB so that the entire thing fits exactly into
110+
* a single 4KiB page. This avoids wasting memory due to alloc_skb()
111+
* rounding up to the next page order and also means that we
112+
* don't leave higher-order pages sitting around in the RX queue.
113+
*/
114+
#define VIRTIO_VSOCK_DEFAULT_RX_BUF_SIZE SKB_WITH_OVERHEAD(1024 * 4)
110115
#define VIRTIO_VSOCK_MAX_BUF_SIZE 0xFFFFFFFFUL
111116
#define VIRTIO_VSOCK_MAX_PKT_BUF_SIZE (1024 * 64)
112117

net/vmw_vsock/virtio_transport.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -307,7 +307,7 @@ virtio_transport_cancel_pkt(struct vsock_sock *vsk)
307307

308308
static void virtio_vsock_rx_fill(struct virtio_vsock *vsock)
309309
{
310-
int total_len = VIRTIO_VSOCK_DEFAULT_RX_BUF_SIZE + VIRTIO_VSOCK_SKB_HEADROOM;
310+
int total_len = VIRTIO_VSOCK_DEFAULT_RX_BUF_SIZE;
311311
struct scatterlist pkt, *p;
312312
struct virtqueue *vq;
313313
struct sk_buff *skb;

0 commit comments

Comments
 (0)