Marc-André Lureau <marcandre.lur...@redhat.com> wrote: > memory_region_init_ram*_ptr() take only the size of the MemoryRegion, > and allocate a RAMBlock with the same size. However, it may be > convenient to expose a smaller MemoryRegion (for ex: a few bytes) than > the RAMBlock (which must be a multiple of TARGET_PAGE_SIZE). > > Signed-off-by: Marc-André Lureau <marcandre.lur...@redhat.com> > --- > include/exec/memory.h | 8 ++++++-- > exec.c | 3 +++ > hw/display/g364fb.c | 2 +- > hw/vfio/common.c | 3 ++- > hw/virtio/vhost-user.c | 2 +- > memory.c | 10 ++++++---- > 6 files changed, 19 insertions(+), 9 deletions(-) > > diff --git a/include/exec/memory.h b/include/exec/memory.h > index eb4f2fb249..03f257829b 100644 > --- a/include/exec/memory.h > +++ b/include/exec/memory.h > @@ -700,6 +700,7 @@ void memory_region_init_ram_from_fd(MemoryRegion *mr, > * must be unique within any device > * @size: size of the region. > * @ptr: memory to be mapped; must contain at least @size bytes. ^^^^^
this comment gets wrong with your patches > + * @ptr_size: size of @ptr buffer > diff --git a/exec.c b/exec.c > index 6826c8337d..fcea614e79 100644 > --- a/exec.c > +++ b/exec.c > @@ -2361,6 +2361,9 @@ RAMBlock *qemu_ram_alloc_internal(ram_addr_t size, > ram_addr_t max_size, > RAMBlock *qemu_ram_alloc_from_ptr(ram_addr_t size, void *host, > MemoryRegion *mr, Error **errp) > { > + assert(size >= TARGET_PAGE_SIZE); > + assert(size % TARGET_PAGE_SIZE == 0); > + > return qemu_ram_alloc_internal(size, size, NULL, host, false, > false, mr, errp); > } ok with this bit. But how about to change instead to: void memory_region_init_ram_ptr(MemoryRegion *mr, Object *owner, const char *name, uint64_t size, void *ptr) { uint64_t real_size = ROUND_UP_TARGET_PAGE_SIZE(size); memory_region_init(mr, owner, name, real_size); mr->ram = true; mr->terminates = true; mr->destructor = memory_region_destructor_ram; mr->dirty_log_mask = tcg_enabled() ? (1 << DIRTY_MEMORY_CODE) : 0; /* qemu_ram_alloc_from_ptr cannot fail with ptr != NULL. */ assert(ptr != NULL); mr->ram_block = qemu_ram_alloc_from_ptr(size, ptr, mr, &error_fatal); } For a suitable ROUND_UP_TARGET_PAGE_SIZE() macro. You get the idea. And memory_region_device_ram_ptr() don't even need a change. We need to adjust the comments, but it looks like an easier patch to me, no? > diff --git a/hw/display/g364fb.c b/hw/display/g364fb.c > index fbc2b2422d..f4f5643761 100644 > --- a/hw/display/g364fb.c > +++ b/hw/display/g364fb.c > @@ -475,7 +475,7 @@ static void g364fb_init(DeviceState *dev, G364State *s) > > memory_region_init_io(&s->mem_ctrl, NULL, &g364fb_ctrl_ops, s, "ctrl", > 0x180000); > memory_region_init_ram_ptr(&s->mem_vram, NULL, "vram", > - s->vram_size, s->vram); > + s->vram_size, s->vram, s->vram_size); Having to change all the devices that use the function with exactly the same parameter looks weird to me. What do you think? Later, Juan.