From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:56686) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VJO0B-0002mo-95 for qemu-devel@nongnu.org; Tue, 10 Sep 2013 09:29:12 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1VJO02-0004Ts-Me for qemu-devel@nongnu.org; Tue, 10 Sep 2013 09:29:07 -0400 Received: from mx1.redhat.com ([209.132.183.28]:33312) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VJO02-0004Td-EV for qemu-devel@nongnu.org; Tue, 10 Sep 2013 09:28:58 -0400 Date: Mon, 9 Sep 2013 17:02:57 -0400 From: Luiz Capitulino Message-ID: <20130909170257.49ce7916@redhat.com> In-Reply-To: <1378285422-7361-11-git-send-email-gaowanlong@cn.fujitsu.com> References: <1378285422-7361-1-git-send-email-gaowanlong@cn.fujitsu.com> <1378285422-7361-11-git-send-email-gaowanlong@cn.fujitsu.com> Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH V12 10/13] NUMA: add qmp command set-mem-policy to set memory policy for NUMA node List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Wanlong Gao Cc: aliguori@us.ibm.com, ehabkost@redhat.com, lersek@redhat.com, qemu-devel@nongnu.org, peter.huangpeng@huawei.com, drjones@redhat.com, bsd@redhat.com, hutao@cn.fujitsu.com, y-goto@jp.fujitsu.com, pbonzini@redhat.com, afaerber@suse.de On Wed, 4 Sep 2013 17:03:39 +0800 Wanlong Gao wrote: > This QMP command allows user set guest node's memory policy > through the QMP protocol. The qmp-shell command is like: > set-mem-policy nodeid=0 policy=membind relative=true host-nodes=0-1 > > Signed-off-by: Wanlong Gao QMP part looks good: Reviewed-by: Luiz Capitulino > --- > numa.c | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > qapi-schema.json | 21 ++++++++++++++++++ > qmp-commands.hx | 41 +++++++++++++++++++++++++++++++++++ > 3 files changed, 128 insertions(+) > > diff --git a/numa.c b/numa.c > index 915a67a..19ee7f7 100644 > --- a/numa.c > +++ b/numa.c > @@ -28,6 +28,7 @@ > #include "qapi/opts-visitor.h" > #include "qapi/dealloc-visitor.h" > #include "exec/memory.h" > +#include "qmp-commands.h" > > #ifdef __linux__ > #include > @@ -327,3 +328,68 @@ void set_numa_modes(void) > } > } > } > + > +void qmp_set_mem_policy(uint16_t nodeid, bool has_policy, NumaNodePolicy policy, > + bool has_relative, bool relative, > + bool has_host_nodes, uint16List *host_nodes, > + Error **errp) > +{ > + NumaNodePolicy old_policy; > + bool old_relative; > + DECLARE_BITMAP(host_mem, MAX_NODES); > + uint16List *nodes; > + > + if (nodeid >= nb_numa_nodes) { > + error_setg(errp, "Only has '%d' NUMA nodes", nb_numa_nodes); > + return; > + } > + > + bitmap_copy(host_mem, numa_info[nodeid].host_mem, MAX_NODES); > + old_policy = numa_info[nodeid].policy; > + old_relative = numa_info[nodeid].relative; > + > + numa_info[nodeid].policy = NUMA_NODE_POLICY_DEFAULT; > + numa_info[nodeid].relative = false; > + bitmap_zero(numa_info[nodeid].host_mem, MAX_NODES); > + > + if (!has_policy) { > + if (set_node_mem_policy(nodeid) == -1) { > + error_setg(errp, "Failed to set memory policy for node%" PRIu16, > + nodeid); > + goto error; > + } > + return; > + } > + > + numa_info[nodeid].policy = policy; > + > + if (has_relative) { > + numa_info[nodeid].relative = relative; > + } > + > + if (!has_host_nodes) { > + bitmap_empty(numa_info[nodeid].host_mem, MAX_NODES); > + bitmap_set(numa_info[nodeid].host_mem, 0, 1); > + } > + > + for (nodes = host_nodes; nodes; nodes = nodes->next) { > + if (nodes->value > MAX_NODES) { > + continue; > + } > + bitmap_set(numa_info[nodeid].host_mem, nodes->value, 1); > + } > + > + if (set_node_mem_policy(nodeid) == -1) { > + error_setg(errp, "Failed to set memory policy for node%" PRIu16, > + nodeid); > + goto error; > + } > + > + return; > + > +error: > + bitmap_copy(numa_info[nodeid].host_mem, host_mem, MAX_NODES); > + numa_info[nodeid].policy = old_policy; > + numa_info[nodeid].relative = old_relative; > + return; > +} > diff --git a/qapi-schema.json b/qapi-schema.json > index 2fba592..7a8cf6a 100644 > --- a/qapi-schema.json > +++ b/qapi-schema.json > @@ -3849,3 +3849,24 @@ > '*policy': 'NumaNodePolicy', > '*relative': 'bool', > '*host-nodes': ['uint16'] }} > + > +## > +# @set-mem-policy: > +# > +# Set the host memory binding policy for guest NUMA node. > +# > +# @nodeid: The node ID of guest NUMA node to set memory policy to. > +# > +# @policy: #optional The memory policy to be set (default 'default'). > +# > +# @relative: #optional If the specified nodes are relative (default 'false') > +# > +# @host-nodes: #optional The host nodes range for memory policy. > +# > +# Returns: Nothing on success > +# > +# Since: 1.7 > +## > +{ 'command': 'set-mem-policy', > + 'data': {'nodeid': 'uint16', '*policy': 'NumaNodePolicy', > + '*relative': 'bool', '*host-nodes': ['uint16'] } } > diff --git a/qmp-commands.hx b/qmp-commands.hx > index 8a8f342..67a9dd2 100644 > --- a/qmp-commands.hx > +++ b/qmp-commands.hx > @@ -3061,6 +3061,7 @@ Example: > <- { "return": {} } > > EQMP > + > { > .name = "query-rx-filter", > .args_type = "name:s?", > @@ -3124,3 +3125,43 @@ Example: > } > > EQMP > + > + { > + .name = "set-mem-policy", > + .args_type = "nodeid:i,policy:s?,relative:b?,host-nodes:q?", > + .help = "Set the host memory binding policy for guest NUMA node", > + .mhandler.cmd_new = qmp_marshal_input_set_mem_policy, > + }, > + > +SQMP > +set-mem-policy > +------ > + > +Set the host memory binding policy for guest NUMA node > + > +Arguments: > + > +- "nodeid": The nodeid of guest NUMA node to set memory policy to. > + (json-int) > +- "policy": The memory policy to set. > + (json-string, optional) > +- "relative": If the specified nodes are relative. > + (json-bool, optional) > +- "host-nodes": The host nodes contained to this memory policy. > + (a json-array of int, optional) > + > +Example: > + > +-> { "execute": "set-mem-policy", "arguments": { "nodeid": 0, > + "policy": "membind", > + "relative": true, > + "host-nodes": [0, 1] } } > +<- { "return": {} } > + > +Notes: > + 1. If "policy" is not set, the memory policy of this "nodeid" will be set > + to "default". > + 2. If "host-nodes" is not set, the node mask of this "policy" will be set > + to host node 0. > + > +EQMP