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,
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;
+}
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);
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 *
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
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;