[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v2 19/19] xl: vNUMA support
This patch includes configuration options parser and documentation. Signed-off-by: Wei Liu <wei.liu2@xxxxxxxxxx> Cc: Ian Campbell <ian.campbell@xxxxxxxxxx> Cc: Ian Jackson <ian.jackson@xxxxxxxxxxxxx> Cc: Dario Faggioli <dario.faggioli@xxxxxxxxxx> Cc: Elena Ufimtseva <ufimtseva@xxxxxxxxx> --- Changes in v2: 1. Make vnuma_vdistances mandatory. 2. Use nested list to specify vdistances. 3. Update documentation. --- docs/man/xl.cfg.pod.5 | 39 ++++++++++++ tools/libxl/xl_cmdimpl.c | 147 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 186 insertions(+) diff --git a/docs/man/xl.cfg.pod.5 b/docs/man/xl.cfg.pod.5 index 622ea53..e9af221 100644 --- a/docs/man/xl.cfg.pod.5 +++ b/docs/man/xl.cfg.pod.5 @@ -266,6 +266,45 @@ it will crash. =back +=head3 Virtual NUMA Memory Allocation + +=over 4 + +=item B<vnuma_memory=[ NUMBER, NUMBER, ... ]> + +Specify the size of memory covered by each virtual NUMA node. The number of +elements in the list also implicitly defines the number of virtual NUMA nodes. + +The sum of all elements in this list should be equal to memory size specified +by B<maxmem=> in guest configuration file, or B<memory=> if B<maxmem=> is not +specified. + +=item B<vnuma_vcpu_map=[ NUMBER, NUMBER, ... ]> + +Specifiy which virutal NUMA node a specific vcpu belongs to. The number of +elements in this list should be equal to B<maxvcpus=> in guest configuration +file, or B<vcpus=> if B<maxvcpus=> is not specified. + +=item B<vnuma_pnode_map=[ NUMBER, NUMBER, ... ]> + +Specifiy which physical NUMA node a specific virtual NUMA node maps to. The +number of elements in this list should be equal to the number of virtual +NUMA nodes defined in B<vnuma_memory=>. + +=item B<vnuma_vdistance=[ [NUMBER, ..., NUMBER], [NUMBER, ..., NUMBER], ... ]> + +Two dimensional list to specify distances among nodes. + +The number of elements in the first dimension list equals the number of virtual +nodes. Each element in position B<i> is a list that specifies the distances +from node B<i> to other nodes. + +For example, for a guest with 2 virtual nodes, user can specify: + + vnuma_vdistance = [ [10, 20], [20, 10] ] + +=back + =head3 Event Actions =over 4 diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c index 0e754e7..19996ed 100644 --- a/tools/libxl/xl_cmdimpl.c +++ b/tools/libxl/xl_cmdimpl.c @@ -904,6 +904,151 @@ static void replace_string(char **str, const char *val) *str = xstrdup(val); } +static void parse_vnuma_config(const XLU_Config *config, + libxl_domain_build_info *b_info) +{ + int i, j; + XLU_ConfigList *vnuma_memory, *vnuma_vcpu_map, *vnuma_pnode_map, + *vnuma_vdistances; + int num_vnuma_memory, num_vnuma_vcpu_map, num_vnuma_pnode_map, + num_vnuma_vdistances; + const char *buf; + libxl_physinfo physinfo; + uint32_t nr_nodes; + unsigned long val; + char *ep; + + libxl_physinfo_init(&physinfo); + if (libxl_get_physinfo(ctx, &physinfo) != 0) { + libxl_physinfo_dispose(&physinfo); + fprintf(stderr, "libxl_physinfo failed.\n"); + exit(1); + } + nr_nodes = physinfo.nr_nodes; + libxl_physinfo_dispose(&physinfo); + + if (xlu_cfg_get_list(config, "vnuma_memory", &vnuma_memory, + &num_vnuma_memory, 1)) + return; /* No vnuma config */ + + b_info->num_vnuma_nodes = num_vnuma_memory; + b_info->vnuma_nodes = xmalloc(num_vnuma_memory * sizeof(libxl_vnode_info)); + + for (i = 0; i < b_info->num_vnuma_nodes; i++) { + libxl_vnode_info *p = &b_info->vnuma_nodes[i]; + + libxl_vnode_info_init(p); + libxl_cpu_bitmap_alloc(ctx, &p->vcpus, b_info->max_vcpus); + libxl_bitmap_set_none(&p->vcpus); + p->distances = xmalloc(b_info->num_vnuma_nodes * sizeof(uint32_t)); + p->num_distances = b_info->num_vnuma_nodes; + } + + for (i = 0; i < b_info->num_vnuma_nodes; i++) { + buf = xlu_cfg_get_listitem(vnuma_memory, i); + val = strtoul(buf, &ep, 10); + if (ep == buf) { + fprintf(stderr, "xl: Invalid argument parsing vnuma memory: %s\n", buf); + exit(1); + } + b_info->vnuma_nodes[i].mem = val; + } + + if (xlu_cfg_get_list(config, "vnuma_vcpu_map", &vnuma_vcpu_map, + &num_vnuma_vcpu_map, 1)) { + fprintf(stderr, "No vcpu to vnode map specified\n"); + exit(1); + } + + i = 0; + while (i < b_info->max_vcpus && + (buf = xlu_cfg_get_listitem(vnuma_vcpu_map, i)) != NULL) { + val = strtoul(buf, &ep, 10); + if (ep == buf) { + fprintf(stderr, "xl: Invalid argument parsing vcpu map: %s\n", buf); + exit(1); + } + if (val >= num_vnuma_memory) { + fprintf(stderr, "xl: Invalid vnode number specified: %lu\n", val); + exit(1); + } + libxl_bitmap_set(&b_info->vnuma_nodes[val].vcpus, i); + i++; + } + + if (i != b_info->max_vcpus) { + fprintf(stderr, "xl: Not enough elements in vnuma_vcpu_map, provided %d, required %d\n", + i + 1, b_info->max_vcpus); + exit(1); + } + + if (xlu_cfg_get_list(config, "vnuma_pnode_map", &vnuma_pnode_map, + &num_vnuma_pnode_map, 1)) { + fprintf(stderr, "No vnode to pnode map specified\n"); + exit(1); + } + + i = 0; + while (i < num_vnuma_pnode_map && + (buf = xlu_cfg_get_listitem(vnuma_pnode_map, i)) != NULL) { + val = strtoul(buf, &ep, 10); + if (ep == buf) { + fprintf(stderr, "xl: Invalid argument parsing vnode to pnode map: %s\n", buf); + exit(1); + } + if (val >= nr_nodes) { + fprintf(stderr, "xl: Invalid pnode number specified: %lu\n", val); + exit(1); + } + + b_info->vnuma_nodes[i].pnode = val; + + i++; + } + + if (i != b_info->num_vnuma_nodes) { + fprintf(stderr, "xl: Not enough elements in vnuma_vnode_map, provided %d, required %d\n", + i + 1, b_info->num_vnuma_nodes); + exit(1); + } + + if (!xlu_cfg_get_list(config, "vnuma_vdistances", &vnuma_vdistances, + &num_vnuma_vdistances, 1)) { + if (num_vnuma_vdistances != num_vnuma_memory) { + fprintf(stderr, "xl: Required %d sub-lists in vnuma_vdistances but provided %d\n", + num_vnuma_memory, num_vnuma_vdistances); + exit(1); + } + + for (i = 0; i < num_vnuma_vdistances; i++) { + const XLU_ConfigValue *tmp; + const XLU_ConfigList *sublist; + + tmp = xlu_cfg_get_listitem2(vnuma_vdistances, i); + if (xlu_cfg_value_type(tmp) != XLU_LIST) { + fprintf(stderr, "xl: Expecting list in vnuma_vdistance\n"); + exit(1); + } + sublist = xlu_cfg_value_get_list(tmp); + for (j = 0; + (buf = xlu_cfg_get_listitem(sublist, j)) != NULL; + j++) { + val = strtoul(buf, &ep, 10); + if (ep == buf) { + fprintf(stderr, "xl: Invalid argument parsing vdistances map: %s\n", buf); + exit(1); + } + + b_info->vnuma_nodes[i].distances[j] = val; + } + } + + } else { + fprintf(stderr, "xl: No vnuma_vdistances specified.\n"); + exit(1); + } +} + static void parse_config_data(const char *config_source, const char *config_data, int config_len, @@ -1093,6 +1238,8 @@ static void parse_config_data(const char *config_source, } } + parse_vnuma_config(config, b_info); + if (!xlu_cfg_get_long(config, "rtc_timeoffset", &l, 0)) b_info->rtc_timeoffset = l; -- 1.7.10.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |