vmd(8): implement zero-copy operations on virtqueues.
authordv <dv@openbsd.org>
Fri, 23 Dec 2022 19:25:22 +0000 (19:25 +0000)
committerdv <dv@openbsd.org>
Fri, 23 Dec 2022 19:25:22 +0000 (19:25 +0000)
commit0bd10b9f03953d225b21b1d10f20210510f3e033
tree11a24634928594d7f4f475f4a45bf17787f1eba3
parentb76794fba312923f8e22b518510bbef1b884e098
vmd(8): implement zero-copy operations on virtqueues.

The original virtio device implementation relied on allocating a
buffer on heap, copying the virtqueue from the guest, mutating the
copy, and then overwriting the virtqueue in the guest.

While the approach worked, it was both complex and added extra
overhead. On older hardware, switching to the zero-copy approach
can show a noticeable performance improvement for vionet devices.
An added benefit is this diff also reduces the amount of code in
vmd, which is always a welcome change.

In addition, change to talking about the queue pfn and not "address"
as the virtio-pci spec has drivers provide a 32-bit value representing
the physical page number of the location in guest memory, not the
linear address.

Original idea from dlg@ while working on re-adding async task queues.

ok dlg@, tested by many
usr.sbin/vmd/vioscsi.c
usr.sbin/vmd/virtio.c
usr.sbin/vmd/virtio.h
usr.sbin/vmd/vm.c
usr.sbin/vmd/vmd.h