Message ID | 20240430164939.925307-14-edgar.iglesias@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | xen: Support grant mappings | expand |
On Tue, Apr 30, 2024 at 06:49:35PM +0200, Edgar E. Iglesias wrote: > From: "Edgar E. Iglesias" <edgar.iglesias@amd.com> > > Propagate MR and is_write to xen_map_cache(). > This is in preparation for adding support for grant mappings. > > No functional change. > > Signed-off-by: Edgar E. Iglesias <edgar.iglesias@amd.com> Acked-by: Peter Xu <peterx@redhat.com>
On Tue, 30 Apr 2024, Edgar E. Iglesias wrote: > From: "Edgar E. Iglesias" <edgar.iglesias@amd.com> > > Propagate MR and is_write to xen_map_cache(). > This is in preparation for adding support for grant mappings. > > No functional change. > > Signed-off-by: Edgar E. Iglesias <edgar.iglesias@amd.com> Reviewed-by: Stefano Stabellini <sstabellini@kernel.org> > --- > hw/xen/xen-mapcache.c | 10 ++++++---- > include/sysemu/xen-mapcache.h | 11 +++++++---- > system/physmem.c | 31 +++++++++++++++++++++++-------- > 3 files changed, 36 insertions(+), 16 deletions(-) > > diff --git a/hw/xen/xen-mapcache.c b/hw/xen/xen-mapcache.c > index 0365311788..09b5f36d9c 100644 > --- a/hw/xen/xen-mapcache.c > +++ b/hw/xen/xen-mapcache.c > @@ -264,7 +264,7 @@ static void xen_remap_bucket(MapCache *mc, > > static uint8_t *xen_map_cache_unlocked(MapCache *mc, > hwaddr phys_addr, hwaddr size, > - uint8_t lock, bool dma) > + uint8_t lock, bool dma, bool is_write) > { > MapCacheEntry *entry, *pentry = NULL, > *free_entry = NULL, *free_pentry = NULL; > @@ -387,13 +387,15 @@ tryagain: > return mc->last_entry->vaddr_base + address_offset; > } > > -uint8_t *xen_map_cache(hwaddr phys_addr, hwaddr size, > - uint8_t lock, bool dma) > +uint8_t *xen_map_cache(MemoryRegion *mr, > + hwaddr phys_addr, hwaddr size, > + uint8_t lock, bool dma, > + bool is_write) > { > uint8_t *p; > > mapcache_lock(mapcache); > - p = xen_map_cache_unlocked(mapcache, phys_addr, size, lock, dma); > + p = xen_map_cache_unlocked(mapcache, phys_addr, size, lock, dma, is_write); > mapcache_unlock(mapcache); > return p; > } > diff --git a/include/sysemu/xen-mapcache.h b/include/sysemu/xen-mapcache.h > index 10c2e3082a..1ec9e66752 100644 > --- a/include/sysemu/xen-mapcache.h > +++ b/include/sysemu/xen-mapcache.h > @@ -18,8 +18,9 @@ typedef hwaddr (*phys_offset_to_gaddr_t)(hwaddr phys_offset, > > void xen_map_cache_init(phys_offset_to_gaddr_t f, > void *opaque); > -uint8_t *xen_map_cache(hwaddr phys_addr, hwaddr size, > - uint8_t lock, bool dma); > +uint8_t *xen_map_cache(MemoryRegion *mr, hwaddr phys_addr, hwaddr size, > + uint8_t lock, bool dma, > + bool is_write); > ram_addr_t xen_ram_addr_from_mapcache(void *ptr); > void xen_invalidate_map_cache_entry(uint8_t *buffer); > void xen_invalidate_map_cache(void); > @@ -33,10 +34,12 @@ static inline void xen_map_cache_init(phys_offset_to_gaddr_t f, > { > } > > -static inline uint8_t *xen_map_cache(hwaddr phys_addr, > +static inline uint8_t *xen_map_cache(MemoryRegion *mr, > + hwaddr phys_addr, > hwaddr size, > uint8_t lock, > - bool dma) > + bool dma, > + bool is_write) > { > abort(); > } > diff --git a/system/physmem.c b/system/physmem.c > index f114b972a5..ad7a8c7d95 100644 > --- a/system/physmem.c > +++ b/system/physmem.c > @@ -2190,11 +2190,22 @@ void qemu_ram_remap(ram_addr_t addr, ram_addr_t length) > > /* > * Return a host pointer to guest's ram. > + * For Xen, foreign mappings get created if they don't already exist. > + * > + * @block: block for the RAM to lookup (optional and may be NULL). > + * @addr: address within the memory region. > + * @size: pointer to requested size (optional and may be NULL). > + * size may get modified and return a value smaller than > + * what was requested. > + * @lock: wether to lock the mapping in xen-mapcache until invalidated. > + * @is_write: hint wether to map RW or RO in the xen-mapcache. > + * (optional and may always be set to true). > * > * Called within RCU critical section. > */ > static void *qemu_ram_ptr_length(RAMBlock *block, ram_addr_t addr, > - hwaddr *size, bool lock) > + hwaddr *size, bool lock, > + bool is_write) > { > hwaddr len = 0; > > @@ -2217,10 +2228,13 @@ static void *qemu_ram_ptr_length(RAMBlock *block, ram_addr_t addr, > * In that case just map the requested area. > */ > if (block->offset == 0) { > - return xen_map_cache(addr, len, lock, lock); > + return xen_map_cache(block->mr, addr, len, lock, lock, > + is_write); > } > > - block->host = xen_map_cache(block->offset, block->max_length, 1, lock); > + block->host = xen_map_cache(block->mr, block->offset, > + block->max_length, 1, > + lock, is_write); > } > > return ramblock_ptr(block, addr); > @@ -2236,7 +2250,7 @@ static void *qemu_ram_ptr_length(RAMBlock *block, ram_addr_t addr, > */ > void *qemu_map_ram_ptr(RAMBlock *ram_block, ram_addr_t addr) > { > - return qemu_ram_ptr_length(ram_block, addr, NULL, false); > + return qemu_ram_ptr_length(ram_block, addr, NULL, false, true); > } > > /* Return the offset of a hostpointer within a ramblock */ > @@ -2746,7 +2760,7 @@ static MemTxResult flatview_write_continue_step(MemTxAttrs attrs, > } else { > /* RAM case */ > uint8_t *ram_ptr = qemu_ram_ptr_length(mr->ram_block, mr_addr, l, > - false); > + false, true); > > memmove(ram_ptr, buf, *l); > invalidate_and_set_dirty(mr, mr_addr, *l); > @@ -2839,7 +2853,7 @@ static MemTxResult flatview_read_continue_step(MemTxAttrs attrs, uint8_t *buf, > } else { > /* RAM case */ > uint8_t *ram_ptr = qemu_ram_ptr_length(mr->ram_block, mr_addr, l, > - false); > + false, false); > > memcpy(buf, ram_ptr, *l); > > @@ -3233,7 +3247,7 @@ void *address_space_map(AddressSpace *as, > *plen = flatview_extend_translation(fv, addr, len, mr, xlat, > l, is_write, attrs); > fuzz_dma_read_cb(addr, *plen, mr); > - return qemu_ram_ptr_length(mr->ram_block, xlat, plen, true); > + return qemu_ram_ptr_length(mr->ram_block, xlat, plen, true, is_write); > } > > /* Unmaps a memory region previously mapped by address_space_map(). > @@ -3329,7 +3343,8 @@ int64_t address_space_cache_init(MemoryRegionCache *cache, > l = flatview_extend_translation(cache->fv, addr, len, mr, > cache->xlat, l, is_write, > MEMTXATTRS_UNSPECIFIED); > - cache->ptr = qemu_ram_ptr_length(mr->ram_block, cache->xlat, &l, true); > + cache->ptr = qemu_ram_ptr_length(mr->ram_block, cache->xlat, &l, true, > + is_write); > } else { > cache->ptr = NULL; > } > -- > 2.40.1 >
On 30.04.24 18:49, Edgar E. Iglesias wrote: > From: "Edgar E. Iglesias" <edgar.iglesias@amd.com> > > Propagate MR and is_write to xen_map_cache(). I'm pretty sure the patch subject is missing a "to" :) > This is in preparation for adding support for grant mappings. > > No functional change. > Reviewed-by: David Hildenbrand <david@redhat.com>
On Thu, May 2, 2024 at 9:24 AM David Hildenbrand <david@redhat.com> wrote: > > On 30.04.24 18:49, Edgar E. Iglesias wrote: > > From: "Edgar E. Iglesias" <edgar.iglesias@amd.com> > > > > Propagate MR and is_write to xen_map_cache(). > > I'm pretty sure the patch subject is missing a "to" :) Thanks David! I'll fix it in v5! Cheers, Edgar > > > This is in preparation for adding support for grant mappings. > > > > No functional change. > > > > Reviewed-by: David Hildenbrand <david@redhat.com> > -- > Cheers, > > David / dhildenb >
On 30/4/24 18:49, Edgar E. Iglesias wrote: > From: "Edgar E. Iglesias" <edgar.iglesias@amd.com> > > Propagate MR and is_write to xen_map_cache(). > This is in preparation for adding support for grant mappings. > > No functional change. > > Signed-off-by: Edgar E. Iglesias <edgar.iglesias@amd.com> > --- > hw/xen/xen-mapcache.c | 10 ++++++---- > include/sysemu/xen-mapcache.h | 11 +++++++---- > system/physmem.c | 31 +++++++++++++++++++++++-------- > 3 files changed, 36 insertions(+), 16 deletions(-) Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
diff --git a/hw/xen/xen-mapcache.c b/hw/xen/xen-mapcache.c index 0365311788..09b5f36d9c 100644 --- a/hw/xen/xen-mapcache.c +++ b/hw/xen/xen-mapcache.c @@ -264,7 +264,7 @@ static void xen_remap_bucket(MapCache *mc, static uint8_t *xen_map_cache_unlocked(MapCache *mc, hwaddr phys_addr, hwaddr size, - uint8_t lock, bool dma) + uint8_t lock, bool dma, bool is_write) { MapCacheEntry *entry, *pentry = NULL, *free_entry = NULL, *free_pentry = NULL; @@ -387,13 +387,15 @@ tryagain: return mc->last_entry->vaddr_base + address_offset; } -uint8_t *xen_map_cache(hwaddr phys_addr, hwaddr size, - uint8_t lock, bool dma) +uint8_t *xen_map_cache(MemoryRegion *mr, + hwaddr phys_addr, hwaddr size, + uint8_t lock, bool dma, + bool is_write) { uint8_t *p; mapcache_lock(mapcache); - p = xen_map_cache_unlocked(mapcache, phys_addr, size, lock, dma); + p = xen_map_cache_unlocked(mapcache, phys_addr, size, lock, dma, is_write); mapcache_unlock(mapcache); return p; } diff --git a/include/sysemu/xen-mapcache.h b/include/sysemu/xen-mapcache.h index 10c2e3082a..1ec9e66752 100644 --- a/include/sysemu/xen-mapcache.h +++ b/include/sysemu/xen-mapcache.h @@ -18,8 +18,9 @@ typedef hwaddr (*phys_offset_to_gaddr_t)(hwaddr phys_offset, void xen_map_cache_init(phys_offset_to_gaddr_t f, void *opaque); -uint8_t *xen_map_cache(hwaddr phys_addr, hwaddr size, - uint8_t lock, bool dma); +uint8_t *xen_map_cache(MemoryRegion *mr, hwaddr phys_addr, hwaddr size, + uint8_t lock, bool dma, + bool is_write); ram_addr_t xen_ram_addr_from_mapcache(void *ptr); void xen_invalidate_map_cache_entry(uint8_t *buffer); void xen_invalidate_map_cache(void); @@ -33,10 +34,12 @@ static inline void xen_map_cache_init(phys_offset_to_gaddr_t f, { } -static inline uint8_t *xen_map_cache(hwaddr phys_addr, +static inline uint8_t *xen_map_cache(MemoryRegion *mr, + hwaddr phys_addr, hwaddr size, uint8_t lock, - bool dma) + bool dma, + bool is_write) { abort(); } diff --git a/system/physmem.c b/system/physmem.c index f114b972a5..ad7a8c7d95 100644 --- a/system/physmem.c +++ b/system/physmem.c @@ -2190,11 +2190,22 @@ void qemu_ram_remap(ram_addr_t addr, ram_addr_t length) /* * Return a host pointer to guest's ram. + * For Xen, foreign mappings get created if they don't already exist. + * + * @block: block for the RAM to lookup (optional and may be NULL). + * @addr: address within the memory region. + * @size: pointer to requested size (optional and may be NULL). + * size may get modified and return a value smaller than + * what was requested. + * @lock: wether to lock the mapping in xen-mapcache until invalidated. + * @is_write: hint wether to map RW or RO in the xen-mapcache. + * (optional and may always be set to true). * * Called within RCU critical section. */ static void *qemu_ram_ptr_length(RAMBlock *block, ram_addr_t addr, - hwaddr *size, bool lock) + hwaddr *size, bool lock, + bool is_write) { hwaddr len = 0; @@ -2217,10 +2228,13 @@ static void *qemu_ram_ptr_length(RAMBlock *block, ram_addr_t addr, * In that case just map the requested area. */ if (block->offset == 0) { - return xen_map_cache(addr, len, lock, lock); + return xen_map_cache(block->mr, addr, len, lock, lock, + is_write); } - block->host = xen_map_cache(block->offset, block->max_length, 1, lock); + block->host = xen_map_cache(block->mr, block->offset, + block->max_length, 1, + lock, is_write); } return ramblock_ptr(block, addr); @@ -2236,7 +2250,7 @@ static void *qemu_ram_ptr_length(RAMBlock *block, ram_addr_t addr, */ void *qemu_map_ram_ptr(RAMBlock *ram_block, ram_addr_t addr) { - return qemu_ram_ptr_length(ram_block, addr, NULL, false); + return qemu_ram_ptr_length(ram_block, addr, NULL, false, true); } /* Return the offset of a hostpointer within a ramblock */ @@ -2746,7 +2760,7 @@ static MemTxResult flatview_write_continue_step(MemTxAttrs attrs, } else { /* RAM case */ uint8_t *ram_ptr = qemu_ram_ptr_length(mr->ram_block, mr_addr, l, - false); + false, true); memmove(ram_ptr, buf, *l); invalidate_and_set_dirty(mr, mr_addr, *l); @@ -2839,7 +2853,7 @@ static MemTxResult flatview_read_continue_step(MemTxAttrs attrs, uint8_t *buf, } else { /* RAM case */ uint8_t *ram_ptr = qemu_ram_ptr_length(mr->ram_block, mr_addr, l, - false); + false, false); memcpy(buf, ram_ptr, *l); @@ -3233,7 +3247,7 @@ void *address_space_map(AddressSpace *as, *plen = flatview_extend_translation(fv, addr, len, mr, xlat, l, is_write, attrs); fuzz_dma_read_cb(addr, *plen, mr); - return qemu_ram_ptr_length(mr->ram_block, xlat, plen, true); + return qemu_ram_ptr_length(mr->ram_block, xlat, plen, true, is_write); } /* Unmaps a memory region previously mapped by address_space_map(). @@ -3329,7 +3343,8 @@ int64_t address_space_cache_init(MemoryRegionCache *cache, l = flatview_extend_translation(cache->fv, addr, len, mr, cache->xlat, l, is_write, MEMTXATTRS_UNSPECIFIED); - cache->ptr = qemu_ram_ptr_length(mr->ram_block, cache->xlat, &l, true); + cache->ptr = qemu_ram_ptr_length(mr->ram_block, cache->xlat, &l, true, + is_write); } else { cache->ptr = NULL; }