X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmm_scheduler.c;h=25a84fc192b17d0debabc028b74f657da231c8d1;hb=c17cafcb6db943bd5bbb31d86f0392c113b2d668;hp=36286cf27689b029bc7e7604ed28a24ce78ca965;hpb=df510a069624b48dda1ad66368954f028757b1bc;p=palacios.git diff --git a/palacios/src/palacios/vmm_scheduler.c b/palacios/src/palacios/vmm_scheduler.c index 36286cf..25a84fc 100644 --- a/palacios/src/palacios/vmm_scheduler.c +++ b/palacios/src/palacios/vmm_scheduler.c @@ -7,8 +7,9 @@ * and the University of New Mexico. You can find out more at * http://www.v3vee.org * - * Copyright (c) 2008, Jack Lange - * Copyright (c) 2008, The V3VEE Project + * Copyright (c) 2013, Oscar Mondragon + * Copyright (c) 2013, Patrick G. Bridges + * Copyright (c) 2013, The V3VEE Project * All rights reserved. * * Author: Oscar Mondragon @@ -63,8 +64,6 @@ int v3_register_scheduler(struct vm_scheduler_impl *s) { PrintError(VM_NONE, VCORE_NONE, "Multiple instances of scheduler (%s)\n", s->name); return -1; } - PrintDebug(VM_NONE, VCORE_NONE,"Registering Scheduler (%s) 2\n", s->name); - if (v3_htable_insert(master_scheduler_table, (addr_t)(s->name), @@ -73,7 +72,6 @@ int v3_register_scheduler(struct vm_scheduler_impl *s) { return -1; } - PrintDebug(VM_NONE, VCORE_NONE,"Scheduler registered\n"); return 0; } @@ -83,12 +81,26 @@ struct vm_scheduler_impl *v3_scheduler_lookup(char *name) } int V3_enable_scheduler() { - /* XXX Lookup the specified scheduler to use for palacios and use it */ - scheduler = v3_scheduler_lookup(default_strategy); + char *sched_name; + + scheduler = NULL; + sched_name = v3_lookup_option("scheduler"); + + if (sched_name) { + scheduler = v3_scheduler_lookup(sched_name); + } + + if (!scheduler) { + scheduler = v3_scheduler_lookup(default_strategy); + } + if (!scheduler) { PrintError(VM_NONE, VCORE_NONE,"Specified Palacios scheduler \"%s\" not found.\n", default_strategy); return -1; } + + PrintDebug(VM_NONE, VCORE_NONE,"Scheduler %s found",scheduler->name); + if (scheduler->init) { return scheduler->init(); } else { @@ -207,9 +219,11 @@ void host_sched_yield(struct guest_info * core, int usec) { } else { V3_Sleep(usec); } - yield_start_cycle = (uint64_t) core->sched_priv_data - + (uint64_t)core->vm_info->sched_priv_data; - core->sched_priv_data = (void *)yield_start_cycle; + if(core){ + yield_start_cycle = (uint64_t) core->sched_priv_data + + (uint64_t)core->vm_info->sched_priv_data; + core->sched_priv_data = (void *)yield_start_cycle; + } }