[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v1][RFC] xen balloon driver numa support, libxl interface
--- This small patch implements a numa support of memory operation for libxl The command is: xl mem-set-numa [-e] vmid memorysize nodeid To pass the parameters to balloon driver in kernel, I add a file of xen-store as /local/domain/(id)/memory/target_nid, hoping this is ok.... It's my first time submitting a patch, please point out the problems so that I could work better in future, thanks very much! tools/libxl/libxl.c | 14 ++++++++++++-- tools/libxl/libxl.h | 1 + tools/libxl/xl.h | 1 + tools/libxl/xl_cmdimpl.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ tools/libxl/xl_cmdtable.c | 7 +++++++ 5 files changed, 66 insertions(+), 2 deletions(-) diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index 81785df..f027d59 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -3642,10 +3642,17 @@ retry: } return 0; } - int libxl_set_memory_target(libxl_ctx *ctx, uint32_t domid, int32_t target_memkb, int relative, int enforce) { + return libxl_set_memory_target_numa(ctx, domid, target_memkb, relative, + enforce, -1, 0); +} + +int libxl_set_memory_target_numa(libxl_ctx *ctx, uint32_t domid, + int32_t target_memkb, int relative, int enforce, + int node_specify, bool nodeexact) +{ GC_INIT(ctx); int rc = 1, abort_transaction = 0; uint32_t memorykb = 0, videoram = 0; @@ -3754,7 +3761,10 @@ retry_transaction: abort_transaction = 1; goto out; } - + //lcc: + LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, "target_nid = %d focus= %d", node_specify, (int) nodeexact); + libxl__xs_write(gc, t, libxl__sprintf(gc, "%s/memory/target_nid", + dompath), "%"PRId32" %"PRId32, node_specify, (int)nodeexact); libxl__xs_write(gc, t, libxl__sprintf(gc, "%s/memory/target", dompath), "%"PRIu32, new_target_memkb); rc = xc_domain_getinfolist(ctx->xch, domid, 1, &info); diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h index be19bf5..e21d8c3 100644 --- a/tools/libxl/libxl.h +++ b/tools/libxl/libxl.h @@ -628,6 +628,7 @@ int libxl_domain_core_dump(libxl_ctx *ctx, uint32_t domid, int libxl_domain_setmaxmem(libxl_ctx *ctx, uint32_t domid, uint32_t target_memkb); int libxl_set_memory_target(libxl_ctx *ctx, uint32_t domid, int32_t target_memkb, int relative, int enforce); +int libxl_set_memory_target_numa(libxl_ctx *ctx, uint32_t domid, int32_t target_memkb, int relative, int enforce, int node_specify, bool nodeexact); int libxl_get_memory_target(libxl_ctx *ctx, uint32_t domid, uint32_t *out_target); diff --git a/tools/libxl/xl.h b/tools/libxl/xl.h index e72a7d2..6e5873d 100644 --- a/tools/libxl/xl.h +++ b/tools/libxl/xl.h @@ -62,6 +62,7 @@ int main_vcpupin(int argc, char **argv); int main_vcpuset(int argc, char **argv); int main_memmax(int argc, char **argv); int main_memset(int argc, char **argv); +int main_memset_numa(int argc, char **argv); int main_sched_credit(int argc, char **argv); int main_sched_credit2(int argc, char **argv); int main_sched_sedf(int argc, char **argv); diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c index 884f050..ddfb0d5 100644 --- a/tools/libxl/xl_cmdimpl.c +++ b/tools/libxl/xl_cmdimpl.c @@ -2523,6 +2523,51 @@ int main_memset(int argc, char **argv) return 0; } +static void set_memory_target_numa(uint32_t domid, const char *mem, int mnid, bool nodeexact) +{ + long long int memorykb; + + memorykb = parse_mem_size_kb(mem); + if (memorykb == -1) { + fprintf(stderr, "invalid memory size: %s\n", mem); + exit(3); + } + + libxl_set_memory_target_numa(ctx, domid, memorykb, 0, /* enforce */ 1, mnid, nodeexact); +} + +int main_memset_numa(int argc, char **argv) +{ + uint32_t domid; + int opt = 0; + int mnid = -1; + const char *mem; + bool nodeexact = false; + static const struct option opts[] = { + {"exact", 0, 0, 'e'}, + COMMON_LONG_OPTS, + {0, 0, 0, 0} + }; + + SWITCH_FOREACH_OPT(opt, "e", opts, "mem-set-numa", 1) { + case 'e': + nodeexact = true; + break; + } + if (argc < optind + 3){ + help("mem-set-numa"); + return 2; + } + domid = find_domain(argv[optind]); + mem = argv[optind + 1]; + if (sscanf(argv[optind + 2], "%d", &mnid) != 1){ + fprintf(stderr, "invalid node id"); + } + fprintf(stderr, "nodeexact = %d domid = %d mem = %s mnid = %d\n", nodeexact, domid, mem, mnid); + set_memory_target_numa(domid, mem, mnid, nodeexact); + return 0; +} + static int cd_insert(uint32_t domid, const char *virtdev, char *phys) { libxl_device_disk disk; /* we don't free disk's contents */ diff --git a/tools/libxl/xl_cmdtable.c b/tools/libxl/xl_cmdtable.c index 326a660..ab918c0 100644 --- a/tools/libxl/xl_cmdtable.c +++ b/tools/libxl/xl_cmdtable.c @@ -199,6 +199,13 @@ struct cmd_spec cmd_table[] = { "Set the current memory usage for a domain", "<Domain> <MemMB['b'[bytes]|'k'[KB]|'m'[MB]|'g'[GB]|'t'[TB]]>", }, + { "mem-set-numa", + &main_memset_numa, 0, 1, + "Set the current memory usage for a domain, with numa node specified", + "[-e] <Domain> <MemMB['b'[bytes]|'k'[KB]|'m'[MB]|'g'[GB]|'t'[TB]]> <nid>", + "-e, --exact: operatrion will force on this node exactly" + "nid: the machine(physical) node id\n" + }, { "button-press", &main_button_press, 0, 1, "Indicate an ACPI button press to the domain", -- 1.8.1.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |