vio(4): poll device status after issuing device reset.
authordv <dv@openbsd.org>
Mon, 15 Jan 2024 02:35:23 +0000 (02:35 +0000)
committerdv <dv@openbsd.org>
Mon, 15 Jan 2024 02:35:23 +0000 (02:35 +0000)
commite6a428abee99449cbc94a7ede74c7409b7b29614
treed8a2514d6cb8bd595e2aeb17dffae8ed0605464e
parent89b5be12b3729505bf8427b53d03ccb0a9428b23
vio(4): poll device status after issuing device reset.

The virtio spec says a driver "should" wait for a device to report
a clear device status after performing a reset. In some hypervisors,
this doesn't matter as the vcpu's io instruction emulation and
virtio network device emulation happen serially in the same thread.
In hypervisors like vmd(8), device reset happens asynchronously and
the driver can't assume the device is ready.

This race condition results in mbuf pool corruption, causing panics.

Bug reported and reproduced by bluhm@. Root cause found and diff
from sf@. ok dv@ and committed on sf@'s behalf with his permission.
sys/dev/fdt/virtio_mmio.c
sys/dev/pci/virtio_pci.c