From: Igor Mammedov <imammedo@redhat.com>
To: qemu-devel@nongnu.org
Cc: peter.maydell@linaro.org, stefanha@redhat.com, mst@redhat.com,
chegu_vinod@hp.com, stefanb@linux.vnet.ibm.com, mjt@tls.msk.ru,
mdroth@linux.vnet.ibm.com, armbru@redhat.com,
vasilis.liaskovitis@profitbricks.com, quintela@redhat.com,
kraxel@redhat.com, aliguori@amazon.com, hutao@cn.fujitsu.com,
pbonzini@redhat.com, marcel.a@redhat.com, lcapitulino@redhat.com,
afaerber@suse.de
Subject: [Qemu-devel] [PATCH 07/27] add memdev backend infrastructure
Date: Thu, 21 Nov 2013 03:38:28 +0100 [thread overview]
Message-ID: <1385001528-12003-8-git-send-email-imammedo@redhat.com> (raw)
In-Reply-To: <1385001528-12003-1-git-send-email-imammedo@redhat.com>
Provides framework for splitting host RAM allocation/
policies into a separate backend that could be used
by devices. It would allow to separate host specific
options from device model like it's done for netdev & co.
It adds new:
-memdev CLI option and corresponding memdev-add
QMP/HMP commands.
Upon successful command execution an new memdev object
is added to QOM tree into "/backend/memdev" container.
Initially only legacy RAM backend is provided, which
uses memory_region_init_ram() allocator and compatible
with every CLI option that affects memory_region_init_ram().
memdev object is intendend for usage with Dimm device,
example:
-memdev id=m1,size=1G -device dimm,id=dimm1,memdev=m1
Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
backends/Makefile.objs | 2 +
backends/hostmem.c | 275 +++++++++++++++++++++++++++++++++++++++++
backends/hostmem_compat_ram.c | 42 ++++++
hmp-commands.hx | 13 ++
include/sysemu/hostmem.h | 102 +++++++++++++++
monitor.c | 1 +
qapi-schema.json | 18 +++
qemu-options.hx | 7 +
qmp-commands.hx | 27 ++++
vl.c | 14 ++
10 files changed, 501 insertions(+), 0 deletions(-)
create mode 100644 backends/hostmem.c
create mode 100644 backends/hostmem_compat_ram.c
create mode 100644 include/sysemu/hostmem.h
diff --git a/backends/Makefile.objs b/backends/Makefile.objs
index 42557d5..01c4476 100644
--- a/backends/Makefile.objs
+++ b/backends/Makefile.objs
@@ -6,3 +6,5 @@ common-obj-$(CONFIG_BRLAPI) += baum.o
$(obj)/baum.o: QEMU_CFLAGS += $(SDL_CFLAGS)
common-obj-$(CONFIG_TPM) += tpm.o
+
+common-obj-y += hostmem.o hostmem_compat_ram.o
diff --git a/backends/hostmem.c b/backends/hostmem.c
new file mode 100644
index 0000000..9948b63
--- /dev/null
+++ b/backends/hostmem.c
@@ -0,0 +1,275 @@
+/*
+ * QEMU Host Memory Backend
+ *
+ * Copyright (C) 2013 Red Hat Inc
+ *
+ * Authors:
+ * Igor Mammedov <imammedo@redhat.com>
+ *
+ * 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 "sysemu/sysemu.h"
+#include "qapi/visitor.h"
+#include "qapi/qmp/qerror.h"
+#include "qemu/config-file.h"
+
+QemuOptsList qemu_memdev_opts = {
+ .name = "memdev",
+ .implied_opt_name = "type",
+ .head = QTAILQ_HEAD_INITIALIZER(qemu_memdev_opts.head),
+ .desc = {
+ { /* end of list */ }
+ },
+};
+
+static int set_object_prop(const char *name, const char *value, void *opaque)
+{
+ Error *local_err = NULL;
+ Object *obj = OBJECT(opaque);
+
+ object_property_parse(obj, value, name, &local_err);
+ if (error_is_set(&local_err)) {
+ qerror_report_err(local_err);
+ error_free(local_err);
+ return -1;
+ }
+ return 0;
+}
+
+void memdev_add(QemuOpts *opts, Error **errp)
+{
+ Error *local_err = NULL;
+ HostMemoryBackendClass *bc;
+ Object *obj = NULL;
+ ObjectClass *oc;
+ const char *type;
+
+ type = qemu_opt_get(opts, "type");
+ if (!type) {
+ type = TYPE_COMPAT_RAM_MEMORY_BACKEND;
+ }
+
+ oc = object_class_by_name(type);
+ if (!oc) {
+ error_setg(&local_err, "Unknown memdev type: %s", type);
+ goto out;
+ }
+ if (object_class_is_abstract(oc)) {
+ error_setg(&local_err, "Can't create abstract memdev type: %s", type);
+ goto out;
+ }
+
+ obj = object_new(type);
+ if (!object_dynamic_cast(obj, TYPE_MEMORY_BACKEND)) {
+ error_setg(&local_err, "Invalid memdev type: %s", type);
+ goto out;
+ }
+
+ if (qemu_opt_foreach(opts, set_object_prop, obj, true)) {
+ error_setg(&local_err, "failed to create memdev");
+ goto out;
+ }
+ object_property_parse(obj, qemu_opts_id(opts), "id", &local_err);
+ if (error_is_set(&local_err)) {
+ goto out;
+ }
+
+ /* verify properties correctnes and initialize backend */
+ bc = MEMORY_BACKEND_GET_CLASS(obj);
+ if (bc->get_memory) {
+ HostMemoryBackend *backend = MEMORY_BACKEND(obj);
+ if (!bc->get_memory(backend, &local_err)) {
+ goto out;
+ }
+ }
+
+ /* make backend available to the world via QOM tree */
+ object_property_add_child(container_get(qemu_get_backend(), "/memdev"),
+ qemu_opts_id(opts), obj, &local_err);
+
+out:
+ if (error_is_set(&local_err)) {
+ error_propagate(errp, local_err);
+ if (obj) {
+ object_unref(obj);
+ }
+ }
+}
+
+int qmp_memdev_add(Monitor *mon, const QDict *qdict, QObject **ret)
+{
+ Error *local_err = NULL;
+ QemuOptsList *opts_list;
+ QemuOpts *opts = NULL;
+
+ opts_list = qemu_find_opts_err("memdev", &local_err);
+ if (error_is_set(&local_err)) {
+ goto out;
+ }
+
+ opts = qemu_opts_from_qdict(opts_list, qdict, &local_err);
+ if (error_is_set(&local_err)) {
+ goto out;
+ }
+
+ memdev_add(opts, &local_err);
+
+out:
+ if (opts) {
+ qemu_opts_del(opts);
+ }
+ if (error_is_set(&local_err)) {
+ qerror_report_err(local_err);
+ error_free(local_err);
+ return -1;
+ }
+ return 0;
+}
+
+static void
+hostmemory_backend_get_size(Object *obj, Visitor *v, void *opaque,
+ const char *name, Error **errp)
+{
+ HostMemoryBackend *backend = MEMORY_BACKEND(obj);
+ uint64_t value = backend->size;
+
+ visit_type_size(v, &value, name, errp);
+}
+
+static void
+hostmemory_backend_set_size(Object *obj, Visitor *v, void *opaque,
+ const char *name, Error **errp)
+{
+ HostMemoryBackend *backend = MEMORY_BACKEND(obj);
+ uint64_t value;
+
+ visit_type_size(v, &value, name, errp);
+ if (error_is_set(errp)) {
+ return;
+ }
+ if (!value) {
+ error_setg(errp, "Property '%s.%s' doesn't take value '%" PRIu64 "'",
+ object_get_typename(obj), name , value);
+ return;
+ }
+ backend->size = value;
+}
+
+static void
+hostmemory_backend_get_id(Object *obj, Visitor *v, void *opaque,
+ const char *name, Error **errp)
+{
+ HostMemoryBackend *backend = MEMORY_BACKEND(obj);
+
+ visit_type_str(v, &backend->id, name, errp);
+}
+
+static void
+hostmemory_backend_set_id(Object *obj, Visitor *v, void *opaque,
+ const char *name, Error **errp)
+{
+ HostMemoryBackend *backend = MEMORY_BACKEND(obj);
+ Error *local_err = NULL;
+ Object *dup_obj;
+ char *str;
+
+ visit_type_str(v, &str, name, &local_err);
+ if (local_err) {
+ error_propagate(errp, local_err);
+ return;
+ }
+
+ dup_obj = object_resolve_path(str, NULL);
+ if (dup_obj) {
+ error_setg(errp, "Duplicate property [%s.%s] value: '%s'",
+ object_get_typename(obj), name, str);
+ error_propagate(errp, local_err);
+ g_free(str);
+ return;
+ }
+
+ if (backend->id) {
+ g_free(backend->id);
+ }
+ backend->id = str;
+}
+
+static void hostmemory_backend_initfn(Object *obj)
+{
+ object_property_add(obj, "id", "string",
+ hostmemory_backend_get_id,
+ hostmemory_backend_set_id, NULL, NULL, NULL);
+ object_property_add(obj, "size", "int",
+ hostmemory_backend_get_size,
+ hostmemory_backend_set_size, NULL, NULL, NULL);
+}
+
+static void hostmemory_backend_finalize(Object *obj)
+{
+ HostMemoryBackend *backend = MEMORY_BACKEND(obj);
+
+ g_free(backend->id);
+ if (memory_region_size(&backend->mr)) {
+ memory_region_destroy(&backend->mr);
+ }
+}
+
+static void
+hostmemory_backend_memory_init(HostMemoryBackend *backend, Error **errp)
+{
+ error_setg(errp, "memory_init is not implemented for type [%s]",
+ object_get_typename(OBJECT(backend)));
+}
+
+static MemoryRegion *
+hostmemory_backend_get_memory(HostMemoryBackend *backend, Error **errp)
+{
+ HostMemoryBackendClass *bc = MEMORY_BACKEND_GET_CLASS(backend);
+ Object *obj = OBJECT(backend);
+ char *id = backend->id;
+
+ if (!id || (*id == '\0')) {
+ error_setg(errp, "Invalid property [%s.id] value: '%s'",
+ object_get_typename(obj), id ? id : "");
+ return NULL;
+ }
+
+ if (!backend->size) {
+ error_setg(errp, "Invalid property [%s.size] value: %" PRIu64,
+ object_get_typename(obj), backend->size);
+ return NULL;
+ }
+
+ bc->memory_init(backend, errp);
+
+ return memory_region_size(&backend->mr) ? &backend->mr : NULL;
+}
+
+static void
+hostmemory_backend_class_init(ObjectClass *oc, void *data)
+{
+ HostMemoryBackendClass *bc = MEMORY_BACKEND_CLASS(oc);
+
+ bc->memory_init = hostmemory_backend_memory_init;
+ bc->get_memory = hostmemory_backend_get_memory;
+}
+
+static const TypeInfo hostmemory_backend_info = {
+ .name = TYPE_MEMORY_BACKEND,
+ .parent = TYPE_OBJECT,
+ .abstract = true,
+ .class_size = sizeof(HostMemoryBackendClass),
+ .class_init = hostmemory_backend_class_init,
+ .instance_size = sizeof(HostMemoryBackend),
+ .instance_init = hostmemory_backend_initfn,
+ .instance_finalize = hostmemory_backend_finalize,
+};
+
+static void register_types(void)
+{
+ type_register_static(&hostmemory_backend_info);
+}
+
+type_init(register_types);
diff --git a/backends/hostmem_compat_ram.c b/backends/hostmem_compat_ram.c
new file mode 100644
index 0000000..af1bbe0
--- /dev/null
+++ b/backends/hostmem_compat_ram.c
@@ -0,0 +1,42 @@
+/*
+ * QEMU Host Memory Backend
+ *
+ * Copyright (C) 2013 Red Hat Inc
+ *
+ * Authors:
+ * Igor Mammedov <imammedo@redhat.com>
+ *
+ * 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"
+
+static void
+compat_ram_backend_memory_init(HostMemoryBackend *backend, Error **errp)
+{
+ if (!memory_region_size(&backend->mr)) {
+ memory_region_init_ram(&backend->mr, OBJECT(backend),
+ backend->id, backend->size);
+ }
+}
+
+static void
+compat_ram_backend_class_init(ObjectClass *oc, void *data)
+{
+ HostMemoryBackendClass *bc = MEMORY_BACKEND_CLASS(oc);
+
+ bc->memory_init = compat_ram_backend_memory_init;
+}
+
+static const TypeInfo compat_ram_backend_info = {
+ .name = TYPE_COMPAT_RAM_MEMORY_BACKEND,
+ .parent = TYPE_MEMORY_BACKEND,
+ .class_init = compat_ram_backend_class_init,
+};
+
+static void register_types(void)
+{
+ type_register_static(&compat_ram_backend_info);
+}
+
+type_init(register_types);
diff --git a/hmp-commands.hx b/hmp-commands.hx
index caae5ad..4f35ffa 100644
--- a/hmp-commands.hx
+++ b/hmp-commands.hx
@@ -1719,3 +1719,16 @@ ETEXI
STEXI
@end table
ETEXI
+
+ {
+ .name = "memdev-add",
+ .args_type = "memdev:O",
+ .params = "id size",
+ .help = "add host memory",
+ .mhandler.cmd_new = qmp_memdev_add,
+ },
+
+STEXI
+@item memdev-add
+@findex memdev-add
+Add host memory.
diff --git a/include/sysemu/hostmem.h b/include/sysemu/hostmem.h
new file mode 100644
index 0000000..7437712
--- /dev/null
+++ b/include/sysemu/hostmem.h
@@ -0,0 +1,102 @@
+/*
+ * QEMU Host Memory Backend
+ *
+ * Copyright (C) 2013 Red Hat Inc
+ *
+ * Authors:
+ * Igor Mammedov <imammedo@redhat.com>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
+ * See the COPYING file in the top-level directory.
+ */
+#ifndef QEMU_RAM_H
+#define QEMU_RAM_H
+
+#include "qom/object.h"
+#include "qapi/error.h"
+#include "exec/memory.h"
+#include "qemu/option.h"
+
+#define TYPE_MEMORY_BACKEND "host-memory"
+#define MEMORY_BACKEND(obj) \
+ OBJECT_CHECK(HostMemoryBackend, (obj), TYPE_MEMORY_BACKEND)
+#define MEMORY_BACKEND_GET_CLASS(obj) \
+ OBJECT_GET_CLASS(HostMemoryBackendClass, (obj), TYPE_MEMORY_BACKEND)
+#define MEMORY_BACKEND_CLASS(klass) \
+ OBJECT_CLASS_CHECK(HostMemoryBackendClass, (klass), TYPE_MEMORY_BACKEND)
+
+typedef struct HostMemoryBackend HostMemoryBackend;
+typedef struct HostMemoryBackendClass HostMemoryBackendClass;
+
+/**
+ * HostMemoryBackendClass:
+ * @parent_class: opaque parent class container
+ * @memory_init: hook for derived classes to perform memory allocation
+ * @get_memory: get #MemoryRegion backed by @backend and link @backend
+ * with user @uobj to prevent backend disapearing while @uobj exists.
+ * @uobj must have "backend" link property or @get_memory will fail.
+ * retuns: pointer to intialized #MemoryRegion on success or
+ * NULL on failure with error set in errp
+ *
+ */
+struct HostMemoryBackendClass {
+ ObjectClass parent_class;
+
+ void (*memory_init)(HostMemoryBackend *backend, Error **errp);
+ MemoryRegion* (*get_memory)(HostMemoryBackend *backend, Error **errp);
+};
+
+/**
+ * @HostMemoryBackend
+ *
+ * @parent: opaque parent object container
+ * @size: amount of memory backend provides
+ * @id: unique identification string in memdev namespace
+ * @mr: MemoryRegion representing host memory belonging to backend
+ */
+struct HostMemoryBackend {
+ /* private */
+ Object parent;
+
+ /* protected */
+ char *id;
+ uint64_t size;
+
+ MemoryRegion mr;
+};
+
+extern QemuOptsList qemu_memdev_opts;
+
+/**
+ * @qmp_memdev_add:
+ * QMP/HMP memdev-add command handler
+ * returns 0 on success or -1 on failure
+ */
+int qmp_memdev_add(Monitor *mon, const QDict *qdict, QObject **ret);
+
+/**
+ * @memdev_add:
+ * CLI "-memdev" option parser
+ * @opts: options for accossiated with -memdev
+ * @errp: returns an error if this function fails
+ */
+void memdev_add(QemuOpts *opts, Error **errp);
+
+/**
+ * @memdev_name:
+ * @id: backend identification string
+ *
+ * returns backend name in format "memdev[id]",
+ * caller is responsible for freeing returned value.
+ */
+char *memdev_name(const char *id);
+
+/* hostmem_compat_ram.c */
+/**
+ * @TYPE_COMPAT_RAM_MEMORY_BACKEND:
+ * name of backend that uses legacy RAM allocation methods
+ * implemented by #memory_region_init_ram
+ */
+#define TYPE_COMPAT_RAM_MEMORY_BACKEND "compat-ram-host-memory"
+
+#endif
diff --git a/monitor.c b/monitor.c
index 845f608..39b4d8b 100644
--- a/monitor.c
+++ b/monitor.c
@@ -67,6 +67,7 @@
#include "qmp-commands.h"
#include "hmp.h"
#include "qemu/thread.h"
+#include "sysemu/hostmem.h"
/* for pic/irq_info */
#if defined(TARGET_SPARC)
diff --git a/qapi-schema.json b/qapi-schema.json
index 76c98a7..c1a20d2 100644
--- a/qapi-schema.json
+++ b/qapi-schema.json
@@ -4212,3 +4212,21 @@
# Since: 1.7
##
{ 'command': 'blockdev-add', 'data': { 'options': 'BlockdevOptions' } }
+
+##
+# @memdev_add:
+#
+# Add a host memory backend.
+#
+# @id: the name of the new memory backend
+# @size: amount of memory backend should allocate
+# @type: backend type. [default: compat-ram-host-memory]
+#
+# Since: 1.8
+#
+# Returns: Nothing on success
+##
+{ 'command': 'memdev-add',
+ 'data': {'id': 'str', 'size': 'size', '*type': 'str'},
+ 'gen': 'no'
+}
diff --git a/qemu-options.hx b/qemu-options.hx
index fe4559b..314b731 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -3125,3 +3125,10 @@ HXCOMM This is the last statement. Insert new options before this line!
STEXI
@end table
ETEXI
+
+DEF("memdev", HAS_ARG, QEMU_OPTION_memdev,
+ "-memdev [backend-type,]id=str,size=value\n"
+ " add host memory\n"
+ " default backend-type: compat-ram-host-memory\n",
+ QEMU_ARCH_ALL)
+STEXI
diff --git a/qmp-commands.hx b/qmp-commands.hx
index fba15cd..f2a8998 100644
--- a/qmp-commands.hx
+++ b/qmp-commands.hx
@@ -3291,7 +3291,34 @@ Example (2):
}
}
}
+<- { "return": {} }
+
+EQMP
+
+ {
+ .name = "memdev-add",
+ .args_type = "memdev:O",
+ .mhandler.cmd_new = qmp_memdev_add,
+ },
+
+SQMP
+memdev-add
+----------
+
+Add host memory.
+
+Arguments:
+
+- "id": the device's ID, must be unique (json-string)
+- "size": amount of memory backend should allocate (json-int)
+- "type": backend type (json-string, optional), default: compat-ram-host-memory
+
+Example:
+-> { "execute": "memdev-add",
+ "arguments": { "id": "memdev1",
+ "size": "1G",
+ "type": "compat-ram-host-memory" } }
<- { "return": {} }
EQMP
diff --git a/vl.c b/vl.c
index 1de3d57..2e3a5a5 100644
--- a/vl.c
+++ b/vl.c
@@ -170,6 +170,7 @@ int main(int argc, char **argv)
#include "ui/qemu-spice.h"
#include "qapi/string-input-visitor.h"
+#include "sysemu/hostmem.h"
//#define DEBUG_NET
//#define DEBUG_SLIRP
@@ -2929,6 +2930,7 @@ int main(int argc, char **argv, char **envp)
qemu_add_opts(&qemu_realtime_opts);
qemu_add_opts(&qemu_msg_opts);
qemu_add_opts(&qemu_mem_opts);
+ qemu_add_opts(&qemu_memdev_opts);
runstate_init();
@@ -3859,6 +3861,18 @@ int main(int argc, char **argv, char **envp)
}
configure_msg(opts);
break;
+ case QEMU_OPTION_memdev:
+ {
+ Error *local_err = NULL;
+ opts = qemu_opts_parse(qemu_find_opts("memdev"), optarg, 1);
+ memdev_add(opts, &local_err);
+ if (error_is_set(&local_err)) {
+ qerror_report_err(local_err);
+ error_free(local_err);
+ exit(1);
+ }
+ break;
+ }
default:
os_parse_cmd_args(popt->index, optarg);
}
--
1.7.1
next prev parent reply other threads:[~2013-11-21 2:40 UTC|newest]
Thread overview: 143+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-11-21 2:38 [Qemu-devel] [PATCH 00/27 RFC v7] ACPI memory hotplug Igor Mammedov
2013-11-21 2:38 ` [Qemu-devel] [PATCH 01/27] acpi: factor out common pm_update_sci() into acpi core Igor Mammedov
2013-12-05 12:37 ` Michael S. Tsirkin
2013-12-05 15:11 ` Igor Mammedov
2013-11-21 2:38 ` [Qemu-devel] [PATCH 02/27] rename pci_hotplug_fn to hotplug_fn and make it available for other devices Igor Mammedov
2013-11-25 12:49 ` Paolo Bonzini
2013-11-25 13:11 ` Paolo Bonzini
2013-11-25 15:57 ` Igor Mammedov
2013-11-21 2:38 ` [Qemu-devel] [PATCH 03/27] pc: add 'etc/reserved-memory-end' fw_cfg interface for SeaBIOS Igor Mammedov
2013-12-19 14:35 ` Michael S. Tsirkin
2013-12-20 12:48 ` Igor Mammedov
2013-12-22 11:20 ` Michael S. Tsirkin
2013-11-21 2:38 ` [Qemu-devel] [PATCH 04/27] vl: convert -m to qemu_opts_parse() Igor Mammedov
2013-11-21 6:01 ` Li Guang
2013-11-21 13:45 ` Igor Mammedov
2013-11-21 10:12 ` Markus Armbruster
2013-11-26 13:17 ` Igor Mammedov
2013-11-26 14:49 ` Markus Armbruster
2013-11-26 16:55 ` Igor Mammedov
2013-11-27 14:35 ` Markus Armbruster
2013-11-27 15:28 ` Igor Mammedov
2013-11-27 17:31 ` Markus Armbruster
2013-11-27 0:27 ` [Qemu-devel] [PATCH 04/28] vl: convert -m to QemuOpts Igor Mammedov
2013-11-27 0:27 ` [Qemu-devel] [PATCH 05/28] vl.c: extend -m option to support options for memory hotplug Igor Mammedov
2013-12-10 7:23 ` [Qemu-devel] [PATCH 04/28] vl: convert -m to QemuOpts Paolo Bonzini
2013-12-10 10:53 ` Igor Mammedov
2013-11-25 12:51 ` [Qemu-devel] [PATCH 04/27] vl: convert -m to qemu_opts_parse() Paolo Bonzini
2013-11-27 0:32 ` Igor Mammedov
2013-11-21 2:38 ` [Qemu-devel] [PATCH 05/27] qapi: add SIZE type parser to string_input_visitor Igor Mammedov
2013-11-21 10:15 ` Markus Armbruster
2013-11-25 15:36 ` Igor Mammedov
2013-11-25 16:04 ` Michael S. Tsirkin
2013-11-25 16:32 ` Paolo Bonzini
2013-11-25 16:43 ` Eric Blake
2013-11-25 17:01 ` Paolo Bonzini
2013-11-27 14:15 ` Markus Armbruster
2013-11-27 15:17 ` Paolo Bonzini
2013-11-27 17:02 ` Markus Armbruster
2013-11-27 17:10 ` Paolo Bonzini
2013-12-19 14:40 ` Michael S. Tsirkin
2013-12-19 15:14 ` Markus Armbruster
2013-12-19 15:32 ` Michael S. Tsirkin
2013-12-19 15:31 ` Paolo Bonzini
2013-12-19 15:40 ` Michael S. Tsirkin
2013-12-19 15:46 ` Paolo Bonzini
2013-11-21 2:38 ` [Qemu-devel] [PATCH 06/27] get reference to /backend container via qemu_get_backend() Igor Mammedov
2013-11-21 2:38 ` Igor Mammedov [this message]
2013-11-25 12:54 ` [Qemu-devel] [PATCH 07/27] add memdev backend infrastructure Paolo Bonzini
2013-11-25 16:01 ` Igor Mammedov
2013-11-25 16:09 ` Paolo Bonzini
2013-11-27 14:37 ` Igor Mammedov
2013-11-27 15:21 ` Paolo Bonzini
2013-11-27 15:57 ` Igor Mammedov
2013-11-27 15:25 ` Eric Blake
2013-11-27 16:09 ` Igor Mammedov
2013-11-21 2:38 ` [Qemu-devel] [PATCH 08/27] dimm: implement dimm device abstraction Igor Mammedov
2013-11-25 12:57 ` Paolo Bonzini
2013-11-25 15:10 ` Igor Mammedov
2013-11-25 15:16 ` Paolo Bonzini
2013-11-21 2:38 ` [Qemu-devel] [PATCH 09/27] dimm: map DimmDevice into DimBus provided address space Igor Mammedov
2013-11-21 2:38 ` [Qemu-devel] [PATCH 10/27] dimm: add busy slot check and slot auto-allocation Igor Mammedov
2013-11-21 2:38 ` [Qemu-devel] [PATCH 11/27] dimm: add busy address check and address auto-allocation Igor Mammedov
2013-11-21 2:38 ` [Qemu-devel] [PATCH 12/27] dimm: add hotplug callback to DimmBus Igor Mammedov
2013-11-25 13:01 ` Paolo Bonzini
2013-11-25 14:40 ` Igor Mammedov
2013-11-21 2:38 ` [Qemu-devel] [PATCH 13/27] acpi: memory hotplug ACPI hardware implementation Igor Mammedov
2013-11-21 9:42 ` Michael S. Tsirkin
2013-11-21 14:21 ` Igor Mammedov
2013-11-21 14:38 ` Michael S. Tsirkin
2013-11-22 17:14 ` Igor Mammedov
2013-11-24 10:58 ` Michael S. Tsirkin
2013-11-25 7:27 ` Markus Armbruster
2013-11-25 13:45 ` Paolo Bonzini
2013-11-25 14:18 ` Igor Mammedov
2013-11-25 14:31 ` Paolo Bonzini
2013-11-25 14:57 ` Igor Mammedov
2013-11-25 13:56 ` Igor Mammedov
2013-11-27 17:59 ` Eric Blake
2013-11-21 2:38 ` [Qemu-devel] [PATCH 14/27] acpi: initialize memory hotplug ACPI PIIX4 hardware Igor Mammedov
2013-11-21 2:38 ` [Qemu-devel] [PATCH 15/27] acpi: piix4: add memory-hotplug-io-base property to piix4_pm Igor Mammedov
2013-11-21 2:38 ` [Qemu-devel] [PATCH 16/27] acpi: ich9: allow guest to clear SCI rised by GPE Igor Mammedov
2013-11-21 7:14 ` Michael S. Tsirkin
2013-11-21 8:12 ` Hu Tao
2013-11-21 8:18 ` Li Guang
2013-11-21 8:29 ` Michael S. Tsirkin
2013-11-21 8:32 ` Li Guang
2013-11-21 9:43 ` Michael S. Tsirkin
2013-11-22 0:57 ` Li Guang
2013-11-25 11:13 ` Igor Mammedov
2013-11-26 0:29 ` Li Guang
2013-11-26 22:36 ` Igor Mammedov
2013-11-27 0:15 ` Li Guang
2013-11-27 0:57 ` Igor Mammedov
2013-11-27 1:48 ` Li Guang
2013-11-27 9:43 ` Paolo Bonzini
2013-11-21 13:19 ` Igor Mammedov
2013-11-22 1:03 ` Li Guang
2013-11-21 8:26 ` Michael S. Tsirkin
2013-11-21 8:28 ` Hu Tao
2013-11-21 13:31 ` Igor Mammedov
2013-11-21 13:21 ` Igor Mammedov
2013-11-21 2:38 ` [Qemu-devel] [PATCH 17/27] acpi: initialize memory hotplug ACPI ICH9 hardware Igor Mammedov
2013-11-21 2:38 ` [Qemu-devel] [PATCH 18/27] acpi: ich9: add memory-hotplug-io-base property to ich9_pm Igor Mammedov
2013-11-21 2:38 ` [Qemu-devel] [PATCH 19/27] acpi: piix4/ich9: add optional vmstate field for MemHotplugState migration Igor Mammedov
2013-11-21 2:38 ` [Qemu-devel] [PATCH 20/27] pc: piix: make PCII440FXState type public Igor Mammedov
2013-11-21 2:38 ` [Qemu-devel] [PATCH 21/27] pc: add memory hotplug 440fx machine Igor Mammedov
2013-11-21 5:48 ` Li Guang
2013-11-21 14:13 ` Andreas Färber
2013-11-21 14:34 ` Igor Mammedov
2013-11-21 14:39 ` Michael S. Tsirkin
2013-11-21 16:09 ` Andreas Färber
2013-11-21 16:17 ` Michael S. Tsirkin
2013-11-25 10:41 ` Igor Mammedov
2013-11-25 17:00 ` Andreas Färber
2013-11-26 20:26 ` Igor Mammedov
2013-11-22 14:23 ` Gerd Hoffmann
2013-11-25 11:00 ` Igor Mammedov
2013-11-25 11:39 ` Gerd Hoffmann
2013-11-25 13:34 ` Igor Mammedov
2013-11-25 13:35 ` Paolo Bonzini
2013-11-25 14:24 ` Igor Mammedov
2013-11-21 2:38 ` [Qemu-devel] [PATCH 22/27] pc: add memory hotplug Q35 machine Igor Mammedov
2013-11-21 2:38 ` [Qemu-devel] [PATCH 23/27] pc: ACPI BIOS: implement memory hotplug interface Igor Mammedov
2013-11-21 9:37 ` Michael S. Tsirkin
2013-11-25 14:39 ` Igor Mammedov
2013-12-16 19:50 ` Michael S. Tsirkin
2013-12-16 21:42 ` Igor Mammedov
2013-11-25 13:42 ` Paolo Bonzini
2013-11-25 14:26 ` Igor Mammedov
2013-11-21 2:38 ` [Qemu-devel] [PATCH 24/27] pc: ACPI BIOS: add ssdt-mem.hex.generated and update ssdt-misc.hex.generated Igor Mammedov
2013-11-21 2:38 ` [Qemu-devel] [PATCH 25/27] pc: ACPI BIOS: use enum for defining memory affinity flags Igor Mammedov
2013-11-21 7:20 ` Michael S. Tsirkin
2013-11-25 10:11 ` Igor Mammedov
2013-11-21 2:38 ` [Qemu-devel] [PATCH 26/27] pc: ACPI BIOS: reserve SRAT entry for hotplug mem hole Igor Mammedov
2013-11-21 7:18 ` Michael S. Tsirkin
2013-11-25 10:11 ` Igor Mammedov
2013-11-21 2:38 ` [Qemu-devel] [PATCH 27/27] pc: ACPI BIOS: make GPE.3 handle memory hotplug event on PIIX and Q35 machines Igor Mammedov
2013-11-21 6:20 ` [Qemu-devel] [PATCH 00/27 RFC v7] ACPI memory hotplug Michael S. Tsirkin
2013-11-21 13:39 ` Igor Mammedov
2013-11-21 13:43 ` Michael S. Tsirkin
2013-11-21 14:37 ` Igor Mammedov
2013-11-21 14:45 ` Michael S. Tsirkin
2013-11-25 10:09 ` Igor Mammedov
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1385001528-12003-8-git-send-email-imammedo@redhat.com \
--to=imammedo@redhat.com \
--cc=afaerber@suse.de \
--cc=aliguori@amazon.com \
--cc=armbru@redhat.com \
--cc=chegu_vinod@hp.com \
--cc=hutao@cn.fujitsu.com \
--cc=kraxel@redhat.com \
--cc=lcapitulino@redhat.com \
--cc=marcel.a@redhat.com \
--cc=mdroth@linux.vnet.ibm.com \
--cc=mjt@tls.msk.ru \
--cc=mst@redhat.com \
--cc=pbonzini@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=quintela@redhat.com \
--cc=stefanb@linux.vnet.ibm.com \
--cc=stefanha@redhat.com \
--cc=vasilis.liaskovitis@profitbricks.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).