diff options
author | Dario Faggioli <dario.faggioli@citrix.com> | 2012-01-27 19:17:03 +0000 |
---|---|---|
committer | Dario Faggioli <dario.faggioli@citrix.com> | 2012-01-27 19:17:03 +0000 |
commit | c1cdf27925e1bfebf16fe33000509cce5e115df5 (patch) | |
tree | 819d724a000ed3817659ae602e18f4bc655c13ec /tools/libxl | |
parent | 3290f842f7cefdd9d0d43271025d1d945d5e8529 (diff) | |
download | xen-c1cdf27925e1bfebf16fe33000509cce5e115df5.tar.gz xen-c1cdf27925e1bfebf16fe33000509cce5e115df5.tar.bz2 xen-c1cdf27925e1bfebf16fe33000509cce5e115df5.zip |
libxl: allow for specifying the CPU affinity in the config file.
Enable CPU affinity specification in a VM's config file with the
exact syntax `xl vcpu-pin' provides.
Signed-off-by: Dario Faggioli <dario.faggioli@citrix.com>
Acked-by: Ian Campbell <ian.campbell@citrix.com>
Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
Diffstat (limited to 'tools/libxl')
-rw-r--r-- | tools/libxl/libxl.c | 15 | ||||
-rw-r--r-- | tools/libxl/libxl.h | 2 | ||||
-rw-r--r-- | tools/libxl/libxl_create.c | 3 | ||||
-rw-r--r-- | tools/libxl/libxl_dom.c | 1 | ||||
-rw-r--r-- | tools/libxl/libxl_types.idl | 1 | ||||
-rw-r--r-- | tools/libxl/libxl_utils.h | 12 | ||||
-rw-r--r-- | tools/libxl/xl_cmdimpl.c | 143 |
7 files changed, 117 insertions, 60 deletions
diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index c11b7ca30e..fa358d1d2c 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -2874,6 +2874,21 @@ int libxl_set_vcpuaffinity(libxl_ctx *ctx, uint32_t domid, uint32_t vcpuid, return 0; } +int libxl_set_vcpuaffinity_all(libxl_ctx *ctx, uint32_t domid, + unsigned int max_vcpus, libxl_cpumap *cpumap) +{ + int i, rc = 0; + + for (i = 0; i < max_vcpus; i++) { + if (libxl_set_vcpuaffinity(ctx, domid, i, cpumap)) { + LIBXL__LOG(ctx, LIBXL__LOG_WARNING, + "failed to set affinity for %d", i); + rc = ERROR_FAIL; + } + } + return rc; +} + int libxl_set_vcpuonline(libxl_ctx *ctx, uint32_t domid, libxl_cpumap *cpumap) { GC_INIT(ctx); diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h index 508f9a5fbf..1dbc9c46cf 100644 --- a/tools/libxl/libxl.h +++ b/tools/libxl/libxl.h @@ -588,6 +588,8 @@ libxl_vcpuinfo *libxl_list_vcpu(libxl_ctx *ctx, uint32_t domid, int *nb_vcpu, int *nrcpus); int libxl_set_vcpuaffinity(libxl_ctx *ctx, uint32_t domid, uint32_t vcpuid, libxl_cpumap *cpumap); +int libxl_set_vcpuaffinity_all(libxl_ctx *ctx, uint32_t domid, + unsigned int max_vcpus, libxl_cpumap *cpumap); int libxl_set_vcpuonline(libxl_ctx *ctx, uint32_t domid, libxl_cpumap *cpumap); int libxl_get_sched_id(libxl_ctx *ctx); diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c index e1c615fb60..ac6a92c375 100644 --- a/tools/libxl/libxl_create.c +++ b/tools/libxl/libxl_create.c @@ -71,6 +71,9 @@ int libxl_init_build_info(libxl_ctx *ctx, memset(b_info, '\0', sizeof(*b_info)); b_info->max_vcpus = 1; b_info->cur_vcpus = 1; + if (libxl_cpumap_alloc(ctx, &b_info->cpumap)) + return ERROR_NOMEM; + libxl_cpumap_set_any(&b_info->cpumap); b_info->max_memkb = 32 * 1024; b_info->target_memkb = b_info->max_memkb; b_info->disable_migrate = 0; diff --git a/tools/libxl/libxl_dom.c b/tools/libxl/libxl_dom.c index 91643a26b2..06aa2e3898 100644 --- a/tools/libxl/libxl_dom.c +++ b/tools/libxl/libxl_dom.c @@ -65,6 +65,7 @@ int libxl__build_pre(libxl__gc *gc, uint32_t domid, libxl_ctx *ctx = libxl__gc_owner(gc); int tsc_mode; xc_domain_max_vcpus(ctx->xch, domid, info->max_vcpus); + libxl_set_vcpuaffinity_all(ctx, domid, info->max_vcpus, &info->cpumap); xc_domain_setmaxmem(ctx->xch, domid, info->target_memkb + LIBXL_MAXMEM_CONSTANT); if (info->type == LIBXL_DOMAIN_TYPE_PV) xc_domain_set_memmap_limit(ctx->xch, domid, diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl index dc34afa73d..f438c9f985 100644 --- a/tools/libxl/libxl_types.idl +++ b/tools/libxl/libxl_types.idl @@ -157,6 +157,7 @@ libxl_domain_create_info = Struct("domain_create_info",[ libxl_domain_build_info = Struct("domain_build_info",[ ("max_vcpus", integer), ("cur_vcpus", integer), + ("cpumap", libxl_cpumap), ("tsc_mode", libxl_tsc_mode), ("max_memkb", uint32), ("target_memkb", uint32), diff --git a/tools/libxl/libxl_utils.h b/tools/libxl/libxl_utils.h index 19ad357d37..845c9925e0 100644 --- a/tools/libxl/libxl_utils.h +++ b/tools/libxl/libxl_utils.h @@ -70,6 +70,18 @@ int libxl_cpumap_alloc(libxl_ctx *ctx, libxl_cpumap *cpumap); int libxl_cpumap_test(libxl_cpumap *cpumap, int cpu); void libxl_cpumap_set(libxl_cpumap *cpumap, int cpu); void libxl_cpumap_reset(libxl_cpumap *cpumap, int cpu); +static inline void libxl_cpumap_set_any(libxl_cpumap *cpumap) +{ + memset(cpumap->map, -1, cpumap->size); +} +static inline void libxl_cpumap_set_none(libxl_cpumap *cpumap) +{ + memset(cpumap->map, 0, cpumap->size); +} +static inline int libxl_cpumap_cpu_valid(libxl_cpumap *cpumap, int cpu) +{ + return cpu >= 0 && cpu < (cpumap->size * 8); +} #define libxl_for_each_cpu(var, map) for (var = 0; var < (map).size * 8; var++) #define libxl_for_each_set_cpu(v, m) for (v = 0; v < (m).size * 8; v++) \ if (libxl_cpumap_test(&(m), v)) diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c index 3fed318eea..8832b5a202 100644 --- a/tools/libxl/xl_cmdimpl.c +++ b/tools/libxl/xl_cmdimpl.c @@ -570,6 +570,65 @@ static void split_string_into_string_list(const char *str, free(s); } +static int vcpupin_parse(char *cpu, libxl_cpumap *cpumap) +{ + libxl_cpumap exclude_cpumap; + uint32_t cpuida, cpuidb; + char *endptr, *toka, *tokb, *saveptr = NULL; + int i, rc = 0, rmcpu; + + if (!strcmp(cpu, "all")) { + libxl_cpumap_set_any(cpumap); + return 0; + } + + if (libxl_cpumap_alloc(ctx, &exclude_cpumap)) { + fprintf(stderr, "Error: Failed to allocate cpumap.\n"); + return ENOMEM; + } + + for (toka = strtok_r(cpu, ",", &saveptr); toka; + toka = strtok_r(NULL, ",", &saveptr)) { + rmcpu = 0; + if (*toka == '^') { + /* This (These) Cpu(s) will be removed from the map */ + toka++; + rmcpu = 1; + } + /* Extract a valid (range of) cpu(s) */ + cpuida = cpuidb = strtoul(toka, &endptr, 10); + if (endptr == toka) { + fprintf(stderr, "Error: Invalid argument.\n"); + rc = EINVAL; + goto vcpp_out; + } + if (*endptr == '-') { + tokb = endptr + 1; + cpuidb = strtoul(tokb, &endptr, 10); + if (endptr == tokb || cpuida > cpuidb) { + fprintf(stderr, "Error: Invalid argument.\n"); + rc = EINVAL; + goto vcpp_out; + } + } + while (cpuida <= cpuidb) { + rmcpu == 0 ? libxl_cpumap_set(cpumap, cpuida) : + libxl_cpumap_set(&exclude_cpumap, cpuida); + cpuida++; + } + } + + /* Clear all the cpus from the removal list */ + libxl_for_each_set_cpu(i, exclude_cpumap) { + libxl_cpumap_reset(cpumap, i); + } + +vcpp_out: + libxl_cpumap_dispose(&exclude_cpumap); + + return rc; +} + static void parse_config_data(const char *configfile_filename_report, const char *configfile_data, int configfile_len, @@ -579,7 +638,7 @@ static void parse_config_data(const char *configfile_filename_report, const char *buf; long l; XLU_Config *config; - XLU_ConfigList *vbds, *nics, *pcis, *cvfbs, *cpuids; + XLU_ConfigList *cpus, *vbds, *nics, *pcis, *cvfbs, *cpuids; int pci_power_mgmt = 0; int pci_msitranslate = 1; int e; @@ -662,6 +721,29 @@ static void parse_config_data(const char *configfile_filename_report, if (!xlu_cfg_get_long (config, "maxvcpus", &l, 0)) b_info->max_vcpus = l; + if (!xlu_cfg_get_list (config, "cpus", &cpus, 0, 1)) { + int i, n_cpus = 0; + + libxl_cpumap_set_none(&b_info->cpumap); + while ((buf = xlu_cfg_get_listitem(cpus, n_cpus)) != NULL) { + i = atoi(buf); + if (!libxl_cpumap_cpu_valid(&b_info->cpumap, i)) { + fprintf(stderr, "cpu %d illegal\n", i); + exit(1); + } + libxl_cpumap_set(&b_info->cpumap, i); + n_cpus++; + } + } + else if (!xlu_cfg_get_string (config, "cpus", &buf, 0)) { + char *buf2 = strdup(buf); + + libxl_cpumap_set_none(&b_info->cpumap); + if (vcpupin_parse(buf2, &b_info->cpumap)) + exit(1); + free(buf2); + } + if (!xlu_cfg_get_long (config, "memory", &l, 0)) { b_info->max_memkb = l * 1024; b_info->target_memkb = b_info->max_memkb; @@ -3568,65 +3650,6 @@ int main_vcpulist(int argc, char **argv) return 0; } -static int vcpupin_parse(char *cpu, libxl_cpumap *cpumap) -{ - libxl_cpumap exclude_cpumap; - uint32_t cpuida, cpuidb; - char *endptr, *toka, *tokb, *saveptr = NULL; - int i, rc = 0, rmcpu; - - if (!strcmp(cpu, "all")) { - memset(cpumap->map, -1, cpumap->size); - return 0; - } - - if (libxl_cpumap_alloc(ctx, &exclude_cpumap)) { - fprintf(stderr, "Error: Failed to allocate cpumap.\n"); - return ENOMEM; - } - - for (toka = strtok_r(cpu, ",", &saveptr); toka; - toka = strtok_r(NULL, ",", &saveptr)) { - rmcpu = 0; - if (*toka == '^') { - /* This (These) Cpu(s) will be removed from the map */ - toka++; - rmcpu = 1; - } - /* Extract a valid (range of) cpu(s) */ - cpuida = cpuidb = strtoul(toka, &endptr, 10); - if (endptr == toka) { - fprintf(stderr, "Error: Invalid argument.\n"); - rc = EINVAL; - goto vcpp_out; - } - if (*endptr == '-') { - tokb = endptr + 1; - cpuidb = strtoul(tokb, &endptr, 10); - if (endptr == tokb || cpuida > cpuidb) { - fprintf(stderr, "Error: Invalid argument.\n"); - rc = EINVAL; - goto vcpp_out; - } - } - while (cpuida <= cpuidb) { - rmcpu == 0 ? libxl_cpumap_set(cpumap, cpuida) : - libxl_cpumap_set(&exclude_cpumap, cpuida); - cpuida++; - } - } - - /* Clear all the cpus from the removal list */ - libxl_for_each_set_cpu(i, exclude_cpumap) { - libxl_cpumap_reset(cpumap, i); - } - -vcpp_out: - libxl_cpumap_dispose(&exclude_cpumap); - - return rc; -} - static void vcpupin(const char *d, const char *vcpu, char *cpu) { libxl_vcpuinfo *vcpuinfo; |