libxl: set domain scheduling parameters while creating the dom 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..654da78 100644 --- a/tools/libxl/libxl_dom.c +++ b/tools/libxl/libxl_dom.c @@ -42,6 +42,33 @@ 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_domain_build_info *info) +{ + libxl_ctx *ctx = libxl__gc_owner(gc); + libxl_scheduler sched; + int ret; + + sched = libxl_get_scheduler (ctx); + switch (sched) { + case LIBXL_SCHEDULER_SEDF: + ret=libxl_sched_sedf_domain_set(ctx, domid, &(info->us.sedf)); + break; + case LIBXL_SCHEDULER_CREDIT: + ret=libxl_sched_credit_domain_set(ctx, domid, &(info->us.credit)); + break; + case LIBXL_SCHEDULER_CREDIT2: + ret=libxl_sched_credit2_domain_set(ctx, domid, &(info->us.credit2)); + break; + case LIBXL_SCHEDULER_ARINC653: + /* not implemented */ + ret=0; + 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 +153,8 @@ int libxl__build_post(libxl__gc *gc, uint32_t domid, char **ents, **hvm_ents; int i; + libxl__sched_set_params (gc, domid, info); + 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..bfcdff4 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_domain_build_info *info); #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..c1cdc3c 100644 --- a/tools/libxl/libxl_types.idl +++ b/tools/libxl/libxl_types.idl @@ -224,6 +224,27 @@ libxl_domain_create_info = Struct("domain_create_info",[ MemKB = UInt(64, init_val = "LIBXL_MEMKB_DEFAULT") +libxl_sched_credit_domain = Struct("sched_credit_domain", [ + ("weight", integer), + ("cap", integer), + ]) + +libxl_sched_credit2_domain = Struct("sched_credit2_domain", [ + ("weight", integer), + ]) + +libxl_sched_sedf_domain = Struct("sched_sedf_domain", [ + ("period", integer), + ("slice", integer), + ("latency", integer), + ("extratime", integer), + ("weight", integer), + ]) + +libxl_sched_arinc653_domain = Struct("sched_arinc653_domain", [ + ("weight", integer), + ]) + # 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 @@ -256,6 +277,13 @@ libxl_domain_build_info = Struct("domain_build_info",[ # extra parameters pass directly to qemu for HVM guest, NULL terminated ("extra_hvm", libxl_string_list), + ("us", KeyedUnion(None, libxl_scheduler, "sched", + [("credit", libxl_sched_credit_domain), + ("credit2", libxl_sched_credit2_domain), + ("sedf", libxl_sched_sedf_domain), + ("arinc653", libxl_sched_arinc653_domain), + ], keyvar_init_val = "-1")), + ("u", KeyedUnion(None, libxl_domain_type, "type", [("hvm", Struct(None, [("firmware", string), ("bios", libxl_bios_type), @@ -417,28 +445,12 @@ libxl_cputopology = Struct("cputopology", [ ("node", uint32), ], dir=DIR_OUT) -libxl_sched_credit_domain = Struct("sched_credit_domain", [ - ("weight", integer), - ("cap", integer), - ]) libxl_sched_credit_params = Struct("sched_credit_params", [ ("tslice_ms", integer), ("ratelimit_us", integer), ], dispose_fn=None) -libxl_sched_credit2_domain = Struct("sched_credit2_domain", [ - ("weight", integer), - ]) - -libxl_sched_sedf_domain = Struct("sched_sedf_domain", [ - ("period", integer), - ("slice", integer), - ("latency", integer), - ("extratime", integer), - ("weight", integer), - ]) - libxl_event_type = Enumeration("event_type", [ (1, "DOMAIN_SHUTDOWN"), (2, "DOMAIN_DEATH"), diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c index 5703512..811f1ac 100644 --- a/tools/libxl/xl_cmdimpl.c +++ b/tools/libxl/xl_cmdimpl.c @@ -587,6 +587,24 @@ 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->us.credit.weight = l; + b_info->us.credit2.weight = l; + b_info->us.sedf.weight = l; + } + + if (!xlu_cfg_get_long (config, "cap", &l, 0)) + b_info->us.credit.cap = l; + + if (!xlu_cfg_get_long (config, "period", &l, 0)) + b_info->us.sedf.period = l; + if (!xlu_cfg_get_long (config, "slice", &l, 0)) + b_info->us.sedf.period = l; + if (!xlu_cfg_get_long (config, "latency", &l, 0)) + b_info->us.sedf.period = l; + if (!xlu_cfg_get_long (config, "extratime", &l, 0)) + b_info->us.sedf.period = l; + if (!xlu_cfg_get_long (config, "vcpus", &l, 0)) { b_info->max_vcpus = l; b_info->cur_vcpus = (1 << l) - 1;