bhyve/amd: interrupt delivered when it shouldn't be?
Andriy Gapon
avg at FreeBSD.org
Fri Dec 29 22:28:03 UTC 2017
First, about the setup. It's a FreeBSD/amd64 head guest on a FreeBSD/amd64 head
host. The hardware is AMD. The hypervisor is bhyve.
Under a certain specific load, that involves a lot of page faults and IPI-s, I
see the guest system getting stuck. This is pretty consistent. Typically I
find a thread spinning on smp_ipi_mtx. And an owner of the mutex appears to be
in mi_switch() -> sched_switch(). The debugging data that I have is somewhat
flaky, but it seems that the owner is typically in this code path:
smp_targeted_tlb_shootdown -> ipi_send_cpu -> native_lapic_ipi_raw
smp_targeted_tlb_shootdown holds smp_ipi_mtx.
native_lapic_ipi_raw, in this setup, performs the following manipulations:
saveintr = intr_disable();
...
intr_restore(saveintr);
The interrupts are already disabled when this function is entered, because
smp_ipi_mtx is a spinlock and our spinlock implementation disables interrupts.
So, intr_restore() in this case should be a NOP (BTW, it's implemented via popf).
But what I see suggests that at this point a Local APIC timer interrupt gets
delivered to the thread. And that causes all the mess as the thread holding the
spinlock gets preempted.
Does this ring a bell to anyone?
Is there any suspect code?
It seems that we set v_intr_masking bit, so the rFLAGS / eFLAGS should be
completely virtualized. So, maybe a hardware issue?
Thank you!
--
Andriy Gapon
More information about the freebsd-virtualization
mailing list