5450203719
A guest which has configured the per-vCPU upcall vector may set the
HVM_PARAM_CALLBACK_IRQ param to fairly much anything other than zero.
For example, Linux v6.0+ after commit b1c3497e604 ("x86/xen: Add support
for HVMOP_set_evtchn_upcall_vector") will just do this after setting the
vector:
/* Trick toolstack to think we are enlightened. */
if (!cpu)
rc = xen_set_callback_via(1);
That's explicitly setting the delivery to GSI#1, but it's supposed to be
overridden by the per-vCPU vector setting. This mostly works in Qemu
*except* for the logic to enable the in-kernel handling of event channels,
which falsely determines that the kernel cannot accelerate GSI delivery
in this case.
Add a kvm_xen_has_vcpu_callback_vector() to report whether vCPU#0 has
the vector set, and use that in xen_evtchn_set_callback_param() to
enable the kernel acceleration features even when the param *appears*
to be set to target a GSI.
Preserve the Xen behaviour that when HVM_PARAM_CALLBACK_IRQ is set to
*zero* the event channel delivery is disabled completely. (Which is
what that bizarre guest behaviour is working round in the first place.)
Cc: qemu-stable@nongnu.org
Fixes:
|
||
---|---|---|
.. | ||
accel-blocker.h | ||
accel-ops.h | ||
arch_init.h | ||
balloon.h | ||
block-backend-common.h | ||
block-backend-global-state.h | ||
block-backend-io.h | ||
block-backend.h | ||
block-ram-registrar.h | ||
blockdev.h | ||
cpu-throttle.h | ||
cpu-timers.h | ||
cpus.h | ||
cryptodev-vhost-user.h | ||
cryptodev-vhost.h | ||
cryptodev.h | ||
device_tree.h | ||
dirtylimit.h | ||
dirtyrate.h | ||
dma.h | ||
dump-arch.h | ||
dump.h | ||
event-loop-base.h | ||
hax.h | ||
hostmem.h | ||
hvf.h | ||
hvf_int.h | ||
hw_accel.h | ||
iothread.h | ||
kvm.h | ||
kvm_int.h | ||
kvm_xen.h | ||
memory_mapping.h | ||
numa.h | ||
nvmm.h | ||
os-posix.h | ||
os-win32.h | ||
qtest.h | ||
replay.h | ||
reset.h | ||
rng-random.h | ||
rng.h | ||
rtc.h | ||
runstate-action.h | ||
runstate.h | ||
seccomp.h | ||
stats.h | ||
sysemu.h | ||
tcg.h | ||
tpm.h | ||
tpm_backend.h | ||
tpm_util.h | ||
vhost-user-backend.h | ||
watchdog.h | ||
whpx.h | ||
xen-mapcache.h | ||
xen.h |