]> xenbits.xensource.com Git - xen.git/commit
xen: io: Fix race between sending an I/O and domain shutdown
authorJulien Grall <jgrall@amazon.com>
Tue, 7 Jun 2022 12:06:11 +0000 (14:06 +0200)
committerJan Beulich <jbeulich@suse.com>
Tue, 7 Jun 2022 12:06:11 +0000 (14:06 +0200)
commit982a314bd3000a16c3128afadb36a8ff41029adc
tree68678d2642c720134c16abab9780f52ef0dff787
parent88b653f73928117461dc250acd1e830a47a14c2b
xen: io: Fix race between sending an I/O and domain shutdown

Xen provides hypercalls to shutdown (SCHEDOP_shutdown{,_code}) and
resume a domain (XEN_DOMCTL_resumedomain). They can be used for checkpoint
where the expectation is the domain should continue as nothing happened
afterwards.

hvmemul_do_io() and handle_pio() will act differently if the return
code of hvm_send_ioreq() (resp. hvmemul_do_pio_buffer()) is X86EMUL_RETRY.

In this case, the I/O state will be reset to STATE_IOREQ_NONE (i.e
no I/O is pending) and/or the PC will not be advanced.

If the shutdown request happens right after the I/O was sent to the
IOREQ, then emulation code will end up to re-execute the instruction
and therefore forward again the same I/O (at least when reading IO port).

This would be problem if the access has a side-effect. A dumb example,
is a device implementing a counter which is incremented by one for every
access. When running shutdown/resume in a loop, the value read by the
OS may not be the old value + 1.

Add an extra boolean in the structure hvm_vcpu_io to indicate whether
the I/O was suspended. This is then used in place of checking the domain
is shutting down in hvmemul_do_io() and handle_pio() as they should
act on suspend (i.e. vcpu_start_shutdown_deferral() returns false) rather
than shutdown.

Signed-off-by: Julien Grall <jgrall@amazon.com>
Reviewed-by: Paul Durrant <paul@xen.org>
master commit: b7e0d8978810b534725e94a321736496928f00a5
master date: 2022-05-06 17:16:22 +0100
xen/arch/arm/ioreq.c
xen/arch/x86/hvm/emulate.c
xen/arch/x86/hvm/io.c
xen/common/ioreq.c
xen/include/xen/sched.h