Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
Please login to access the resource
SUSE:SLE-12-SP2:GA
xen.2142
565efe09-x86-ept-remove-unnecessary-sync-after-...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 565efe09-x86-ept-remove-unnecessary-sync-after-resolving-misconfigured-entries.patch of Package xen.2142
# Commit cea357ba4b3335ca5279ee9c00838f85575d5842 # Date 2015-12-02 15:19:53 +0100 # Author David Vrabel <david.vrabel@citrix.com> # Committer Jan Beulich <jbeulich@suse.com> x86/ept: remove unnecessary sync after resolving misconfigured entries When using EPT, type changes are done with the following steps: 1. Set entry as invalid (misconfigured) by settings a reserved memory type. 2. Flush all EPT and combined translations (ept_sync_domain()). 3. Fixup misconfigured entries as required (on EPT_MISCONFIG vmexits or when explicitly setting an entry. Since resolve_misconfig() only updates entries that were misconfigured, there is no need to invalidate any translations since the hardware does not cache misconfigured translations (vol 3, section 28.3.2). Remove the unnecessary (and very expensive) ept_sync_domain() calls). Signed-off-by: David Vrabel <david.vrabel@citrix.com> Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com> Acked-by: Kevin Tian <kevin.tian@intel.com> --- a/xen/arch/x86/mm/p2m-ept.c +++ b/xen/arch/x86/mm/p2m-ept.c @@ -594,7 +594,6 @@ bool_t ept_handle_misconfig(uint64_t gpa spurious = curr->arch.hvm_vmx.ept_spurious_misconfig; rc = resolve_misconfig(p2m, PFN_DOWN(gpa)); curr->arch.hvm_vmx.ept_spurious_misconfig = 0; - ept_sync_domain(p2m); p2m_unlock(p2m); @@ -620,7 +619,7 @@ ept_set_entry(struct p2m_domain *p2m, un int need_modify_vtd_table = 1; int vtd_pte_present = 0; unsigned int iommu_flags = p2m_get_iommu_flags(p2mt); - enum { sync_off, sync_on, sync_check } needs_sync = sync_check; + bool_t needs_sync = 1; ept_entry_t old_entry = { .epte = 0 }; ept_entry_t new_entry = { .epte = 0 }; struct ept_data *ept = &p2m->ept; @@ -641,12 +640,7 @@ ept_set_entry(struct p2m_domain *p2m, un /* Carry out any eventually pending earlier changes first. */ ret = resolve_misconfig(p2m, gfn); if ( ret < 0 ) - { - ept_sync_domain(p2m); return ret; - } - if ( ret > 0 ) - needs_sync = sync_on; ASSERT((target == 2 && hvm_hap_has_1gb()) || (target == 1 && hvm_hap_has_2mb()) || @@ -689,8 +683,8 @@ ept_set_entry(struct p2m_domain *p2m, un /* We reached the target level. */ /* No need to flush if the old entry wasn't valid */ - if ( needs_sync == sync_check && !is_epte_present(ept_entry) ) - needs_sync = sync_off; + if ( !is_epte_present(ept_entry) ) + needs_sync = 0; /* If we're replacing a non-leaf entry with a leaf entry (1GiB or 2MiB), * the intermediate tables will be freed below after the ept flush @@ -766,7 +760,7 @@ ept_set_entry(struct p2m_domain *p2m, un p2m->max_mapped_pfn = gfn + (1UL << order) - 1; out: - if ( needs_sync != sync_off ) + if ( needs_sync ) ept_sync_domain(p2m); /* For non-nested p2m, may need to change VT-d page table.*/
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