[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH] memory: size can be different from ptr_size
From: |
Juan Quintela |
Subject: |
Re: [Qemu-devel] [PATCH] memory: size can be different from ptr_size |
Date: |
Wed, 05 Sep 2018 13:37:11 +0200 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/26.1 (gnu/linux) |
Marc-André Lureau <address@hidden> 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 <address@hidden>
> ---
> 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.