|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v3 1/5] x86: suppress XPTI-related TLB flushes when possible
On Wed, Sep 25, 2019 at 05:23:11PM +0200, Jan Beulich wrote:
> When there's no XPTI-enabled PV domain at all, there's no need to issue
> respective TLB flushes. Hardwire opt_xpti_* to false when !PV, and
> record the creation of PV domains by bumping opt_xpti_* accordingly.
>
> As to the sticky opt_xpti_domu vs increment/decrement of opt_xpti_hwdom,
> this is done this way to avoid
> (a) widening the former variable,
> (b) any risk of a missed flush, which would result in an XSA if a DomU
> was able to exercise it, and
> (c) any races updating the variable.
> Fundamentally the TLB flush done when context switching out the domain's
> vCPU-s the last time before destroying the domain ought to be
> sufficient, so in principle DomU handling could be made match hwdom's.
>
> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
> ---
> v3: Re-base.
> v2: Add comment to spec_ctrl.h. Explain difference in accounting of DomU
> and hwdom.
> ---
> TBD: The hardwiring to false could be extended to opt_pv_l1tf_* and (for
> !HVM) opt_l1d_flush as well.
>
> ---
> xen/arch/x86/flushtlb.c | 2 +-
> xen/arch/x86/pv/domain.c | 14 +++++++++++++-
> xen/arch/x86/spec_ctrl.c | 6 ++++++
> xen/include/asm-x86/spec_ctrl.h | 11 +++++++++++
> 4 files changed, 31 insertions(+), 2 deletions(-)
>
> --- a/xen/arch/x86/flushtlb.c
> +++ b/xen/arch/x86/flushtlb.c
> @@ -207,7 +207,7 @@ unsigned int flush_area_local(const void
> */
> invpcid_flush_one(PCID_PV_PRIV, addr);
> invpcid_flush_one(PCID_PV_USER, addr);
> - if ( opt_xpti_hwdom || opt_xpti_domu )
> + if ( opt_xpti_hwdom > 1 || opt_xpti_domu > 1 )
> {
> invpcid_flush_one(PCID_PV_PRIV | PCID_PV_XPTI, addr);
> invpcid_flush_one(PCID_PV_USER | PCID_PV_XPTI, addr);
> --- a/xen/arch/x86/pv/domain.c
> +++ b/xen/arch/x86/pv/domain.c
> @@ -272,6 +272,9 @@ void pv_domain_destroy(struct domain *d)
> destroy_perdomain_mapping(d, GDT_LDT_VIRT_START,
> GDT_LDT_MBYTES << (20 - PAGE_SHIFT));
>
> + opt_xpti_hwdom -= IS_ENABLED(CONFIG_LATE_HWDOM) &&
> + !d->domain_id && opt_xpti_hwdom;
> +
> XFREE(d->arch.pv.cpuidmasks);
>
> FREE_XENHEAP_PAGE(d->arch.pv.gdt_ldt_l1tab);
> @@ -310,7 +313,16 @@ int pv_domain_initialise(struct domain *
> /* 64-bit PV guest by default. */
> d->arch.is_32bit_pv = d->arch.has_32bit_shinfo = 0;
>
> - d->arch.pv.xpti = is_hardware_domain(d) ? opt_xpti_hwdom : opt_xpti_domu;
> + if ( is_hardware_domain(d) && opt_xpti_hwdom )
> + {
> + d->arch.pv.xpti = true;
> + ++opt_xpti_hwdom;
> + }
> + if ( !is_hardware_domain(d) && opt_xpti_domu )
> + {
> + d->arch.pv.xpti = true;
> + opt_xpti_domu = 2;
I wonder whether a store fence is needed here in order to guarantee
that opt_xpti_domu is visible to flush_area_local before proceeding
any further with domain creation.
Thanks, Roger.
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |