[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH memory v2 3/3] memory: Lazy init name from QOM n
From: |
Peter Crosthwaite |
Subject: |
Re: [Qemu-devel] [PATCH memory v2 3/3] memory: Lazy init name from QOM name as needed |
Date: |
Fri, 29 Aug 2014 00:27:41 +1000 |
On Fri, Aug 29, 2014 at 12:06 AM, Paolo Bonzini <address@hidden> wrote:
> Il 26/08/2014 05:10, Peter Crosthwaite ha scritto:
>> To support name retrieval of MemoryRegions that were created
>> dynamically (that is, not via memory_region_init and friends). We
>> cache the name in MemoryRegion's state as
>> object_get_canonical_path_component mallocs the returned value
>> so it's not suitable for direct return to callers. Memory already
>> frees the name field, so this will be garbage collected along with
>> the MR object.
>>
>> Signed-off-by: Peter Crosthwaite <address@hidden>
>> ---
>>
>> memory.c | 5 ++++-
>> 1 file changed, 4 insertions(+), 1 deletion(-)
>>
>> diff --git a/memory.c b/memory.c
>> index 42317a2..fc16e5f 100644
>> --- a/memory.c
>> +++ b/memory.c
>> @@ -914,7 +914,6 @@ void memory_region_init(MemoryRegion *mr,
>> if (size == UINT64_MAX) {
>> mr->size = int128_2_64();
>> }
>> - mr->name = g_strdup(name);
>
> This causes a bunch of [0] to appear in the "info mtree" output.
> They're a bit ugly, so I'm removing this line for now.
>
Yeh, so a solution to that was to patch qom to drop the [*] for
singletons added via arrayified property adders. One possible semantic
that I can think of is the 0th element always has a property alias so
that foo and foo[0] mean the same thing. This tricky part is, when
"[1]" comes along the preferred name (the canonical path) for the 0th
element should switch from "foo" to "foo[0]". Is it sane to switch
child and alias strings for "[0]" when "[1]" comes along?
Regards,
Peter
> Paolo
>
>> if (name) {
>> object_property_add_child_array(owner, name, OBJECT(mr));
>> @@ -1309,6 +1308,10 @@ uint64_t memory_region_size(MemoryRegion *mr)
>>
>> const char *memory_region_name(const MemoryRegion *mr)
>> {
>> + if (!mr->name) {
>> + ((MemoryRegion *)mr)->name =
>> + object_get_canonical_path_component(OBJECT(mr));
>> + }
>> return mr->name;
>> }
>>
>>
>
>