From mboxrd@z Thu Jan 1 00:00:00 1970 From: Wei Liu Subject: [PATCH v4 09/21] libxl: build, check and pass vNUMA info to Xen for PV guest Date: Fri, 23 Jan 2015 11:13:40 +0000 Message-ID: <1422011632-22018-10-git-send-email-wei.liu2@citrix.com> References: <1422011632-22018-1-git-send-email-wei.liu2@citrix.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1422011632-22018-1-git-send-email-wei.liu2@citrix.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: xen-devel@lists.xen.org Cc: Wei Liu , ian.campbell@citrix.com, andrew.cooper3@citrix.com, dario.faggioli@citrix.com, ian.jackson@eu.citrix.com, JBeulich@suse.com, ufimtseva@gmail.com List-Id: xen-devel@lists.xenproject.org Transform the user supplied vNUMA configuration into libxl internal representations, and finally libxc representations. Check validity of the configuration along the line. Signed-off-by: Wei Liu Cc: Ian Campbell Cc: Ian Jackson Cc: Dario Faggioli Cc: Elena Ufimtseva --- Changes in v4: 1. Adapt to new interfaces. Changes in v3: 1. Add more commit log. --- tools/libxl/libxl_dom.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/tools/libxl/libxl_dom.c b/tools/libxl/libxl_dom.c index 48d661a..b06fd65 100644 --- a/tools/libxl/libxl_dom.c +++ b/tools/libxl/libxl_dom.c @@ -515,6 +515,51 @@ retry_transaction: return 0; } +static int set_vnuma_info(libxl__gc *gc, uint32_t domid, + const libxl_domain_build_info *info, + const libxl__domain_build_state *state) +{ + int rc = 0; + int i, nr_vdistance; + unsigned int *vcpu_to_vnode, *vnode_to_pnode, *vdistance = NULL; + + vcpu_to_vnode = libxl__calloc(gc, info->max_vcpus, + sizeof(unsigned int)); + vnode_to_pnode = libxl__calloc(gc, info->num_vnuma_nodes, + sizeof(unsigned int)); + + nr_vdistance = info->num_vnuma_nodes * info->num_vnuma_nodes; + vdistance = libxl__calloc(gc, nr_vdistance, sizeof(unsigned int)); + + for (i = 0; i < info->num_vnuma_nodes; i++) { + libxl_vnode_info *v = &info->vnuma_nodes[i]; + int bit; + + /* vnode to pnode mapping */ + vnode_to_pnode[i] = v->pnode; + + /* vcpu to vnode mapping */ + libxl_for_each_set_bit(bit, v->vcpus) + vcpu_to_vnode[bit] = i; + + /* node distances */ + assert(info->num_vnuma_nodes == v->num_distances); + memcpy(vdistance + (i * info->num_vnuma_nodes), + v->distances, + v->num_distances * sizeof(unsigned int)); + } + + if (xc_domain_setvnuma(CTX->xch, domid, info->num_vnuma_nodes, + state->num_vmemranges, info->max_vcpus, + state->vmemranges, vdistance, + vcpu_to_vnode, vnode_to_pnode) < 0) { + LOGE(ERROR, "xc_domain_setvnuma failed"); + rc = ERROR_FAIL; + } + + return rc; +} + int libxl__build_pv(libxl__gc *gc, uint32_t domid, libxl_domain_build_info *info, libxl__domain_build_state *state) { @@ -572,6 +617,30 @@ int libxl__build_pv(libxl__gc *gc, uint32_t domid, dom->xenstore_domid = state->store_domid; dom->claim_enabled = libxl_defbool_val(info->claim_mode); + if (info->num_vnuma_nodes != 0) { + int i; + + ret = libxl__vnuma_build_vmemrange_pv(gc, domid, info, state); + if (ret) { + LOGE(ERROR, "cannot build vmemranges"); + goto out; + } + ret = libxl__vnuma_config_check(gc, info, state); + if (ret) goto out; + + ret = set_vnuma_info(gc, domid, info, state); + if (ret) goto out; + + dom->nr_vnuma_info = info->num_vnuma_nodes; + dom->vnuma_info = xc_dom_malloc(dom, sizeof(*dom->vnuma_info) * + dom->nr_vnuma_info); + for (i = 0; i < dom->nr_vnuma_info; i++) { + dom->vnuma_info[i].vnode = i; + dom->vnuma_info[i].pnode = info->vnuma_nodes[i].pnode; + dom->vnuma_info[i].pages = info->vnuma_nodes[i].memkb >> 2; + } + } + if ( (ret = xc_dom_boot_xen_init(dom, ctx->xch, domid)) != 0 ) { LOGE(ERROR, "xc_dom_boot_xen_init failed"); goto out; -- 1.7.10.4