From ec25b3c0261c5d2cd59b645004178313ac3fe974 Mon Sep 17 00:00:00 2001 From: Juergen Gross Date: Tue, 28 May 2019 12:32:14 +0200 Subject: [PATCH] xen/sched: only allow schedulers with all mandatory functions available Some functions of struct scheduler are mandatory. Test those in the scheduler initialization loop to be present and drop schedulers not complying. Signed-off-by: Juergen Gross Reviewed-by: Dario Faggioli --- xen/common/schedule.c | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/xen/common/schedule.c b/xen/common/schedule.c index 86341bc8fb..b671aeadb7 100644 --- a/xen/common/schedule.c +++ b/xen/common/schedule.c @@ -1727,9 +1727,33 @@ void __init scheduler_init(void) for ( i = 0; i < NUM_SCHEDULERS; i++) { +#define sched_test_func(f) \ + if ( !schedulers[i]->f ) \ + { \ + printk("scheduler %s misses .%s, dropped\n", \ + schedulers[i]->opt_name, #f); \ + schedulers[i] = NULL; \ + } + + sched_test_func(init); + sched_test_func(deinit); + sched_test_func(pick_cpu); + sched_test_func(alloc_vdata); + sched_test_func(free_vdata); + sched_test_func(switch_sched); + sched_test_func(do_schedule); + +#undef sched_test_func + if ( schedulers[i]->global_init && schedulers[i]->global_init() < 0 ) + { + printk("scheduler %s failed initialization, dropped\n", + schedulers[i]->opt_name); schedulers[i] = NULL; - else if ( !ops.name && !strcmp(schedulers[i]->opt_name, opt_sched) ) + } + + if ( schedulers[i] && !ops.name && + !strcmp(schedulers[i]->opt_name, opt_sched) ) ops = *schedulers[i]; } -- 2.30.2