From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39277) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WKpvV-0001py-Jh for qemu-devel@nongnu.org; Tue, 04 Mar 2014 09:02:41 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WKpvM-0001co-3a for qemu-devel@nongnu.org; Tue, 04 Mar 2014 09:02:33 -0500 Received: from mail-ea0-x22d.google.com ([2a00:1450:4013:c01::22d]:33652) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WKpvL-0001cb-Tl for qemu-devel@nongnu.org; Tue, 04 Mar 2014 09:02:24 -0500 Received: by mail-ea0-f173.google.com with SMTP id r15so377737ead.4 for ; Tue, 04 Mar 2014 06:02:23 -0800 (PST) Sender: Paolo Bonzini From: Paolo Bonzini Date: Tue, 4 Mar 2014 15:00:50 +0100 Message-Id: <1393941656-29068-23-git-send-email-pbonzini@redhat.com> In-Reply-To: <1393941656-29068-1-git-send-email-pbonzini@redhat.com> References: <1393941656-29068-1-git-send-email-pbonzini@redhat.com> Subject: [Qemu-devel] [PATCH 2.1 22/28] hostmem: separate allocation from UserCreatable complete method List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: ehabkost@redhat.com, hutao@cn.fujitsu.com, mtosatti@redhat.com, imammedo@redhat.com, a.motakis@virtualopensystems.com, gaowanlong@cn.fujitsu.com This allows the superclass to set various policies on the memory region that the subclass creates. Suggested-by: Igor Mammedov Signed-off-by: Paolo Bonzini --- backends/hostmem-file.c | 9 ++++----- backends/hostmem-ram.c | 8 +++----- backends/hostmem.c | 12 ++++++++++-- include/sysemu/hostmem.h | 2 ++ 4 files changed, 19 insertions(+), 12 deletions(-) diff --git a/backends/hostmem-file.c b/backends/hostmem-file.c index 8c6ea5d..7e91665 100644 --- a/backends/hostmem-file.c +++ b/backends/hostmem-file.c @@ -30,10 +30,9 @@ struct HostMemoryBackendFile { }; static void -file_backend_memory_init(UserCreatable *uc, Error **errp) +file_backend_memory_alloc(HostMemoryBackend *backend, Error **errp) { - HostMemoryBackend *backend = MEMORY_BACKEND(uc); - HostMemoryBackendFile *fb = MEMORY_BACKEND_FILE(uc); + HostMemoryBackendFile *fb = MEMORY_BACKEND_FILE(backend); if (!backend->size) { error_setg(errp, "can't create backend with size 0"); @@ -58,9 +57,9 @@ file_backend_memory_init(UserCreatable *uc, Error **errp) static void file_backend_class_init(ObjectClass *oc, void *data) { - UserCreatableClass *ucc = USER_CREATABLE_CLASS(oc); + HostMemoryBackendClass *bc = MEMORY_BACKEND_CLASS(oc); - ucc->complete = file_backend_memory_init; + bc->alloc = file_backend_memory_alloc; } static char *get_mem_path(Object *o, Error **errp) diff --git a/backends/hostmem-ram.c b/backends/hostmem-ram.c index ce06fbe..e4d244a 100644 --- a/backends/hostmem-ram.c +++ b/backends/hostmem-ram.c @@ -16,10 +16,8 @@ static void -ram_backend_memory_init(UserCreatable *uc, Error **errp) +ram_backend_memory_alloc(HostMemoryBackend *backend, Error **errp) { - HostMemoryBackend *backend = MEMORY_BACKEND(uc); - if (!backend->size) { error_setg(errp, "can't create backend with size 0"); return; @@ -33,9 +31,9 @@ ram_backend_memory_init(UserCreatable *uc, Error **errp) static void ram_backend_class_init(ObjectClass *oc, void *data) { - UserCreatableClass *ucc = USER_CREATABLE_CLASS(oc); + HostMemoryBackendClass *bc = MEMORY_BACKEND_CLASS(oc); - ucc->complete = ram_backend_memory_init; + bc->alloc = ram_backend_memory_alloc; } static const TypeInfo ram_backend_info = { diff --git a/backends/hostmem.c b/backends/hostmem.c index 06817dd..7d6199f 100644 --- a/backends/hostmem.c +++ b/backends/hostmem.c @@ -69,8 +69,16 @@ static void host_memory_backend_finalize(Object *obj) static void host_memory_backend_memory_init(UserCreatable *uc, Error **errp) { - error_setg(errp, "memory_init is not implemented for type [%s]", - object_get_typename(OBJECT(uc))); + HostMemoryBackend *backend = MEMORY_BACKEND(uc); + HostMemoryBackendClass *bc = MEMORY_BACKEND_GET_CLASS(uc); + + if (!bc->alloc) { + error_setg(errp, "memory_init is not implemented for type [%s]", + object_get_typename(OBJECT(uc))); + return; + } + + bc->alloc(backend, errp); } MemoryRegion * diff --git a/include/sysemu/hostmem.h b/include/sysemu/hostmem.h index bc3ffb3..4738107 100644 --- a/include/sysemu/hostmem.h +++ b/include/sysemu/hostmem.h @@ -34,6 +34,8 @@ typedef struct HostMemoryBackendClass HostMemoryBackendClass; */ struct HostMemoryBackendClass { ObjectClass parent_class; + + void (*alloc)(HostMemoryBackend *backend, Error **errp); }; /** -- 1.8.5.3