Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
SUSE:SLE-12-SP2:Update
xen.7652
5acdca70-x86-HVM-suppress-IO-completion-for-por...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 5acdca70-x86-HVM-suppress-IO-completion-for-port-output.patch of Package xen.7652
# Commit 91afb8139f954a06e564d4915bc7d6a8575e2812 # Date 2018-04-11 10:42:24 +0200 # Author Jan Beulich <jbeulich@suse.com> # Committer Jan Beulich <jbeulich@suse.com> x86/HVM: suppress I/O completion for port output We don't break up port requests in case they cross emulation entity boundaries, and a write to an I/O port is necessarily the last operation of an instruction instance, so there's no need to re-invoke the full emulation path upon receiving the result from an external emulator. In case we want to properly split port accesses in the future, this change will need to be reverted, as it would prevent things working correctly when e.g. the first part needs to go to an external emulator, while the second part is to be handled internally. While this addresses the reported problem of Windows paging out the buffer underneath an in-process REP OUTS, it does not address the wider problem of the re-issued insn (to the insn emulator) being prone to raise an exception (#PF) during a replayed, previously successful memory access (we only record prior MMIO accesses). Leaving aside the problem tried to be worked around here, I think the performance aspect alone is a good reason to change the behavior. Signed-off-by: Jan Beulich <jbeulich@suse.com> Reviewed-by: Paul Durrant <paul.durrant@citrix.com> --- sle12sp2.orig/xen/arch/x86/hvm/emulate.c 2018-03-28 16:33:59.000000000 +0200 +++ sle12sp2/xen/arch/x86/hvm/emulate.c 2018-04-18 14:56:42.000000000 +0200 @@ -192,7 +192,11 @@ static int hvmemul_do_io( rc = hvm_send_ioreq(s, &p, 0); if ( rc != X86EMUL_RETRY || curr->domain->is_shutting_down ) vio->io_req.state = STATE_IOREQ_NONE; - else if ( data_is_addr ) + /* + * This effectively is !hvm_vcpu_io_need_completion(vio), slightly + * optimized and using local variables we have available. + */ + else if ( data_is_addr || (!is_mmio && dir == IOREQ_WRITE) ) rc = X86EMUL_OKAY; } break; --- sle12sp2.orig/xen/include/asm-x86/hvm/vcpu.h 2016-05-17 13:35:43.000000000 +0200 +++ sle12sp2/xen/include/asm-x86/hvm/vcpu.h 2018-04-18 14:56:42.000000000 +0200 @@ -94,7 +94,9 @@ struct hvm_vcpu_io { static inline bool_t hvm_vcpu_io_need_completion(const struct hvm_vcpu_io *vio) { return (vio->io_req.state == STATE_IOREQ_READY) && - !vio->io_req.data_is_ptr; + !vio->io_req.data_is_ptr && + (vio->io_req.type != IOREQ_TYPE_PIO || + vio->io_req.dir != IOREQ_WRITE); } #define VMCX_EADDR (~0ULL)
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor