spin_unlock_irqrestore(&prv->lock, flags);
}
+static int __init
+csched_global_init(void)
+{
+ if ( sched_credit_tslice_ms > XEN_SYSCTL_CSCHED_TSLICE_MAX ||
+ sched_credit_tslice_ms < XEN_SYSCTL_CSCHED_TSLICE_MIN )
+ {
+ printk("WARNING: sched_credit_tslice_ms outside of valid range [%d,%d].\n"
+ " Resetting to default %u\n",
+ XEN_SYSCTL_CSCHED_TSLICE_MIN,
+ XEN_SYSCTL_CSCHED_TSLICE_MAX,
+ CSCHED_DEFAULT_TSLICE_MS);
+ sched_credit_tslice_ms = CSCHED_DEFAULT_TSLICE_MS;
+ }
+
+ if ( MICROSECS(sched_ratelimit_us) > MILLISECS(sched_credit_tslice_ms) )
+ printk("WARNING: sched_ratelimit_us >"
+ "sched_credit_tslice_ms is undefined\n"
+ "Setting ratelimit to tslice\n");
+
+ if ( vcpu_migration_delay_us > XEN_SYSCTL_CSCHED_MGR_DLY_MAX_US )
+ {
+ vcpu_migration_delay_us = 0;
+ printk("WARNING: vcpu_migration_delay outside of valid range [0,%d]us.\n"
+ "Resetting to default: %u\n",
+ XEN_SYSCTL_CSCHED_MGR_DLY_MAX_US, vcpu_migration_delay_us);
+ }
+
+ return 0;
+}
+
static int
csched_init(struct scheduler *ops)
{
INIT_LIST_HEAD(&prv->active_sdom);
prv->master = UINT_MAX;
- if ( sched_credit_tslice_ms > XEN_SYSCTL_CSCHED_TSLICE_MAX
- || sched_credit_tslice_ms < XEN_SYSCTL_CSCHED_TSLICE_MIN )
- {
- printk("WARNING: sched_credit_tslice_ms outside of valid range [%d,%d].\n"
- " Resetting to default %u\n",
- XEN_SYSCTL_CSCHED_TSLICE_MIN,
- XEN_SYSCTL_CSCHED_TSLICE_MAX,
- CSCHED_DEFAULT_TSLICE_MS);
- sched_credit_tslice_ms = CSCHED_DEFAULT_TSLICE_MS;
- }
-
__csched_set_tslice(prv, sched_credit_tslice_ms);
if ( MICROSECS(sched_ratelimit_us) > MILLISECS(sched_credit_tslice_ms) )
- {
- printk("WARNING: sched_ratelimit_us >"
- "sched_credit_tslice_ms is undefined\n"
- "Setting ratelimit to tslice\n");
prv->ratelimit = prv->tslice;
- }
else
prv->ratelimit = MICROSECS(sched_ratelimit_us);
- if ( vcpu_migration_delay_us > XEN_SYSCTL_CSCHED_MGR_DLY_MAX_US )
- {
- vcpu_migration_delay_us = 0;
- printk("WARNING: vcpu_migration_delay outside of valid range [0,%d]us.\n"
- "Resetting to default: %u\n",
- XEN_SYSCTL_CSCHED_MGR_DLY_MAX_US, vcpu_migration_delay_us);
- }
prv->vcpu_migr_delay = MICROSECS(vcpu_migration_delay_us);
return 0;
.sched_id = XEN_SCHEDULER_CREDIT,
.sched_data = NULL,
+ .global_init = csched_global_init,
+
.insert_vcpu = csched_vcpu_insert,
.remove_vcpu = csched_vcpu_remove,
};
static int __read_mostly opt_runqueue = OPT_RUNQUEUE_SOCKET;
-static int parse_credit2_runqueue(const char *s)
+static int __init parse_credit2_runqueue(const char *s)
{
unsigned int i;
return;
}
+static int __init
+csched2_global_init(void)
+{
+ if ( opt_load_precision_shift < LOADAVG_PRECISION_SHIFT_MIN )
+ {
+ printk("WARNING: %s: opt_load_precision_shift %u below min %d, resetting\n",
+ __func__, opt_load_precision_shift, LOADAVG_PRECISION_SHIFT_MIN);
+ opt_load_precision_shift = LOADAVG_PRECISION_SHIFT_MIN;
+ }
+
+ if ( opt_load_window_shift <= LOADAVG_GRANULARITY_SHIFT )
+ {
+ printk("WARNING: %s: opt_load_window_shift %u too short, resetting\n",
+ __func__, opt_load_window_shift);
+ opt_load_window_shift = LOADAVG_WINDOW_SHIFT;
+ }
+
+ if ( CSCHED2_BDGT_REPL_PERIOD < CSCHED2_MIN_TIMER )
+ {
+ printk("WARNING: %s: opt_cap_period %u too small, resetting\n",
+ __func__, opt_cap_period);
+ opt_cap_period = 10; /* ms */
+ }
+
+ return 0;
+}
+
static int
csched2_init(struct scheduler *ops)
{
opt_runqueue_str[opt_runqueue],
opt_cap_period);
- if ( opt_load_precision_shift < LOADAVG_PRECISION_SHIFT_MIN )
- {
- printk("WARNING: %s: opt_load_precision_shift %d below min %d, resetting\n",
- __func__, opt_load_precision_shift, LOADAVG_PRECISION_SHIFT_MIN);
- opt_load_precision_shift = LOADAVG_PRECISION_SHIFT_MIN;
- }
-
- if ( opt_load_window_shift <= LOADAVG_GRANULARITY_SHIFT )
- {
- printk("WARNING: %s: opt_load_window_shift %d too short, resetting\n",
- __func__, opt_load_window_shift);
- opt_load_window_shift = LOADAVG_WINDOW_SHIFT;
- }
printk(XENLOG_INFO "load tracking window length %llu ns\n",
1ULL << opt_load_window_shift);
- if ( CSCHED2_BDGT_REPL_PERIOD < CSCHED2_MIN_TIMER )
- {
- printk("WARNING: %s: opt_cap_period %d too small, resetting\n",
- __func__, opt_cap_period);
- opt_cap_period = 10; /* ms */
- }
-
/*
* Basically no CPU information is available at this point; just
* set up basic structures, and a callback when the CPU info is
.sched_id = XEN_SCHEDULER_CREDIT2,
.sched_data = NULL,
+ .global_init = csched2_global_init,
+
.insert_vcpu = csched2_vcpu_insert,
.remove_vcpu = csched2_vcpu_remove,