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

Re: [PATCH v1 1/1] xen: mapcache: Split mapcache_grants by ro and rw



On Fri, 25 Apr 2025, Edgar E. Iglesias wrote:
> From: "Edgar E. Iglesias" <edgar.iglesias@xxxxxxx>
> 
> Today, we don't track write-abiliy in the cache, if a user
> requests a readable mapping followed by a writeable mapping
> on the same page, the second lookup will incorrectly hit
> the readable entry.
> 
> Split mapcache_grants by ro and rw access. Grants will now
> have separate ways in the cache depending on writeability.
> 
> Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xxxxxxx>

Reviewed-by: Stefano Stabellini <sstabellini@xxxxxxxxxx>


> ---
>  hw/xen/xen-mapcache.c | 26 +++++++++++++++++++-------
>  1 file changed, 19 insertions(+), 7 deletions(-)
> 
> diff --git a/hw/xen/xen-mapcache.c b/hw/xen/xen-mapcache.c
> index 2c8f861fdb..e31d379702 100644
> --- a/hw/xen/xen-mapcache.c
> +++ b/hw/xen/xen-mapcache.c
> @@ -75,7 +75,8 @@ typedef struct MapCache {
>  } MapCache;
>  
>  static MapCache *mapcache;
> -static MapCache *mapcache_grants;
> +static MapCache *mapcache_grants_ro;
> +static MapCache *mapcache_grants_rw;
>  static xengnttab_handle *xen_region_gnttabdev;
>  
>  static inline void mapcache_lock(MapCache *mc)
> @@ -176,9 +177,12 @@ void xen_map_cache_init(phys_offset_to_gaddr_t f, void 
> *opaque)
>       * Grant mappings must use XC_PAGE_SIZE granularity since we can't
>       * map anything beyond the number of pages granted to us.
>       */
> -    mapcache_grants = xen_map_cache_init_single(f, opaque,
> -                                                XC_PAGE_SHIFT,
> -                                                max_mcache_size);
> +    mapcache_grants_ro = xen_map_cache_init_single(f, opaque,
> +                                                   XC_PAGE_SHIFT,
> +                                                   max_mcache_size);
> +    mapcache_grants_rw = xen_map_cache_init_single(f, opaque,
> +                                                   XC_PAGE_SHIFT,
> +                                                   max_mcache_size);
>  
>      setrlimit(RLIMIT_AS, &rlimit_as);
>  }
> @@ -456,9 +460,13 @@ uint8_t *xen_map_cache(MemoryRegion *mr,
>                         bool is_write)
>  {
>      bool grant = xen_mr_is_grants(mr);
> -    MapCache *mc = grant ? mapcache_grants : mapcache;
> +    MapCache *mc = mapcache;
>      uint8_t *p;
>  
> +    if (grant) {
> +        mc = is_write ? mapcache_grants_rw : mapcache_grants_ro;
> +    }
> +
>      if (grant && !lock) {
>          /*
>           * Grants are only supported via address_space_map(). Anything
> @@ -523,7 +531,10 @@ ram_addr_t xen_ram_addr_from_mapcache(void *ptr)
>  
>      addr = xen_ram_addr_from_mapcache_single(mapcache, ptr);
>      if (addr == RAM_ADDR_INVALID) {
> -        addr = xen_ram_addr_from_mapcache_single(mapcache_grants, ptr);
> +        addr = xen_ram_addr_from_mapcache_single(mapcache_grants_ro, ptr);
> +    }
> +    if (addr == RAM_ADDR_INVALID) {
> +        addr = xen_ram_addr_from_mapcache_single(mapcache_grants_rw, ptr);
>      }
>  
>      return addr;
> @@ -626,7 +637,8 @@ static void 
> xen_invalidate_map_cache_entry_single(MapCache *mc, uint8_t *buffer)
>  static void xen_invalidate_map_cache_entry_all(uint8_t *buffer)
>  {
>      xen_invalidate_map_cache_entry_single(mapcache, buffer);
> -    xen_invalidate_map_cache_entry_single(mapcache_grants, buffer);
> +    xen_invalidate_map_cache_entry_single(mapcache_grants_ro, buffer);
> +    xen_invalidate_map_cache_entry_single(mapcache_grants_rw, buffer);
>  }
>  
>  static void xen_invalidate_map_cache_entry_bh(void *opaque)
> -- 
> 2.43.0
> 



 


Rackspace

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