-
Notifications
You must be signed in to change notification settings - Fork 146
Open
Description
The vsock implementation fails when guests send large enough packets to the host (> 32KB on x86_64 linux guests).
I think it is caused by this change in the kernel: https://lkml.org/lkml/2025/7/17/487. They're allocating non linear skbs, so packets that are larger than one skb frag are getting split across multiple descriptors. On x86_64 this is 32KB (PAGE_SIZE << PAGE_ALLOC_COSTLY_ORDER).
The current implementation compares packet length and the descriptor's size, sees it doesn't fit and returns BufDescTooSmall:
libkrun/src/devices/src/virtio/vsock/packet.rs
Lines 248 to 252 in c9885c6
| // The data buffer should be large enough to fit the size of the data, as described by | |
| // the header descriptor. | |
| if buf_desc.len < pkt.len() { | |
| return Err(VsockError::BufDescTooSmall); | |
| } |
Reproducing
# on host
nc -lp 8000
# start container
podman run --runtime=krun --network=pasta:--map-host-loopback=10.10.10.10 --rm -it python:latest# on container repl
import socket
import time
with socket.create_connection(("10.10.10.10", 8000)) as s:
sizes = [
1024 * 32 - 1,
32 * 1024,
32 * 1024 + 1,
64 * 1024,
96 * 1024,
96 * 1024 + 1,
]
for size in sizes:
print(f"Sending {size}")
d = b"a" * size
s.sendall(d)
print("Sent")
time.sleep(1)You'll see output like:
sending 32767
sent
sending 32768
sent
sending 32769
[2026-02-07T23:21:56Z ERROR devices::virtio::vsock::device] error reading TX packet: BufDescTooSmall
sent
sending 65536
[2026-02-07T23:21:57Z ERROR devices::virtio::vsock::device] error reading TX packet: BufDescTooSmall
sent
sending 98304
[2026-02-07T23:21:58Z ERROR devices::virtio::vsock::device] error reading TX packet: BufDescTooSmall
sent
sending 98305
<-- hangs here until I interrupt
host kernel: 6.18.9-2
guest kernel: 6.12.68
libkrun 1.17.1
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels