From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53128) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UrmJ0-0006oF-Af for qemu-devel@nongnu.org; Wed, 26 Jun 2013 05:46:32 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UrmIy-0006B1-Rp for qemu-devel@nongnu.org; Wed, 26 Jun 2013 05:46:26 -0400 Received: from mail-qc0-x229.google.com ([2607:f8b0:400d:c01::229]:50481) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UrmIy-0006A6-Go for qemu-devel@nongnu.org; Wed, 26 Jun 2013 05:46:24 -0400 Received: by mail-qc0-f169.google.com with SMTP id c10so8143084qcz.28 for ; Wed, 26 Jun 2013 02:46:24 -0700 (PDT) Sender: Paolo Bonzini Message-ID: <51CAB866.2080507@redhat.com> Date: Wed, 26 Jun 2013 11:46:14 +0200 From: Paolo Bonzini MIME-Version: 1.0 References: <6b5ff346b23fba9a8707507fda7f9b71719a55be.1372234719.git.hutao@cn.fujitsu.com> In-Reply-To: <6b5ff346b23fba9a8707507fda7f9b71719a55be.1372234719.git.hutao@cn.fujitsu.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH v5 05/14] vl: handle "-device dimm" List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Hu Tao Cc: Vasilis Liaskovitis , Bandan Das , qemu-devel@nongnu.org, Wanlong Gao , Eduardo Habkost Il 26/06/2013 11:13, Hu Tao ha scritto: > From: Vasilis Liaskovitis > > Signed-off-by: Vasilis Liaskovitis > Signed-off-by: Hu Tao > --- > vl.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 51 insertions(+) > > diff --git a/vl.c b/vl.c > index 767e020..9d88a79 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 "hw/mem-hotplug/dimm.h" > > //#define DEBUG_NET > //#define DEBUG_SLIRP > @@ -252,6 +253,7 @@ static QTAILQ_HEAD(, FWBootEntry) fw_boot_order = > int nb_numa_nodes; > uint64_t node_mem[MAX_NODES]; > unsigned long *node_cpumask[MAX_NODES]; > +int nb_hp_dimms; > > uint8_t qemu_uuid[16]; > > @@ -2338,6 +2340,50 @@ static int chardev_init_func(QemuOpts *opts, void *opaque) > return 0; > } > > +static int dimmcfg_init_func(QemuOpts *opts, void *opaque) > +{ > + const char *driver; > + const char *id; > + uint64_t node, size; > + uint32_t populated; > + const char *buf, *busbuf; > + > + /* DimmDevice configuration needs to be known in order to initialize chipset > + * with correct memory and pci ranges. But all devices are created after > + * chipset / machine initialization. In * order to avoid this problem, we > + * parse dimm information earlier into dimmcfg structs. */ > + > + driver = qemu_opt_get(opts, "driver"); > + if (!strcmp(driver, "dimm")) { > + > + id = qemu_opts_id(opts); > + buf = qemu_opt_get(opts, "size"); > + parse_option_size("size", buf, &size, NULL); > + buf = qemu_opt_get(opts, "node"); > + parse_option_number("node", buf, &node, NULL); > + busbuf = qemu_opt_get(opts, "bus"); > + buf = qemu_opt_get(opts, "populated"); > + if (!buf) { > + populated = 0; > + } else { > + populated = strcmp(buf, "on") ? 0 : 1; > + } > + > + dimm_config_create((char *)id, size, busbuf ? busbuf : "membus.0", > + node, nb_hp_dimms); > + > + /* if !populated, we just keep the config. The real device > + * will be created in the future with a normal device_add > + * command. */ > + if (!populated) { > + qemu_opts_del(opts); > + } I think you need another option than -device dimm. For example it could be declared together with the NUMA node. This could declare two NUMA nodes, each with 2G of populated and 2G of unpopulated RAM: -numa node,mem-range=0-2G,mem-range-hotplug=4G-6G \ -numa node,mem-range=2G-4G,mem-range-hotplug=6G-8G I'm not sure I like the names particularly though. CCing Eduardo, Bandan and Wanlong Gao. Paolo > + nb_hp_dimms++; > + } > + > + return 0; > +} > + > #ifdef CONFIG_VIRTFS > static int fsdev_init_func(QemuOpts *opts, void *opaque) > { > @@ -4260,6 +4306,11 @@ int main(int argc, char **argv, char **envp) > } > qemu_add_globals(); > > + /* init generic devices */ > + if (qemu_opts_foreach(qemu_find_opts("device"), > + dimmcfg_init_func, NULL, 1) != 0) { > + exit(1); > + } > qdev_machine_init(); > > QEMUMachineInitArgs args = { .ram_size = ram_size, >