|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v10 1/3] x86/tlb: introduce a flush HVM ASIDs flag
On 16.04.2020 15:59, Roger Pau Monne wrote:
> Introduce a specific flag to request a HVM guest linear TLB flush,
> which is an ASID/VPID tickle that forces a guest linear to guest
> physical TLB flush for all HVM guests.
>
> This was previously unconditionally done in each pre_flush call, but
> that's not required: HVM guests not using shadow don't require linear
> TLB flushes as Xen doesn't modify the guest page tables in that case
> (ie: when using HAP).
I'm afraid I'm being confused by this: Even in shadow mode Xen
doesn't modify guest page tables, does it?
> @@ -254,3 +257,14 @@ unsigned int flush_area_local(const void *va, unsigned
> int flags)
>
> return flags;
> }
> +
> +void guest_flush_tlb_mask(const struct domain *d, const cpumask_t *mask)
> +{
> + unsigned int flags = (is_pv_domain(d) || paging_mode_shadow(d) ?
> FLUSH_TLB
> + : 0) |
> + (is_hvm_domain(d) && cpu_has_svm ?
> FLUSH_HVM_ASID_CORE
> + : 0);
Why the is_pv_domain() part of the condition? Afaict for PV
domains you can get here only if they have shadow mode enabled.
> --- a/xen/arch/x86/mm/shadow/private.h
> +++ b/xen/arch/x86/mm/shadow/private.h
> @@ -818,6 +818,12 @@ static inline int sh_check_page_has_no_refs(struct
> page_info *page)
> bool shadow_flush_tlb(bool (*flush_vcpu)(void *ctxt, struct vcpu *v),
> void *ctxt);
>
> +static inline void sh_flush_local(const struct domain *d)
> +{
> + flush_local(FLUSH_TLB |
> + (is_hvm_domain(d) && cpu_has_svm ? FLUSH_HVM_ASID_CORE : 0));
> +}
I think the right side of | wants folding with its counterpart in
guest_flush_tlb_mask(). Doing so would avoid guest_flush_tlb_mask()
getting updated but this one forgotten. Perhaps split out
guest_flush_tlb_flags() from guest_flush_tlb_mask()?
I also think this function should move into multi.c as long as it's
needed only there.
Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |