vsock/virtio: limit the memory used per-socket
authorStefano Garzarella <sgarzare@redhat.com>
Tue, 30 Jul 2019 15:43:30 +0000 (17:43 +0200)
committerDavid S. Miller <davem@davemloft.net>
Tue, 30 Jul 2019 22:00:00 +0000 (15:00 -0700)
commit473c7391ce731adb482c03e420964676ed8b494d
treea17fc41db539425ea78234bf0ddbebceef11f4cd
parentd1a55841ab24c6d1e4087e5c285601a9dffb8641
vsock/virtio: limit the memory used per-socket

Since virtio-vsock was introduced, the buffers filled by the host
and pushed to the guest using the vring, are directly queued in
a per-socket list. These buffers are preallocated by the guest
with a fixed size (4 KB).

The maximum amount of memory used by each socket should be
controlled by the credit mechanism.
The default credit available per-socket is 256 KB, but if we use
only 1 byte per packet, the guest can queue up to 262144 of 4 KB
buffers, using up to 1 GB of memory per-socket. In addition, the
guest will continue to fill the vring with new 4 KB free buffers
to avoid starvation of other sockets.

This patch mitigates this issue copying the payload of small
packets (< 128 bytes) into the buffer of last packet queued, in
order to avoid wasting memory.

Signed-off-by: Stefano Garzarella <sgarzare@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Acked-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/vhost/vsock.c
include/linux/virtio_vsock.h
net/vmw_vsock/virtio_transport.c
net/vmw_vsock/virtio_transport_common.c