diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c index e63c7bd..706e282 100644 --- a/tools/libxl/libxl_create.c +++ b/tools/libxl/libxl_create.c @@ -110,6 +110,10 @@ int libxl__domain_build_info_setdefault(libxl__gc *gc, return ERROR_INVAL; } + if (!b_info->weight) + b_info->weight = 256; + if (!b_info->cap) + b_info->cap = 0; if (!b_info->max_vcpus) b_info->max_vcpus = 1; if (!b_info->cur_vcpus) diff --git a/tools/libxl/libxl_dom.c b/tools/libxl/libxl_dom.c index 0bdd654..f858a42 100644 --- a/tools/libxl/libxl_dom.c +++ b/tools/libxl/libxl_dom.c @@ -65,9 +65,38 @@ int libxl__build_pre(libxl__gc *gc, uint32_t domid, libxl_ctx *ctx = libxl__gc_owner(gc); int tsc_mode; char *xs_domid, *con_domid; + libxl_scheduler sched; + struct xen_domctl_scheduler_op sched_op; + 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); + + sched = libxl_get_scheduler (ctx); + + switch (sched) { + case LIBXL_SCHEDULER_SEDF: + xc_sedf_domain_get (ctx->xch, domid, &(sched_op.u.sedf.period), &(sched_op.u.sedf.slice), &(sched_op.u.sedf.latency), (uint16_t *) &(sched_op.u.sedf.extratime), (uint16_t *) &(sched_op.u.sedf.weight)); + sched_op.u.sedf.weight = info->weight; + xc_sedf_domain_set (ctx->xch, domid, sched_op.u.sedf.period, sched_op.u.sedf.slice, sched_op.u.sedf.latency, (uint16_t) sched_op.u.sedf.extratime, (uint16_t) sched_op.u.sedf.weight); + break; + case LIBXL_SCHEDULER_CREDIT: +// struct xen_domctl_sched_credit sdom; + sched_op.u.credit.weight = info->weight; + sched_op.u.credit.cap = info->cap; + xc_sched_credit_domain_set(ctx->xch, domid, &(sched_op.u.credit)); + break; + case LIBXL_SCHEDULER_CREDIT2: + sched_op.u.credit2.weight = info->weight; + xc_sched_credit2_domain_set(ctx->xch, domid, &(sched_op.u.credit2)); + break; + case LIBXL_SCHEDULER_ARINC653: + /* not implemented */ + break; + default: + abort(); + } + if (info->type == LIBXL_DOMAIN_TYPE_PV) xc_domain_set_memmap_limit(ctx->xch, domid, (info->max_memkb + info->u.pv.slack_memkb)); diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl index 5cf9708..f185d4c 100644 --- a/tools/libxl/libxl_types.idl +++ b/tools/libxl/libxl_types.idl @@ -232,6 +232,8 @@ MemKB = UInt(64, init_val = "LIBXL_MEMKB_DEFAULT") libxl_domain_build_info = Struct("domain_build_info",[ ("max_vcpus", integer), ("cur_vcpus", integer), + ("weight", integer), + ("cap", integer), ("cpumap", libxl_cpumap), ("tsc_mode", libxl_tsc_mode), ("max_memkb", MemKB), diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c index 5703512..d7dcb84 100644 --- a/tools/libxl/xl_cmdimpl.c +++ b/tools/libxl/xl_cmdimpl.c @@ -587,6 +587,11 @@ 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->weight = l; + if (!xlu_cfg_get_long (config, "cap", &l, 0)) + b_info->cap = l; + if (!xlu_cfg_get_long (config, "vcpus", &l, 0)) { b_info->max_vcpus = l; b_info->cur_vcpus = (1 << l) - 1;