[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 2 of 8 [RFC]] xl: allow for changing NUMA node affinity on-line
by implementing the "node-affinity" command, acting pretty much like "vcpu-pin", although it of course affects node and not vcpu affinity. Signed-off-by: Dario Faggioli <dario.faggioli@xxxxxxxxxx> diff --git a/docs/man/xl.pod.1 b/docs/man/xl.pod.1 --- a/docs/man/xl.pod.1 +++ b/docs/man/xl.pod.1 @@ -626,6 +626,29 @@ different run state is appropriate. Pin this, by ensuring certain VCPUs can only run on certain physical CPUs. +=item B<node-affinity> I<domain-id> I<nodes> + +Sets or changes the NUMA node affinity for the domain. All the future +memory allocations for the domain will use memory belonging to I<nodes>. +Also (if the credit scheduler is in use), the VCPUs of the domain will +run on the CPUs belonging to I<nodes> as much as possible. + +This is different than VCPU pinning, as VCPUs are not prohibited to run +on CPUs not belonging to I<nodes>, and that can happen, for instance, in +order to avoid having VCPUs waiting to run in some PCPU's runqueue when +other PCPUs are idle. + +Changing a domain's node-affinity does not affect all the memory that +has been allocated already, before the command is invoked. + +The keyword B<all> can be used to have the domain affine to all the +NUMA nodes in the host. The keyword B<none> can be used to reset the +node affinity. In that case, and from that point on, the node affinity +of the domain will be automatically calculated basing on its vcpu affinity +(see B<vcpu-pin> above). More specifically, the node affinity will be +constituted by the nodes to which the physical CPUs its VCPUs have +vcpu affinity with belong. + =item B<vm-list> Prints information about guests. This list excludes information about diff --git a/tools/libxl/xl.h b/tools/libxl/xl.h --- a/tools/libxl/xl.h +++ b/tools/libxl/xl.h @@ -58,6 +58,7 @@ int main_vm_list(int argc, char **argv); int main_create(int argc, char **argv); int main_config_update(int argc, char **argv); int main_button_press(int argc, char **argv); +int main_nodeaffinity(int argc, char **argv); int main_vcpupin(int argc, char **argv); int main_vcpuset(int argc, char **argv); int main_memmax(int argc, char **argv); diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c --- a/tools/libxl/xl_cmdimpl.c +++ b/tools/libxl/xl_cmdimpl.c @@ -601,6 +601,54 @@ static int vcpupin_parse(char *cpu, libx return rc; } +static int nodeaffinity_parse(char *node, libxl_bitmap *nodemap) +{ + char *ptr, *saveptr = NULL; + int i, rc = 0, isnot; + libxl_bitmap map; + + if (!strcmp(node, "all")) { + libxl_bitmap_set_any(nodemap); + return 0; + } else if (!strcmp(node, "none")) { + libxl_bitmap_set_none(nodemap); + return 0; + } + + rc = libxl_node_bitmap_alloc(ctx, &map, 0); + if (rc) { + fprintf(stderr, "Error: Failed to allocate nodemap.\n"); + goto out; + } + + for (ptr = strtok_r(node, ",", &saveptr); ptr; + ptr = strtok_r(NULL, ",", &saveptr)) { + isnot = false; + + /* Adding or removing nodes? */ + if (*ptr == '^') { + isnot = true; + ptr++; + } + /* Get in map a bitmap representative of the range */ + if (range_parse_bitmap(ptr, &map)) { + fprintf(stderr, "Error: Invalid argument.\n"); + rc = EINVAL; + goto out; + } + + libxl_for_each_set_bit(i, map) { + isnot ? libxl_bitmap_reset(nodemap, i) + : libxl_bitmap_set(nodemap, i); + } + } + + out: + libxl_bitmap_dispose(&map); + + return rc; +} + static void parse_config_data(const char *config_source, const char *config_data, int config_len, @@ -4583,6 +4631,39 @@ int main_vcpuset(int argc, char **argv) return 0; } +static void nodeaffinity(uint32_t domid, char *node) +{ + libxl_bitmap nodemap; + + if (libxl_node_bitmap_alloc(ctx, &nodemap, 0)) { + fprintf(stderr, "libxl_node_bitmap_alloc failed.\n"); + goto out; + } + + if (nodeaffinity_parse(node, &nodemap)) { + fprintf(stderr, "Could not parse node affinity.\n"); + goto out; + } + + if (libxl_domain_set_nodeaffinity(ctx, domid, &nodemap) == -1) + fprintf(stderr, "Could not set node affinity for dom `%d'.\n", domid); + + out: + libxl_bitmap_dispose(&nodemap); +} + +int main_nodeaffinity(int argc, char **argv) +{ + int opt; + + SWITCH_FOREACH_OPT(opt, "", NULL, "node-affinity", 2) { + /* No options */ + } + + nodeaffinity(find_domain(argv[optind]), argv[optind+1]); + return 0; +} + static void output_xeninfo(void) { const libxl_version_info *info; diff --git a/tools/libxl/xl_cmdtable.c b/tools/libxl/xl_cmdtable.c --- a/tools/libxl/xl_cmdtable.c +++ b/tools/libxl/xl_cmdtable.c @@ -214,6 +214,11 @@ struct cmd_spec cmd_table[] = { "Set which CPUs a VCPU can use", "<Domain> <VCPU|all> <CPUs|all>", }, + { "node-affinity", + &main_nodeaffinity, 0, 1, + "Set the NUMA node affinity for the domain", + "<Domain> [<NODEs|all|none>]", + }, { "vcpu-set", &main_vcpuset, 0, 1, "Set the number of active VCPUs allowed for the domain", _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |