[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v3 09/18] x86/domain_page: move struct mapcache_vcpu to struct arch_vcpu



On Wed, Oct 07, 2026 at 11:40:42AM +0100, George Dunlap wrote:
> From: Roger Pau Monné <roger.pau@xxxxxxxxxx>
> 
> struct mapcache_vcpu, the per-vCPU part of the mapcache (the maphash
> and the vCPU's shadow of the domain's TLB epoch), lives in struct
> pv_vcpu, as only PV vCPUs have a mapcache.  In preparation for
> implementing mapcaches for HVM domains, move it to struct arch_vcpu:
> v->arch.pv.mapcache becomes v->arch.mapcache.
> 
> struct pv_vcpu shrinks from 512 to 376 bytes, and struct vcpu grows
> from 2880 to 3008 bytes (x86_64, debug build), within its page: from
> here on HVM vCPUs carry the 136-byte struct mapcache_vcpu too, ahead of
> its use by those of vCPU-PT domains.
> 
> No functional change.
> 
> Signed-off-by: Roger Pau Monné <roger.pau@xxxxxxxxxx>
> Assisted-by: Claude Code:claude-fable-5, Claude Code:claude-opus-4-8, Claude 
> Code:claude-opus-5-5
> Signed-off-by: George Dunlap <gwd@xxxxxxxxxxxxxx>

Reviewed-by: Roger Pau Monné <roger@xxxxxxxxxxxxxx>

> ---
> Changes in v3:
> - New in this version, split out of "x86/hvm: introduce per-vCPU
>   mapcache for vCPU-PT domains" for review.
> ---
>  xen/arch/x86/domain_page.c        | 6 +++---
>  xen/arch/x86/include/asm/domain.h | 6 +++---
>  2 files changed, 6 insertions(+), 6 deletions(-)
> 
> diff --git a/xen/arch/x86/domain_page.c b/xen/arch/x86/domain_page.c
> index 5d90f77bed..f91ec8a75a 100644
> --- a/xen/arch/x86/domain_page.c
> +++ b/xen/arch/x86/domain_page.c
> @@ -134,7 +134,7 @@ void *map_domain_page(mfn_t mfn)
>          return mfn_to_virt(mfn_x(mfn));
>  
>      cache = vcpu_mapcache(v, &dcache);
> -    vcache = &v->arch.pv.mapcache;
> +    vcache = &v->arch.mapcache;
>      if ( !cache->inuse )
>          return mfn_to_virt(mfn_x(mfn));
>  
> @@ -231,7 +231,7 @@ void unmap_domain_page(const void *ptr)
>  
>      idx = PFN_DOWN(va - MAPCACHE_VIRT_START);
>      mfn = l1e_get_pfn(MAPCACHE_L1ENT(idx));
> -    hashent = &v->arch.pv.mapcache.hash[MAPHASH_HASHFN(mfn)];
> +    hashent = &v->arch.mapcache.hash[MAPHASH_HASHFN(mfn)];
>  
>      local_irq_save(flags);
>  
> @@ -334,7 +334,7 @@ int mapcache_vcpu_init(struct vcpu *v)
>      BUILD_BUG_ON(MAPHASHENT_NOTINUSE < MAPCACHE_ENTRIES);
>      for ( i = 0; i < MAPHASH_ENTRIES; i++ )
>      {
> -        struct vcpu_maphash_entry *hashent = &v->arch.pv.mapcache.hash[i];
> +        struct vcpu_maphash_entry *hashent = &v->arch.mapcache.hash[i];
>  
>          hashent->mfn = ~0UL; /* never valid to map */
>          hashent->idx = MAPHASHENT_NOTINUSE;
> diff --git a/xen/arch/x86/include/asm/domain.h 
> b/xen/arch/x86/include/asm/domain.h
> index 6f5873879e..cfa24c4e75 100644
> --- a/xen/arch/x86/include/asm/domain.h
> +++ b/xen/arch/x86/include/asm/domain.h
> @@ -552,9 +552,6 @@ struct arch_domain
>  
>  struct pv_vcpu
>  {
> -    /* map_domain_page() mapping cache. */
> -    struct mapcache_vcpu mapcache;
> -
>      unsigned int vgc_flags;
>  
>      struct trap_info *trap_ctxt;
> @@ -650,6 +647,9 @@ struct arch_vcpu
>  #define async_exception_state(t) async_exception_state[(t)-1]
>      uint8_t async_exception_mask;
>  
> +    /* map_domain_page() mapping cache. */
> +    struct mapcache_vcpu mapcache;

FWIW, I would maybe place this at the top of the structure, like it
was placed in pv_vcpu?

In any case the placement of the fields of arch_vcpu is a mess
already, so it doesn't make much of a difference.

Thanks, Roger.



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.