Re: [Qemu-devel] [PATCH V4 10/10] NUMA: show host memory policy info in info numa command

2013-07-08 Thread Luiz Capitulino
On Thu, 4 Jul 2013 17:53:17 +0800
Wanlong Gao  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 
> ---
>  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 
> +#include 
> +#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
>  }
>  }
>  




Re: [Qemu-devel] [PATCH V4 10/10] NUMA: show host memory policy info in info numa command

2013-07-05 Thread Eduardo Habkost
On Thu, Jul 04, 2013 at 05:53:17PM +0800, Wanlong Gao 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:
> 
> (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 
> ---
>  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 
> +#include 
> +#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;

This breaks compilation with --enable-werror and CONFIG_NUMA disabled:

/home/ehabkost/rh/proj/virt/qemu/monitor.c: In function ‘do_info_numa’:
/home/ehabkost/rh/proj/virt/qemu/monitor.c:1816:26: error: unused variable 
‘next’ [-Werror=unused-variable]
/home/ehabkost/rh/proj/virt/qemu/monitor.c:1816:19: error: unused variable 
‘first’ [-Werror=unused-variable]
cc1: all warnings being treated as errors
make[1]: *** [monitor.o] Error 1

>  
>  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
>  }
>  }
>  
> -- 
> 1.8.3.2.634.g7a3187e
> 
> 

-- 
Eduardo



[Qemu-devel] [PATCH V4 10/10] NUMA: show host memory policy info in info numa command

2013-07-04 Thread Wanlong Gao
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:

(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 
---
 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 
+#include 
+#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
 }
 }
 
-- 
1.8.3.2.634.g7a3187e