From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:48839) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WuhVe-0008NI-03 for qemu-devel@nongnu.org; Wed, 11 Jun 2014 08:20:14 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WuhVU-0001Vb-VO for qemu-devel@nongnu.org; Wed, 11 Jun 2014 08:20:05 -0400 Received: from mail-wi0-x232.google.com ([2a00:1450:400c:c05::232]:35674) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WuhVU-0001VO-ON for qemu-devel@nongnu.org; Wed, 11 Jun 2014 08:19:56 -0400 Received: by mail-wi0-f178.google.com with SMTP id n15so992132wiw.11 for ; Wed, 11 Jun 2014 05:19:55 -0700 (PDT) Sender: Paolo Bonzini From: Paolo Bonzini Date: Wed, 11 Jun 2014 14:19:33 +0200 Message-Id: <1402489176-19738-11-git-send-email-pbonzini@redhat.com> In-Reply-To: <1402489176-19738-1-git-send-email-pbonzini@redhat.com> References: <1402489176-19738-1-git-send-email-pbonzini@redhat.com> Subject: [Qemu-devel] [RFC PATCH 10/13] memory: MemoryRegion: replace owner field with QOM parent List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: peter.crosthwaite@xilinx.com, afaerber@suse.de The two are now the same. Signed-off-by: Paolo Bonzini --- include/exec/memory.h | 1 - memory.c | 35 +++++++++++++++++++++++++---------- 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/include/exec/memory.h b/include/exec/memory.h index ead7eaf..bcea4df 100644 --- a/include/exec/memory.h +++ b/include/exec/memory.h @@ -140,7 +140,6 @@ struct MemoryRegion { const MemoryRegionOps *ops; const MemoryRegionIOMMUOps *iommu_ops; void *opaque; - struct Object *owner; MemoryRegion *container; Int128 size; hwaddr addr; diff --git a/memory.c b/memory.c index 04d0cd3..acbab4c 100644 --- a/memory.c +++ b/memory.c @@ -865,9 +865,11 @@ void memory_region_init(MemoryRegion *mr, const char *name, uint64_t size) { - object_initialize(mr, sizeof(*mr), TYPE_MEMORY_REGION); + if (!owner) { + owner = qdev_get_machine(); + } - mr->owner = owner ? owner : qdev_get_machine(); + object_initialize(mr, sizeof(*mr), TYPE_MEMORY_REGION); mr->size = int128_make64(size); if (size == UINT64_MAX) { mr->size = int128_2_64(); @@ -875,7 +877,7 @@ void memory_region_init(MemoryRegion *mr, mr->name = g_strdup(name); if (name) { - object_property_add_child_array(mr->owner, name, OBJECT(mr)); + object_property_add_child_array(owner, name, OBJECT(mr)); object_unref(OBJECT(mr)); } } @@ -1130,24 +1132,37 @@ void memory_region_destroy(MemoryRegion *mr) Object *memory_region_owner(MemoryRegion *mr) { - return mr->owner; + Object *obj = OBJECT(mr); + return obj->parent; } void memory_region_ref(MemoryRegion *mr) { - if (mr && mr->owner) { - object_ref(mr->owner); + /* MMIO callbacks most likely will access data that belongs + * to the owner, hence the need to ref/unref the owner whenever + * the memory region is in use. + * + * The memory region is a child of its owner. As long as the + * owner doesn't call unparent itself on the memory region, + * ref-ing the owner will also keep the memory region alive. + * Memory regions without an owner are supposed to never go away, + * but we still ref/unref them for debugging purposes. + */ + Object *obj = OBJECT(mr); + if (obj && obj->parent) { + object_ref(obj->parent); } else { - object_ref(mr); + object_ref(obj); } } void memory_region_unref(MemoryRegion *mr) { - if (mr && mr->owner) { - object_unref(mr->owner); + Object *obj = OBJECT(mr); + if (obj && obj->parent) { + object_unref(obj->parent); } else { - object_unref(mr); + object_unref(obj); } } -- 1.8.3.1