From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:56303) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Wtxp4-0004pZ-59 for qemu-devel@nongnu.org; Mon, 09 Jun 2014 07:33:10 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Wtxoz-0006QX-Gu for qemu-devel@nongnu.org; Mon, 09 Jun 2014 07:33:06 -0400 Received: from mx1.redhat.com ([209.132.183.28]:42262) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Wtxoz-0006Px-8g for qemu-devel@nongnu.org; Mon, 09 Jun 2014 07:33:01 -0400 Date: Mon, 9 Jun 2014 13:32:46 +0200 From: Igor Mammedov Message-ID: <20140609133246.286d749c@thinkpad> In-Reply-To: <988dc97c3b3e3c89066b3b3dc8c17b3fccc3c816.1402299637.git.hutao@cn.fujitsu.com> References: <988dc97c3b3e3c89066b3b3dc8c17b3fccc3c816.1402299637.git.hutao@cn.fujitsu.com> MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH v4 18/29] hostmem: add file-based HostMemoryBackend List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Hu Tao Cc: Yasunori Goto , Paolo Bonzini , "Michael S. Tsirkin" , qemu-devel@nongnu.org, Eduardo Habkost On Mon, 9 Jun 2014 18:25:23 +0800 Hu Tao wrote: > From: Paolo Bonzini > > Signed-off-by: Paolo Bonzini > Signed-off-by: Hu Tao > --- > backends/Makefile.objs | 1 + > backends/hostmem-file.c | 107 ++++++++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 108 insertions(+) > create mode 100644 backends/hostmem-file.c > > diff --git a/backends/Makefile.objs b/backends/Makefile.objs > index 7fb7acd..506a46c 100644 > --- a/backends/Makefile.objs > +++ b/backends/Makefile.objs > @@ -8,3 +8,4 @@ baum.o-cflags := $(SDL_CFLAGS) > common-obj-$(CONFIG_TPM) += tpm.o > > common-obj-y += hostmem.o hostmem-ram.o > +common-obj-$(CONFIG_LINUX) += hostmem-file.o > diff --git a/backends/hostmem-file.c b/backends/hostmem-file.c > new file mode 100644 > index 0000000..b8df933 > --- /dev/null > +++ b/backends/hostmem-file.c > @@ -0,0 +1,107 @@ > +/* > + * QEMU Host Memory Backend for hugetlbfs > + * > + * Copyright (C) 2013 Red Hat Inc > + * > + * Authors: > + * Paolo Bonzini > + * > + * This work is licensed under the terms of the GNU GPL, version 2 or later. > + * See the COPYING file in the top-level directory. > + */ > +#include "sysemu/hostmem.h" > +#include "qom/object_interfaces.h" > + > +/* hostmem-file.c */ > +/** > + * @TYPE_MEMORY_BACKEND_FILE: > + * name of backend that uses mmap on a file descriptor > + */ > +#define TYPE_MEMORY_BACKEND_FILE "memory-backend-file" how about naming it after what it really is? "memory-backend-hugepage" Later we could split it into generic superclass mmap-ed "memory-backend-file" and have TPH specific code moved into this backend. > + > +#define MEMORY_BACKEND_FILE(obj) \ > + OBJECT_CHECK(HostMemoryBackendFile, (obj), TYPE_MEMORY_BACKEND_FILE) > + > +typedef struct HostMemoryBackendFile HostMemoryBackendFile; > + > +struct HostMemoryBackendFile { > + HostMemoryBackend parent_obj; > + char *mem_path; > +}; > + > +static void > +file_backend_memory_alloc(HostMemoryBackend *backend, Error **errp) > +{ > + HostMemoryBackendFile *fb = MEMORY_BACKEND_FILE(backend); > + > + if (!backend->size) { > + error_setg(errp, "can't create backend with size 0"); > + return; > + } > + if (!fb->mem_path) { > + error_setg(errp, "mem-path property not set"); > + return; > + } > +#ifndef CONFIG_LINUX > + error_setg(errp, "-mem-path not supported on this host"); Is it possible to not compile this backend on non linux host at all, instead of ifdefs. > +#else > + if (!memory_region_size(&backend->mr)) { > + memory_region_init_ram_from_file(&backend->mr, OBJECT(backend), > + object_get_canonical_path(OBJECT(backend)), > + backend->size, > + fb->mem_path, errp); > + } > +#endif > +} > + > +static void > +file_backend_class_init(ObjectClass *oc, void *data) > +{ > + HostMemoryBackendClass *bc = MEMORY_BACKEND_CLASS(oc); > + > + bc->alloc = file_backend_memory_alloc; > +} > + > +static char *get_mem_path(Object *o, Error **errp) > +{ > + HostMemoryBackendFile *fb = MEMORY_BACKEND_FILE(o); > + > + return g_strdup(fb->mem_path); > +} > + > +static void set_mem_path(Object *o, const char *str, Error **errp) > +{ > + HostMemoryBackend *backend = MEMORY_BACKEND(o); > + HostMemoryBackendFile *fb = MEMORY_BACKEND_FILE(o); > + > + if (memory_region_size(&backend->mr)) { > + error_setg(errp, "cannot change property value"); > + return; > + } > + if (fb->mem_path) { > + g_free(fb->mem_path); > + } > + fb->mem_path = g_strdup(str); > +} > + > +static void > +file_backend_instance_init(Object *o) > +{ > + object_property_add_str(o, "mem-path", get_mem_path, > + set_mem_path, NULL); s/"mem-path"/"path"/ > +} > + > +static const TypeInfo file_backend_info = { > + .name = TYPE_MEMORY_BACKEND_FILE, > + .parent = TYPE_MEMORY_BACKEND, > + .class_init = file_backend_class_init, > + .instance_init = file_backend_instance_init, > + .instance_size = sizeof(HostMemoryBackendFile), > +}; > + > +static void register_types(void) > +{ > + type_register_static(&file_backend_info); > +} > + > +type_init(register_types); > -- > 1.9.3 > -- Regards, Igor