[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 12/24] xen: libxc: allow to set the ratelimit value online
The main purpose of the patch is to provide the xen-libxc plumbing necessary to be able to change the value of the ratelimit_us parameter online, for Credit2 (like it is already for Credit1). While there: - mention in the Xen logs when rate limiting was enables and is being disabled (and vice-versa); - fix csched2_sys_cntl() which was always returning -EINVAL in the XEN_SYSCTL_SCHEDOP_putinfo case. And also: - fix style of an if in csched_sys_cntl(); - fix the style of the switch in csched2_sys_cntl(); Signed-off-by: Dario Faggioli <dario.faggioli@xxxxxxxxxx> --- Cc: George Dunlap <george.dunlap@xxxxxxxxxxxxx> Cc: Anshul Makkar <anshul.makkar@xxxxxxxxxx> Cc: Jan Beulich <jbeulich@xxxxxxxx> Cc: Ian Jackson <ian.jackson@xxxxxxxxxxxxx> Cc: Wei Liu <wei.liu2@xxxxxxxxxx> --- tools/libxc/include/xenctrl.h | 32 ++++++++++++++++++------------ tools/libxc/xc_csched2.c | 44 +++++++++++++++++++++++++++++++++++++++++ xen/common/sched_credit.c | 16 +++++++++------ xen/common/sched_credit2.c | 38 ++++++++++++++++++++--------------- xen/include/public/sysctl.h | 17 +++++++++++++--- 5 files changed, 108 insertions(+), 39 deletions(-) diff --git a/tools/libxc/include/xenctrl.h b/tools/libxc/include/xenctrl.h index 560ce7b..7a50895 100644 --- a/tools/libxc/include/xenctrl.h +++ b/tools/libxc/include/xenctrl.h @@ -910,25 +910,31 @@ int xc_sched_credit_domain_get(xc_interface *xch, uint32_t domid, struct xen_domctl_sched_credit *sdom); int xc_sched_credit_params_set(xc_interface *xch, - uint32_t cpupool_id, - struct xen_sysctl_credit_schedule *schedule); + uint32_t cpupool_id, + struct xen_sysctl_credit_schedule *schedule); int xc_sched_credit_params_get(xc_interface *xch, - uint32_t cpupool_id, - struct xen_sysctl_credit_schedule *schedule); + uint32_t cpupool_id, + struct xen_sysctl_credit_schedule *schedule); + +int xc_sched_credit2_params_set(xc_interface *xch, + uint32_t cpupool_id, + struct xen_sysctl_credit2_schedule *schedule); +int xc_sched_credit2_params_get(xc_interface *xch, + uint32_t cpupool_id, + struct xen_sysctl_credit2_schedule *schedule); int xc_sched_credit2_domain_set(xc_interface *xch, - uint32_t domid, - struct xen_domctl_sched_credit2 *sdom); - + uint32_t domid, + struct xen_domctl_sched_credit2 *sdom); int xc_sched_credit2_domain_get(xc_interface *xch, - uint32_t domid, - struct xen_domctl_sched_credit2 *sdom); + uint32_t domid, + struct xen_domctl_sched_credit2 *sdom); int xc_sched_rtds_domain_set(xc_interface *xch, - uint32_t domid, - struct xen_domctl_sched_rtds *sdom); + uint32_t domid, + struct xen_domctl_sched_rtds *sdom); int xc_sched_rtds_domain_get(xc_interface *xch, - uint32_t domid, - struct xen_domctl_sched_rtds *sdom); + uint32_t domid, + struct xen_domctl_sched_rtds *sdom); int xc_sched_rtds_vcpu_set(xc_interface *xch, uint32_t domid, struct xen_domctl_schedparam_vcpu *vcpus, diff --git a/tools/libxc/xc_csched2.c b/tools/libxc/xc_csched2.c index ed99605..5b62a5f 100644 --- a/tools/libxc/xc_csched2.c +++ b/tools/libxc/xc_csched2.c @@ -60,3 +60,47 @@ xc_sched_credit2_domain_get( return err; } + +int +xc_sched_credit2_params_set( + xc_interface *xch, + uint32_t cpupool_id, + struct xen_sysctl_credit2_schedule *schedule) +{ + DECLARE_SYSCTL; + + sysctl.cmd = XEN_SYSCTL_scheduler_op; + sysctl.u.scheduler_op.cpupool_id = cpupool_id; + sysctl.u.scheduler_op.sched_id = XEN_SCHEDULER_CREDIT2; + sysctl.u.scheduler_op.cmd = XEN_SYSCTL_SCHEDOP_putinfo; + + sysctl.u.scheduler_op.u.sched_credit2 = *schedule; + + if ( do_sysctl(xch, &sysctl) ) + return -1; + + *schedule = sysctl.u.scheduler_op.u.sched_credit2; + + return 0; +} + +int +xc_sched_credit2_params_get( + xc_interface *xch, + uint32_t cpupool_id, + struct xen_sysctl_credit2_schedule *schedule) +{ + DECLARE_SYSCTL; + + sysctl.cmd = XEN_SYSCTL_scheduler_op; + sysctl.u.scheduler_op.cpupool_id = cpupool_id; + sysctl.u.scheduler_op.sched_id = XEN_SCHEDULER_CREDIT2; + sysctl.u.scheduler_op.cmd = XEN_SYSCTL_SCHEDOP_getinfo; + + if ( do_sysctl(xch, &sysctl) ) + return -1; + + *schedule = sysctl.u.scheduler_op.u.sched_credit2; + + return 0; +} diff --git a/xen/common/sched_credit.c b/xen/common/sched_credit.c index f9d3ac9..14b207d 100644 --- a/xen/common/sched_credit.c +++ b/xen/common/sched_credit.c @@ -1203,16 +1203,20 @@ csched_sys_cntl(const struct scheduler *ops, switch ( sc->cmd ) { case XEN_SYSCTL_SCHEDOP_putinfo: - if (params->tslice_ms > XEN_SYSCTL_CSCHED_TSLICE_MAX - || params->tslice_ms < XEN_SYSCTL_CSCHED_TSLICE_MIN - || (params->ratelimit_us - && (params->ratelimit_us > XEN_SYSCTL_SCHED_RATELIMIT_MAX - || params->ratelimit_us < XEN_SYSCTL_SCHED_RATELIMIT_MIN)) - || MICROSECS(params->ratelimit_us) > MILLISECS(params->tslice_ms) ) + if ( params->tslice_ms > XEN_SYSCTL_CSCHED_TSLICE_MAX + || params->tslice_ms < XEN_SYSCTL_CSCHED_TSLICE_MIN + || (params->ratelimit_us + && (params->ratelimit_us > XEN_SYSCTL_SCHED_RATELIMIT_MAX + || params->ratelimit_us < XEN_SYSCTL_SCHED_RATELIMIT_MIN)) + || MICROSECS(params->ratelimit_us) > MILLISECS(params->tslice_ms) ) goto out; spin_lock_irqsave(&prv->lock, flags); __csched_set_tslice(prv, params->tslice_ms); + if ( !prv->ratelimit_us && params->ratelimit_us ) + printk(XENLOG_INFO "Enabling context switch rate limiting\n"); + else if ( prv->ratelimit_us && !params->ratelimit_us ) + printk(XENLOG_INFO "Disabling context switch rate limiting\n"); prv->ratelimit_us = params->ratelimit_us; spin_unlock_irqrestore(&prv->lock, flags); diff --git a/xen/common/sched_credit2.c b/xen/common/sched_credit2.c index c8396a8..0d83bd7 100644 --- a/xen/common/sched_credit2.c +++ b/xen/common/sched_credit2.c @@ -2020,29 +2020,33 @@ csched2_dom_cntl( static int csched2_sys_cntl(const struct scheduler *ops, struct xen_sysctl_scheduler_op *sc) { - int rc = -EINVAL; - xen_sysctl_credit_schedule_t *params = &sc->u.sched_credit; + xen_sysctl_credit2_schedule_t *params = &sc->u.sched_credit2; struct csched2_private *prv = CSCHED2_PRIV(ops); unsigned long flags; switch (sc->cmd ) { - case XEN_SYSCTL_SCHEDOP_putinfo: - if ( params->ratelimit_us && - ( params->ratelimit_us > XEN_SYSCTL_SCHED_RATELIMIT_MAX || - params->ratelimit_us < XEN_SYSCTL_SCHED_RATELIMIT_MIN )) - return rc; - write_lock_irqsave(&prv->lock, flags); - prv->ratelimit_us = params->ratelimit_us; - write_unlock_irqrestore(&prv->lock, flags); - break; - - case XEN_SYSCTL_SCHEDOP_getinfo: - params->ratelimit_us = prv->ratelimit_us; - rc = 0; - break; + case XEN_SYSCTL_SCHEDOP_putinfo: + if ( params->ratelimit_us && + (params->ratelimit_us > XEN_SYSCTL_SCHED_RATELIMIT_MAX || + params->ratelimit_us < XEN_SYSCTL_SCHED_RATELIMIT_MIN )) + return -EINVAL; + + write_lock_irqsave(&prv->lock, flags); + if ( !prv->ratelimit_us && params->ratelimit_us ) + printk(XENLOG_INFO "Enabling context switch rate limiting\n"); + else if ( prv->ratelimit_us && !params->ratelimit_us ) + printk(XENLOG_INFO "Disabling context switch rate limiting\n"); + prv->ratelimit_us = params->ratelimit_us; + write_unlock_irqrestore(&prv->lock, flags); + + /* FALLTHRU */ + case XEN_SYSCTL_SCHEDOP_getinfo: + params->ratelimit_us = prv->ratelimit_us; + break; } - return rc; + + return 0; } static void * diff --git a/xen/include/public/sysctl.h b/xen/include/public/sysctl.h index 8197c14..fd0fa67 100644 --- a/xen/include/public/sysctl.h +++ b/xen/include/public/sysctl.h @@ -623,19 +623,29 @@ struct xen_sysctl_arinc653_schedule { typedef struct xen_sysctl_arinc653_schedule xen_sysctl_arinc653_schedule_t; DEFINE_XEN_GUEST_HANDLE(xen_sysctl_arinc653_schedule_t); +/* + * Valid range for context switch rate limit (in microseconds). + * Applicable to Credit and Credit2 schedulers. + */ +#define XEN_SYSCTL_SCHED_RATELIMIT_MAX 500000 +#define XEN_SYSCTL_SCHED_RATELIMIT_MIN 100 + struct xen_sysctl_credit_schedule { /* Length of timeslice in milliseconds */ #define XEN_SYSCTL_CSCHED_TSLICE_MAX 1000 #define XEN_SYSCTL_CSCHED_TSLICE_MIN 1 unsigned tslice_ms; - /* Rate limit (minimum timeslice) in microseconds */ -#define XEN_SYSCTL_SCHED_RATELIMIT_MAX 500000 -#define XEN_SYSCTL_SCHED_RATELIMIT_MIN 100 unsigned ratelimit_us; }; typedef struct xen_sysctl_credit_schedule xen_sysctl_credit_schedule_t; DEFINE_XEN_GUEST_HANDLE(xen_sysctl_credit_schedule_t); +struct xen_sysctl_credit2_schedule { + unsigned ratelimit_us; +}; +typedef struct xen_sysctl_credit2_schedule xen_sysctl_credit2_schedule_t; +DEFINE_XEN_GUEST_HANDLE(xen_sysctl_credit2_schedule_t); + /* XEN_SYSCTL_scheduler_op */ /* Set or get info? */ #define XEN_SYSCTL_SCHEDOP_putinfo 0 @@ -649,6 +659,7 @@ struct xen_sysctl_scheduler_op { XEN_GUEST_HANDLE_64(xen_sysctl_arinc653_schedule_t) schedule; } sched_arinc653; struct xen_sysctl_credit_schedule sched_credit; + struct xen_sysctl_credit2_schedule sched_credit2; } u; }; typedef struct xen_sysctl_scheduler_op xen_sysctl_scheduler_op_t; _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |