On Tue, Dec 18, 2012 at 12:41 PM, Vasilis Liaskovitis <vasilis.liaskovi...@profitbricks.com> wrote: > Returns total physical memory available to guest in bytes, including > hotplugged > memory. Note that the number reported here may be different from what the > guest > sees e.g. if the guest has not logically onlined hotplugged memory. > > This functionality is provided independently of a balloon device, since a > guest can be using ACPI memory hotplug without using a balloon device. > > v3->v4: Moved qmp command implementation to vl.c. This prevents a circular > header dependency problem. > > Signed-off-by: Vasilis Liaskovitis <vasilis.liaskovi...@profitbricks.com> > --- > hmp-commands.hx | 2 ++ > hmp.c | 7 +++++++ > hmp.h | 1 + > hw/dimm.c | 14 ++++++++++++++ > hw/dimm.h | 1 + > monitor.c | 7 +++++++ > qapi-schema.json | 11 +++++++++++ > qmp-commands.hx | 20 ++++++++++++++++++++ > vl.c | 9 +++++++++ > 9 files changed, 72 insertions(+), 0 deletions(-) > > diff --git a/hmp-commands.hx b/hmp-commands.hx > index 010b8c9..3fbd975 100644 > --- a/hmp-commands.hx > +++ b/hmp-commands.hx > @@ -1570,6 +1570,8 @@ show device tree > show qdev device model list > @item info roms > show roms > +@item info memory-total > +show memory-total > @end table > ETEXI > > diff --git a/hmp.c b/hmp.c > index 180ba2b..fb39b0d 100644 > --- a/hmp.c > +++ b/hmp.c > @@ -628,6 +628,13 @@ void hmp_info_block_jobs(Monitor *mon) > } > } > > +void hmp_info_memory_total(Monitor *mon) > +{ > + uint64_t ram_total; > + ram_total = (uint64_t)qmp_query_memory_total(NULL); > + monitor_printf(mon, "MemTotal: %lu\n", ram_total);
Wrong format on 32 bit hosts, please use PRIu64. > +} > + > void hmp_quit(Monitor *mon, const QDict *qdict) > { > monitor_suspend(mon); > diff --git a/hmp.h b/hmp.h > index 0ab03be..25a3a70 100644 > --- a/hmp.h > +++ b/hmp.h > @@ -36,6 +36,7 @@ void hmp_info_spice(Monitor *mon); > void hmp_info_balloon(Monitor *mon); > void hmp_info_pci(Monitor *mon); > void hmp_info_block_jobs(Monitor *mon); > +void hmp_info_memory_total(Monitor *mon); > void hmp_quit(Monitor *mon, const QDict *qdict); > void hmp_stop(Monitor *mon, const QDict *qdict); > void hmp_system_reset(Monitor *mon, const QDict *qdict); > diff --git a/hw/dimm.c b/hw/dimm.c > index e384952..f181e54 100644 > --- a/hw/dimm.c > +++ b/hw/dimm.c > @@ -189,6 +189,20 @@ void dimm_setup_fwcfg_layout(uint64_t *fw_cfg_slots) > } > } > > +uint64_t get_hp_memory_total(void) > +{ > + DimmBus *bus; > + DimmDevice *slot; > + uint64_t info = 0; > + > + QLIST_FOREACH(bus, &memory_buses, next) { > + QTAILQ_FOREACH(slot, &bus->dimmlist, nextdimm) { > + info += slot->size; > + } > + } > + return info; > +} > + > static int dimm_init(DeviceState *s) > { > DimmBus *bus = DIMM_BUS(qdev_get_parent_bus(s)); > diff --git a/hw/dimm.h b/hw/dimm.h > index 75a6911..5130b2c 100644 > --- a/hw/dimm.h > +++ b/hw/dimm.h > @@ -85,5 +85,6 @@ DimmBus *dimm_bus_create(Object *parent, const char *name, > uint32_t max_dimms, > dimm_calcoffset_fn pmc_set_offset); > void dimm_config_create(char *id, uint64_t size, const char *bus, uint64_t > node, > uint32_t dimm_idx, uint32_t populated); > +uint64_t get_hp_memory_total(void); > > #endif > diff --git a/monitor.c b/monitor.c > index c0e32d6..6e87d0d 100644 > --- a/monitor.c > +++ b/monitor.c > @@ -2708,6 +2708,13 @@ static mon_cmd_t info_cmds[] = { > .mhandler.info = hmp_info_balloon, > }, > { > + .name = "memory-total", > + .args_type = "", > + .params = "", > + .help = "show total memory size", > + .mhandler.info = hmp_info_memory_total, > + }, > + { > .name = "qtree", > .args_type = "", > .params = "", > diff --git a/qapi-schema.json b/qapi-schema.json > index 5dfa052..33f88d6 100644 > --- a/qapi-schema.json > +++ b/qapi-schema.json > @@ -2903,6 +2903,17 @@ > { 'command': 'query-target', 'returns': 'TargetInfo' } > > ## > +# @query-memory-total: > +# > +# Returns total memory in bytes, including hotplugged dimms > +# > +# Returns: int > +# > +# Since: 1.4 > +## > +{ 'command': 'query-memory-total', 'returns': 'int' } > + > +## > # @QKeyCode: > # > # An enumeration of key name. > diff --git a/qmp-commands.hx b/qmp-commands.hx > index 5c692d0..a99117a 100644 > --- a/qmp-commands.hx > +++ b/qmp-commands.hx > @@ -2654,3 +2654,23 @@ EQMP > .args_type = "", > .mhandler.cmd_new = qmp_marshal_input_query_target, > }, > + > + { > + .name = "query-memory-total", > + .args_type = "", > + .mhandler.cmd_new = qmp_marshal_input_query_memory_total > + }, > +SQMP > +query-memory-total > +---------- > + > +Return total memory in bytes, including hotplugged dimms > + > +Example: > + > +-> { "execute": "query-memory-total" } > +<- { > + "return": 1073741824 > + } > + > +EQMP > diff --git a/vl.c b/vl.c > index 8406933..80803c5 100644 > --- a/vl.c > +++ b/vl.c > @@ -126,6 +126,7 @@ int main(int argc, char **argv) > #include "hw/xen.h" > #include "hw/qdev.h" > #include "hw/loader.h" > +#include "hw/dimm.h" > #include "bt-host.h" > #include "net.h" > #include "net/slirp.h" > @@ -442,6 +443,14 @@ StatusInfo *qmp_query_status(Error **errp) > return info; > } > > +int64_t qmp_query_memory_total(Error **errp) > +{ > + uint64_t info; > + info = ram_size + get_hp_memory_total(); > + > + return (int64_t)info; > +} > + > /***********************************************************/ > /* real time host monotonic timer */ > > -- > 1.7.9 >