[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 >
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |