libxl: set domain scheduling parameters while creating the domU the domain specific scheduling parameters like cpu_weight, cap, slice, ... will be set during creating the domain, so this parameters can be defined in the domain config file Signed-off-by: Dieter Bloms diff --git a/docs/man/xl.cfg.pod.5 b/docs/man/xl.cfg.pod.5 index e2cd251..b0c8064 100644 --- a/docs/man/xl.cfg.pod.5 +++ b/docs/man/xl.cfg.pod.5 @@ -112,6 +112,44 @@ List of which cpus the guest is allowed to use. Default behavior is (all vcpus will run on cpus 0,2,3,5), or `cpus=["2", "3"]` (all vcpus will run on cpus 2 and 3). +=item B + +A domain with a weight of 512 will get twice as much CPU as a domain +with a weight of 256 on a contended host. +Legal weights range from 1 to 65535 and the default is 256. +Can be set for credit, credit2 and sedf scheduler. + +=item B + +The cap optionally fixes the maximum amount of CPU a domain will be +able to consume, even if the host system has idle CPU cycles. +The cap is expressed in percentage of one physical CPU: +100 is 1 physical CPU, 50 is half a CPU, 400 is 4 CPUs, etc. +The default, 0, means there is no upper cap. +Can be set for the credit and credit2 scheduler. + +=item B + +The normal EDF scheduling usage in nanoseconds. This means every period +the domain gets cpu time defined in slice. +Can be set for sedf scheduler. + +=item B + +The normal EDF scheduling usage in nanoseconds. it defines the time +a domain get every period time. +Can be set for sedf scheduler. + +=item B + +Scaled period if domain is doing heavy I/O. +Can be set for sedf scheduler. + +=item B + +Flag for allowing domain to run in extra time. +Can be set for sedf scheduler. + =item B Start the guest with MBYTES megabytes of RAM. diff --git a/tools/libxl/libxl_dom.c b/tools/libxl/libxl_dom.c index 0bdd654..55b033a 100644 --- a/tools/libxl/libxl_dom.c +++ b/tools/libxl/libxl_dom.c @@ -42,6 +42,40 @@ libxl_domain_type libxl__domain_type(libxl__gc *gc, uint32_t domid) return LIBXL_DOMAIN_TYPE_PV; } +int libxl__sched_set_params(libxl__gc *gc, uint32_t domid, libxl_sched_params *scparams) +{ + libxl_ctx *ctx = libxl__gc_owner(gc); + libxl_scheduler sched; + libxl_sched_sedf_domain sedf_info; + libxl_sched_credit_domain credit_info; + libxl_sched_credit2_domain credit2_info; + int ret; + + sched = libxl_get_scheduler (ctx); + switch (sched) { + case LIBXL_SCHEDULER_SEDF: + sedf_info.period = scparams->period; + sedf_info.slice = scparams->slice; + sedf_info.latency = scparams->latency; + sedf_info.extratime = scparams->extratime; + sedf_info.weight = scparams->weight; + ret=libxl_sched_sedf_domain_set(ctx, domid, &sedf_info); + break; + case LIBXL_SCHEDULER_CREDIT: + credit_info.weight = scparams->weight; + credit_info.cap = scparams->cap; + ret=libxl_sched_credit_domain_set(ctx, domid, &credit_info); + break; + case LIBXL_SCHEDULER_CREDIT2: + credit2_info.weight = scparams->weight; + ret=libxl_sched_credit2_domain_set(ctx, domid, &credit2_info); + break; + default: + ret=-1; + } + return ret; +} + int libxl__domain_shutdown_reason(libxl__gc *gc, uint32_t domid) { libxl_ctx *ctx = libxl__gc_owner(gc); @@ -126,6 +160,8 @@ int libxl__build_post(libxl__gc *gc, uint32_t domid, char **ents, **hvm_ents; int i; + libxl__sched_set_params (gc, domid, &(info->sched_params)); + libxl_cpuid_apply_policy(ctx, domid); if (info->cpuid != NULL) libxl_cpuid_set(ctx, domid, info->cpuid); diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index a4b933b..2b76b0e 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -617,6 +617,7 @@ int libxl__atfork_init(libxl_ctx *ctx); /* from xl_dom */ _hidden libxl_domain_type libxl__domain_type(libxl__gc *gc, uint32_t domid); _hidden int libxl__domain_shutdown_reason(libxl__gc *gc, uint32_t domid); +_hidden int libxl__sched_set_params(libxl__gc *gc, uint32_t domid, libxl_sched_params *scparams); #define LIBXL__DOMAIN_IS_TYPE(gc, domid, type) \ libxl__domain_type((gc), (domid)) == LIBXL_DOMAIN_TYPE_##type typedef struct { diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl index 5cf9708..7789327 100644 --- a/tools/libxl/libxl_types.idl +++ b/tools/libxl/libxl_types.idl @@ -224,6 +224,17 @@ libxl_domain_create_info = Struct("domain_create_info",[ MemKB = UInt(64, init_val = "LIBXL_MEMKB_DEFAULT") +libxl_sched_params = Struct("sched_params",[ + ("weight", integer), + ("cap", integer), + ("tslice_ms", integer), + ("ratelimit_us", integer), + ("period", integer), + ("slice", integer), + ("latency", integer), + ("extratime", integer), + ], dir=DIR_IN) + # Instances of libxl_file_reference contained in this struct which # have been mapped (with libxl_file_reference_map) will be unmapped # by libxl_domain_build/restore. If either of these are never called @@ -255,6 +266,8 @@ libxl_domain_build_info = Struct("domain_build_info",[ ("extra_pv", libxl_string_list), # extra parameters pass directly to qemu for HVM guest, NULL terminated ("extra_hvm", libxl_string_list), + # parameters for all type of scheduler + ("sched_params", libxl_sched_params), ("u", KeyedUnion(None, libxl_domain_type, "type", [("hvm", Struct(None, [("firmware", string), diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c index 5703512..8e67307 100644 --- a/tools/libxl/xl_cmdimpl.c +++ b/tools/libxl/xl_cmdimpl.c @@ -587,6 +587,23 @@ static void parse_config_data(const char *configfile_filename_report, libxl_domain_build_info_init_type(b_info, c_info->type); /* the following is the actual config parsing with overriding values in the structures */ + if (!xlu_cfg_get_long (config, "cpu_weight", &l, 0)) + b_info->sched_params.weight = l; + if (!xlu_cfg_get_long (config, "cap", &l, 0)) + b_info->sched_params.cap = l; + if (!xlu_cfg_get_long (config, "tslice_ms", &l, 0)) + b_info->sched_params.tslice_ms = l; + if (!xlu_cfg_get_long (config, "ratelimit_us", &l, 0)) + b_info->sched_params.ratelimit_us = l; + if (!xlu_cfg_get_long (config, "period", &l, 0)) + b_info->sched_params.period = l; + if (!xlu_cfg_get_long (config, "slice", &l, 0)) + b_info->sched_params.period = l; + if (!xlu_cfg_get_long (config, "latency", &l, 0)) + b_info->sched_params.period = l; + if (!xlu_cfg_get_long (config, "extratime", &l, 0)) + b_info->sched_params.period = l; + if (!xlu_cfg_get_long (config, "vcpus", &l, 0)) { b_info->max_vcpus = l; b_info->cur_vcpus = (1 << l) - 1;