From: Juergen Gross Date: Tue, 28 May 2019 10:32:14 +0000 (+0200) Subject: xen/sched: only allow schedulers with all mandatory functions available X-Git-Tag: archive/raspbian/4.14.0+80-gd101b417b7-1+rpi1^2~63^2~2066 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=ec25b3c0261c5d2cd59b645004178313ac3fe974;p=xen.git 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 --- 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]; }