diff options
author | Stefano Garzarella <sgarzare@redhat.com> | 2019-07-30 17:43:30 +0200 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2019-07-30 15:00:00 -0700 |
commit | 473c7391ce731adb482c03e420964676ed8b494d (patch) | |
tree | a17fc41db539425ea78234bf0ddbebceef11f4cd /drivers | |
parent | d1a55841ab24c6d1e4087e5c285601a9dffb8641 (diff) | |
download | linux-473c7391ce731adb482c03e420964676ed8b494d.tar.gz linux-473c7391ce731adb482c03e420964676ed8b494d.tar.bz2 linux-473c7391ce731adb482c03e420964676ed8b494d.zip |
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>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/vhost/vsock.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/drivers/vhost/vsock.c b/drivers/vhost/vsock.c index 6a50e1d0529c..6c8390a2af52 100644 --- a/drivers/vhost/vsock.c +++ b/drivers/vhost/vsock.c @@ -329,6 +329,8 @@ vhost_vsock_alloc_pkt(struct vhost_virtqueue *vq, return NULL; } + pkt->buf_len = pkt->len; + nbytes = copy_from_iter(pkt->buf, pkt->len, &iov_iter); if (nbytes != pkt->len) { vq_err(vq, "Expected %u byte payload, got %zu bytes\n", |