diff --git a/tools/libxc/xenctrl.h b/tools/libxc/xenctrl.h --- a/tools/libxc/xenctrl.h +++ b/tools/libxc/xenctrl.h @@ -227,6 +227,25 @@ typedef union start_info_t s; } start_info_any_t; +/** + * struct xc_dom_numa_info : Carries information required for NUMA memory + * allocation for the guests. + */ +#define XC_DOM_NUMA_AUTO 0 /* Let the allocator choose */ +#define XC_DOM_NUMA_CONFINE 1 +#define XC_DOM_NUMA_SPLIT 2 +#define XC_DOM_NUMA_STRIPE 3 +#define XC_DOM_NUMA_NONE 4 + +#define XC_DOM_NUMA_DEF_STRIPE 32 /* in 4K pages */ + +typedef struct xc_domain_numa_config +{ + uint32_t strategy; /* By default, DONTCARE (for now) */ + uint32_t nr_nodes; /* For SPLIT/STRIPE */ + uint32_t stripe_size; /* For STRIPE only */ +} xc_domain_numa_config_t; + int xc_domain_create(xc_interface *xch, uint32_t ssidref, diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h --- a/tools/libxl/libxl.h +++ b/tools/libxl/libxl.h @@ -102,6 +102,7 @@ typedef struct { uint32_t shadow_memkb; const char *kernel; int hvm; + struct xc_domain_numa_config numa_config; union { struct { bool pae; 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 @@ -208,6 +208,7 @@ static void init_build_info(libxl_domain } else { b_info->u.pv.slack_memkb = 8 * 1024; } + b_info->numa_config.strategy = XC_DOM_NUMA_NONE; } static void init_dm_info(libxl_device_model_info *dm_info, @@ -316,6 +317,37 @@ static void init_console_info(libxl_devi console->build_state = state; } +static char *numa_val_to_str(uint32_t val) +{ + switch (val) + { + case XC_DOM_NUMA_AUTO: + return "AUTO"; + case XC_DOM_NUMA_CONFINE: + return "CONFINE"; + case XC_DOM_NUMA_SPLIT: + return "SPLIT"; + case XC_DOM_NUMA_STRIPE: + return "STRIPE"; + default: + return "NONE"; + } +} + +static uint32_t numa_str_to_val(const char *str) +{ + if (!strcasecmp(str, "AUTO")) + return XC_DOM_NUMA_AUTO; + if (!strcasecmp(str, "CONFINE")) + return XC_DOM_NUMA_CONFINE; + if (!strcasecmp(str, "SPLIT")) + return XC_DOM_NUMA_SPLIT; + if (!strcasecmp(str, "STRIPE")) + return XC_DOM_NUMA_STRIPE; + + return XC_DOM_NUMA_NONE; +} + static void printf_info(int domid, libxl_domain_create_info *c_info, libxl_domain_build_info *b_info, @@ -363,6 +395,10 @@ static void printf_info(int domid, printf("\t(tsc_mode %d)\n", b_info->tsc_mode); printf("\t(max_memkb %d)\n", b_info->max_memkb); printf("\t(target_memkb %d)\n", b_info->target_memkb); + printf("\t(numa_strategy %s)\n", + numa_val_to_str(b_info->numa_config.strategy)); + printf("\t(numa_nodes %d)\n", b_info->numa_config.nr_nodes); + printf("\t(stripe_size %d)\n", b_info->numa_config.stripe_size); printf("\t(image\n"); if (c_info->hvm) { @@ -557,6 +593,14 @@ static void parse_config_data(const char if (!xlu_cfg_get_long (config, "videoram", &l)) b_info->video_memkb = l * 1024; + if (!xlu_cfg_get_string (config, "strategy", &buf)) { + b_info->numa_config.strategy = numa_str_to_val(buf); + if (!xlu_cfg_get_long (config, "vnodes", &l)) + b_info->numa_config.nr_nodes = l; + if (!xlu_cfg_get_long (config, "stripesz", &l)) + b_info->numa_config.stripe_size = l; + } + if (!xlu_cfg_get_string (config, "kernel", &buf)) b_info->kernel = strdup(buf); @@ -1066,6 +1110,9 @@ static int create_domain(struct domain_c parse_config_data(config_file, config_data, config_len, &info1, &info2, &disks, &num_disks, &vifs, &num_vifs, &vif2s, &num_vif2s, &pcidevs, &num_pcidevs, &vfbs, &num_vfbs, &vkbs, &num_vkbs, &dm_info); + if (debug) + printf_info(-1, &info1, &info2, disks, num_disks, vifs, num_vifs, pcidevs, num_pcidevs, vfbs, num_vfbs, vkbs, num_vkbs, &dm_info); + if (dom_info->dryrun) return 0; @@ -1083,9 +1130,6 @@ static int create_domain(struct domain_c } } - if (debug) - printf_info(-1, &info1, &info2, disks, num_disks, vifs, num_vifs, pcidevs, num_pcidevs, vfbs, num_vfbs, vkbs, num_vkbs, &dm_info); - start: domid = 0;