@@ -2947,10 +2947,30 @@ void scheduler_enable(void)
scheduler_active = true;
}
+static inline
+const struct scheduler *__init sched_get_by_name(const char *sched_name)
+{
+ unsigned int i;
+
+ for ( i = 0; i < NUM_SCHEDULERS; i++ )
+ if ( schedulers[i] && !strcmp(schedulers[i]->opt_name, sched_name) )
+ return schedulers[i];
+
+ return NULL;
+}
+
+int __init sched_get_id_by_name(const char *sched_name)
+{
+ const struct scheduler *scheduler = sched_get_by_name(sched_name);
+
+ return scheduler ? scheduler->sched_id : -1;
+}
+
/* Initialise the data structures. */
void __init scheduler_init(void)
{
struct domain *idle_domain;
+ const struct scheduler *scheduler;
int i;
scheduler_enable();
@@ -2981,25 +3001,17 @@ void __init scheduler_init(void)
schedulers[i]->opt_name);
schedulers[i] = NULL;
}
-
- if ( schedulers[i] && !ops.name &&
- !strcmp(schedulers[i]->opt_name, opt_sched) )
- ops = *schedulers[i];
}
- if ( !ops.name )
+ scheduler = sched_get_by_name(opt_sched);
+ if ( !scheduler )
{
printk("Could not find scheduler: %s\n", opt_sched);
- for ( i = 0; i < NUM_SCHEDULERS; i++ )
- if ( schedulers[i] &&
- !strcmp(schedulers[i]->opt_name, CONFIG_SCHED_DEFAULT) )
- {
- ops = *schedulers[i];
- break;
- }
- BUG_ON(!ops.name);
- printk("Using '%s' (%s)\n", ops.name, ops.opt_name);
+ scheduler = sched_get_by_name(CONFIG_SCHED_DEFAULT);
+ BUG_ON(!scheduler);
+ printk("Using '%s' (%s)\n", scheduler->name, scheduler->opt_name);
}
+ ops = *scheduler;
if ( cpu_schedule_up(0) )
BUG();
@@ -764,6 +764,17 @@ void sched_destroy_domain(struct domain *d);
long sched_adjust(struct domain *, struct xen_domctl_scheduler_op *);
long sched_adjust_global(struct xen_sysctl_scheduler_op *);
int sched_id(void);
+
+/*
+ * sched_get_id_by_name - retrieves a scheduler id given a scheduler name
+ * @sched_name: scheduler name as a string
+ *
+ * returns:
+ * positive value being the scheduler id, on success
+ * negative value if the scheduler name is not found.
+ */
+int sched_get_id_by_name(const char *sched_name);
+
void vcpu_wake(struct vcpu *v);
long vcpu_yield(void);
void vcpu_sleep_nosync(struct vcpu *v);