On 29/10/2024 9:42 am, Roger Pau Monne wrote:
> It's possible to have XPTI not active for all PV domains (active for domUs,
> inactive for dom0), hence don't gate setting the per-domain slot on the
> presence of the per-pCPU shadow root page-table.  Instead set the slot based 
> on
> whether XPTI is active for the domain.  This avoid pointlessly setting the
> per-domain slot if the shadow root page-table won't be used by the domain.
>
> Fixes: 0d3e7f0b6bf0 ('xen/x86: support per-domain flag for xpti')
> Signed-off-by: Roger Pau Monné <roger....@citrix.com>
> ---
>  xen/arch/x86/domain.c | 9 ++++-----
>  1 file changed, 4 insertions(+), 5 deletions(-)
>
> diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c
> index 78a13e6812c9..fd6bb3663027 100644
> --- a/xen/arch/x86/domain.c
> +++ b/xen/arch/x86/domain.c
> @@ -1902,12 +1902,11 @@ void cf_check paravirt_ctxt_switch_from(struct vcpu 
> *v)
>  
>  void cf_check paravirt_ctxt_switch_to(struct vcpu *v)
>  {
> -    root_pgentry_t *root_pgt = this_cpu(root_pgt);
> +    const struct domain *d = v->domain;
>  
> -    if ( root_pgt )
> -        root_pgt[root_table_offset(PERDOMAIN_VIRT_START)] =
> -            l4e_from_page(v->domain->arch.perdomain_l3_pg,
> -                          __PAGE_HYPERVISOR_RW);
> +    if ( d->arch.pv.xpti )
> +        this_cpu(root_pgt)[root_table_offset(PERDOMAIN_VIRT_START)] =
> +            l4e_from_page(d->arch.perdomain_l3_pg, __PAGE_HYPERVISOR_RW);

I'm not sure this is a wise change.

You're only optimising away a single PTE calculation/write, at the cost
of retaining a mapping to the wrong domain's perdom area; whichever the
last domain to schedule on this pCPU was.

~Andrew

Reply via email to