vmd(8)/vioblk: use zero-copy approach & vectored io.
authordv <dv@openbsd.org>
Thu, 14 Sep 2023 15:25:43 +0000 (15:25 +0000)
committerdv <dv@openbsd.org>
Thu, 14 Sep 2023 15:25:43 +0000 (15:25 +0000)
commit20e554f81b69a041c51e87cff4bd749da69dde5a
tree81a188cb5cfdd0e64d8adf2d70dcb6d36a29ac4e
parente236e0bfe1abbdc46ca9993442b0167f144d19ae
vmd(8)/vioblk: use zero-copy approach & vectored io.

The original version of the virtio block device dynamically allocated
buffers to hold intermediate data when reading or writing to the
underlying disk fd(s). Since vioblk drivers may chain multiple
segments together, this leads to overly complex logic and on
read(2)/write(2) call per data segment.

Additionally, the virtio block logic in vmd didn't handle segments
that weren't block aligned (e.g. 512 bytes). If a guest provided
unaligned segments, garbage will be read or written.

Since virtio descriptors mimic iovec structures, this changes vmd's
device emulation to use that model. (This is how other hypervisors
emulate virtio devices.) This allows for zero-copy semantics using
iovec's, reducing memcpy and multiple read/write syscalls per io
transaction.

Testing by phessler@ and mlarkin@. OK mlarkin@.
usr.sbin/vmd/vioblk.c
usr.sbin/vmd/vioqcow2.c
usr.sbin/vmd/vioraw.c
usr.sbin/vmd/virtio.c
usr.sbin/vmd/virtio.h