vmd(8): ignore masks on asserts, use synchronous deasserts.
authordv <dv@openbsd.org>
Fri, 1 Sep 2023 19:42:26 +0000 (19:42 +0000)
committerdv <dv@openbsd.org>
Fri, 1 Sep 2023 19:42:26 +0000 (19:42 +0000)
commit8761e6b466749a81c2780e885eeadb88b4f41796
tree6a62e2d45b643a432c475f71c77d0ad39e46734f
parent04fec98fbe1cdc7ed263575b555c167f122bbcba
vmd(8): ignore masks on asserts, use synchronous deasserts.

The i8259 was considering the state of the mask register when a
device requested raising the bit in the interrupt request register.
This caused a race condition where if the virtio device asserted
the irq while it was masked in the i8259 by the vm, we'd miss the
interrupt request. The device and the pic would become out of sync
and users reported virtio block device stalls as the vioblk(4)
driver would starve, waiting for an interrupt that will never arrive.

The mask is now considered only at ack time, when finding possible
interrupts to inject. This bug was never a problem previously as
virtio devices were emulated synchronously.

Deasserts related to the vcpu reading the virtio isr register are
also made now in response to the read request instead of issued
asynchronously. This removes a subsequent race condition.

Testing from mbuhl@, stsp@, and Florian Riehm.

ok mlarkin@
usr.sbin/vmd/i8259.c
usr.sbin/vmd/vioblk.c
usr.sbin/vmd/vionet.c