vNUMA : Guest NUMA config options 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 @@ -129,6 +129,7 @@ typedef struct { bool disable_migrate; libxl_file_reference 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 @@ -253,6 +253,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 random_uuid(uint8_t *uuid) @@ -365,6 +366,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, struct domain_config *d_config, libxl_device_model_info *dm_info) @@ -403,6 +435,10 @@ static void printf_info(int domid, printf("\t(max_memkb %d)\n", b_info->max_memkb); printf("\t(target_memkb %d)\n", b_info->target_memkb); printf("\t(nomigrate %d)\n", b_info->disable_migrate); + 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); if (!c_info->hvm && b_info->u.pv.bootloader) { printf("\t(bootloader %s)\n", b_info->u.pv.bootloader); @@ -650,6 +686,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.path = strdup(buf);