From: Paul Durrant <pdurrant@xxxxxxxxxx> Changed in v4: - The offset into the cache returned from get_vcpu_info_cache() was not being factored into kvm_gpc_check() or kvm_gpc_refresh() calls. Fix this. - When transitioning from a default vcpu_info to an explicit one, copy the content across. This was previously the responsibility of the VMM. Changed in v3: - Patch added to make sure Xen vcpu_id is immutable once shared_info is set. - Adjust the xen_shinfo_test selftest accordingly. - Also have the selftest use both mechanisms to set shared_info. - Add text to API documentation discussing copying of vcpu_info. This has been removed in v4. - Adjust the selftest to switch from default to explicit vcpu_info part way through. Changed in v2: - Defer advertizement of KVM_XEN_HVM_CONFIG_SHARED_INFO_HVA to a patch at the end of the series. - Remove the KVM_XEN_HVM_CONFIG_DEFAULT_VCPU_INFO capability. - Add selftests and API documentation. Original text: Currently we treat the shared_info page as guest memory and the VMM informs KVM of its location using a GFN. However it is not guest memory as such; it's an overlay page. So we pointlessly invalidate and re-cache a mapping to the *same page* of memory every time the guest requests that shared_info be mapped into its address space. Let's avoid doing that by modifying the pfncache code to allow activation using a fixed userspace HVA as well as a GPA. Also, if the guest does not hypercall to explicitly set a pointer to a vcpu_info in its own memory, the default vcpu_info embedded in the shared_info page should be used. At the moment the VMM has to set up a pointer to the structure explicitly (again treating it like it's in guest memory, despite being in an overlay page). Let's also avoid the need for that. We already have a cached mapping for the shared_info page so just use that directly by default. Paul Durrant (13): KVM: pfncache: add a map helper function KVM: pfncache: add a mark-dirty helper KVM: pfncache: add a helper to get the gpa KVM: pfncache: base offset check on khva rather than gpa KVM: pfncache: allow a cache to be activated with a fixed (userspace) HVA KVM: xen: allow shared_info to be mapped by fixed HVA KVM: xen: prepare for using 'default' vcpu_info KVM: xen: prevent vcpu_id from changing whilst shared_info is valid KVM: xen: automatically use the vcpu_info embedded in shared_info KVM: selftests / xen: set KVM_XEN_VCPU_ATTR_TYPE_VCPU_ID KVM: selftests / xen: map shared_info using HVA rather than GFN KVM: selftests / xen: don't explicitly set the vcpu_info address KVM: xen: advertize the KVM_XEN_HVM_CONFIG_SHARED_INFO_HVA capability Documentation/virt/kvm/api.rst | 52 ++-- arch/x86/include/asm/kvm_host.h | 4 + arch/x86/kvm/x86.c | 17 +- arch/x86/kvm/xen.c | 244 ++++++++++++++---- arch/x86/kvm/xen.h | 6 +- include/linux/kvm_host.h | 43 +++ include/linux/kvm_types.h | 3 +- include/uapi/linux/kvm.h | 6 +- .../selftests/kvm/x86_64/xen_shinfo_test.c | 75 +++++- virt/kvm/pfncache.c | 129 ++++++--- 10 files changed, 454 insertions(+), 125 deletions(-) --- Cc: "H. Peter Anvin" <hpa@xxxxxxxxx> Cc: Borislav Petkov <bp@xxxxxxxxx> Cc: Dave Hansen <dave.hansen@xxxxxxxxxxxxxxx> Cc: David Woodhouse <dwmw2@xxxxxxxxxxxxx> Cc: Ingo Molnar <mingo@xxxxxxxxxx> Cc: Paolo Bonzini <pbonzini@xxxxxxxxxx> Cc: Sean Christopherson <seanjc@xxxxxxxxxx> Cc: Thomas Gleixner <tglx@xxxxxxxxxxxxx> Cc: x86@xxxxxxxxxx -- 2.39.2