On Thu, 4 Jul 2013 17:53:17 +0800 Wanlong Gao <gaowanl...@cn.fujitsu.com> wrote:
> Show host memory policy of nodes in the info numa monitor command. > After this patch, the monitor command "info numa" will show the > information like following if the host numa support is enabled: As you're adding a QMP command to set the policy, wouldn't it make sense to convert info numa to QMP so that we also have query-numa? > > (qemu) info numa > 2 nodes > node 0 cpus: 0 > node 0 size: 1024 MB > node 0 mempolicy: membind=0,1 > node 1 cpus: 1 > node 1 size: 1024 MB > node 1 mempolicy: interleave=1 > > Signed-off-by: Wanlong Gao <gaowanl...@cn.fujitsu.com> > --- > monitor.c | 42 ++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 42 insertions(+) > > diff --git a/monitor.c b/monitor.c > index 93ac045..a40415d 100644 > --- a/monitor.c > +++ b/monitor.c > @@ -74,6 +74,11 @@ > #endif > #include "hw/lm32/lm32_pic.h" > > +#ifdef CONFIG_NUMA > +#include <numa.h> > +#include <numaif.h> > +#endif > + > //#define DEBUG > //#define DEBUG_COMPLETION > > @@ -1808,6 +1813,7 @@ static void do_info_numa(Monitor *mon, const QDict > *qdict) > int i; > CPUArchState *env; > CPUState *cpu; > + unsigned long first, next; > > monitor_printf(mon, "%d nodes\n", nb_numa_nodes); > for (i = 0; i < nb_numa_nodes; i++) { > @@ -1821,6 +1827,42 @@ static void do_info_numa(Monitor *mon, const QDict > *qdict) > monitor_printf(mon, "\n"); > monitor_printf(mon, "node %d size: %" PRId64 " MB\n", i, > numa_info[i].node_mem >> 20); > + > +#ifdef CONFIG_NUMA > + monitor_printf(mon, "node %d mempolicy: ", i); > + switch (numa_info[i].flags & NODE_HOST_POLICY_MASK) { > + case NODE_HOST_BIND: > + monitor_printf(mon, "membind="); > + break; > + case NODE_HOST_INTERLEAVE: > + monitor_printf(mon, "interleave="); > + break; > + case NODE_HOST_PREFERRED: > + monitor_printf(mon, "preferred="); > + break; > + default: > + monitor_printf(mon, "default\n"); > + continue; > + } > + > + if (numa_info[i].flags & NODE_HOST_RELATIVE) > + monitor_printf(mon, "+"); > + > + next = first = find_first_bit(numa_info[i].host_mem, > MAX_CPUMASK_BITS); > + monitor_printf(mon, "%lu", first); > + do { > + if (next == numa_max_node()) > + break; > + next = find_next_bit(numa_info[i].host_mem, MAX_CPUMASK_BITS, > + next + 1); > + if (next > numa_max_node() || next == MAX_CPUMASK_BITS) > + break; > + > + monitor_printf(mon, ",%lu", next); > + } while (true); > + > + monitor_printf(mon, "\n"); > +#endif > } > } >