mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 02:30:03 +01:00
libxl: build, check and pass vNUMA info to Xen for PV guest
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 <wei.liu2@citrix.com> Reviewed-by: Dario Faggioli <dario.faggioli@citrix.com> Cc: Ian Campbell <ian.campbell@citrix.com> Cc: Ian Jackson <ian.jackson@eu.citrix.com> Cc: Dario Faggioli <dario.faggioli@citrix.com> Cc: Elena Ufimtseva <ufimtseva@gmail.com> Acked-by: Ian Campbell <ian.campbell@citrix.com>
This commit is contained in:
1 parent
6525cd308d
commit
9c7e96c92d
1 file changed
+77
@@ -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;
|
||||
unsigned 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 j;
|
||||
|
||||
/* vnode to pnode mapping */
|
||||
vnode_to_pnode[i] = v->pnode;
|
||||
|
||||
/* vcpu to vnode mapping */
|
||||
libxl_for_each_set_bit(j, v->vcpus)
|
||||
vcpu_to_vnode[j] = 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,38 @@ 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) {
|
||||
unsigned 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_vmemranges = state->num_vmemranges;
|
||||
dom->vmemranges = xc_dom_malloc(dom, sizeof(*dom->vmemranges) *
|
||||
dom->nr_vmemranges);
|
||||
|
||||
for (i = 0; i < dom->nr_vmemranges; i++) {
|
||||
dom->vmemranges[i].start = state->vmemranges[i].start;
|
||||
dom->vmemranges[i].end = state->vmemranges[i].end;
|
||||
dom->vmemranges[i].flags = state->vmemranges[i].flags;
|
||||
dom->vmemranges[i].nid = state->vmemranges[i].nid;
|
||||
}
|
||||
|
||||
dom->nr_vnodes = info->num_vnuma_nodes;
|
||||
dom->vnode_to_pnode = xc_dom_malloc(dom, sizeof(*dom->vnode_to_pnode) *
|
||||
dom->nr_vnodes);
|
||||
for (i = 0; i < info->num_vnuma_nodes; i++)
|
||||
dom->vnode_to_pnode[i] = info->vnuma_nodes[i].pnode;
|
||||
}
|
||||
|
||||
if ( (ret = xc_dom_boot_xen_init(dom, ctx->xch, domid)) != 0 ) {
|
||||
LOGE(ERROR, "xc_dom_boot_xen_init failed");
|
||||
goto out;
|
||||
|
||||