[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] Merge freefall.cl.cam.ac.uk:/auto/groups/xeno/users/iap10/xeno-clone/xen-2.0-testing.bk
ChangeSet 1.1317, 2005/04/18 22:30:15+01:00, iap10@xxxxxxxxxxxxxxxxxxxxx Merge freefall.cl.cam.ac.uk:/auto/groups/xeno/users/iap10/xeno-clone/xen-2.0-testing.bk into freefall.cl.cam.ac.uk:/auto/groups/xeno/users/iap10/xeno-clone/xen-unstable.bk schedule.c | 314 +++++++++++++++++++++++++++++++++---------------------------- 1 files changed, 173 insertions(+), 141 deletions(-) diff -Nru a/xen/common/schedule.c b/xen/common/schedule.c --- a/xen/common/schedule.c 2005-04-18 21:05:03 -04:00 +++ b/xen/common/schedule.c 2005-04-18 21:05:03 -04:00 @@ -1,5 +1,4 @@ -/* -*- Mode:C; c-basic-offset:4; tab-width:4 -*- - **************************************************************************** +/**************************************************************************** * (C) 2002-2003 - Rolf Neugebauer - Intel Research Cambridge * (C) 2002-2003 University of Cambridge * (C) 2004 - Mark Williamson - Intel Research Cambridge @@ -14,6 +13,15 @@ * */ +/*#define WAKE_HISTO*/ +/*#define BLOCKTIME_HISTO*/ + +#if defined(WAKE_HISTO) +#define BUCKETS 31 +#elif defined(BLOCKTIME_HISTO) +#define BUCKETS 200 +#endif + #include <xen/config.h> #include <xen/init.h> #include <xen/lib.h> @@ -32,50 +40,19 @@ static char opt_sched[10] = "bvt"; string_param("sched", opt_sched); -/*#define WAKE_HISTO*/ -/*#define BLOCKTIME_HISTO*/ - -#if defined(WAKE_HISTO) -#define BUCKETS 31 -#elif defined(BLOCKTIME_HISTO) -#define BUCKETS 200 -#endif - #define TIME_SLOP (s32)MICROSECS(50) /* allow time to slip a bit */ -/* - * TODO MAW pull trace-related #defines out of here and into an auto-generated - * header file later on! - */ -#define TRC_SCHED_DOM_ADD 0x00010000 -#define TRC_SCHED_DOM_REM 0x00010001 -#define TRC_SCHED_WAKE 0x00010002 -#define TRC_SCHED_BLOCK 0x00010003 -#define TRC_SCHED_YIELD 0x00010004 -#define TRC_SCHED_SET_TIMER 0x00010005 -#define TRC_SCHED_CTL 0x00010006 -#define TRC_SCHED_ADJDOM 0x00010007 -#define TRC_SCHED_RESCHED 0x00010008 -#define TRC_SCHED_SWITCH 0x00010009 -#define TRC_SCHED_S_TIMER_FN 0x0001000A -#define TRC_SCHED_T_TIMER_FN 0x0001000B -#define TRC_SCHED_DOM_TIMER_FN 0x0001000C - /* Various timer handlers. */ static void s_timer_fn(unsigned long unused); static void t_timer_fn(unsigned long unused); static void dom_timer_fn(unsigned long data); /* This is global for now so that private implementations can reach it */ -schedule_data_t schedule_data[NR_CPUS]; +struct schedule_data schedule_data[NR_CPUS]; extern struct scheduler sched_bvt_def; -extern struct scheduler sched_rrobin_def; -extern struct scheduler sched_atropos_def; static struct scheduler *schedulers[] = { &sched_bvt_def, - &sched_rrobin_def, - &sched_atropos_def, NULL }; @@ -92,59 +69,113 @@ void free_domain_struct(struct domain *d) { + int i; + SCHED_OP(free_task, d); - arch_free_domain_struct(d); + for (i = 0; i < MAX_VIRT_CPUS; i++) + if ( d->exec_domain[i] ) + arch_free_exec_domain_struct(d->exec_domain[i]); + + xfree(d); +} + +struct exec_domain *alloc_exec_domain_struct(struct domain *d, + unsigned long vcpu) +{ + struct exec_domain *ed, *edc; + + ASSERT( d->exec_domain[vcpu] == NULL ); + + if ( (ed = arch_alloc_exec_domain_struct()) == NULL ) + return NULL; + + memset(ed, 0, sizeof(*ed)); + + d->exec_domain[vcpu] = ed; + ed->domain = d; + ed->eid = vcpu; + + if ( SCHED_OP(alloc_task, ed) < 0 ) + goto out; + + if (vcpu != 0) { + ed->vcpu_info = &d->shared_info->vcpu_data[ed->eid]; + + for_each_exec_domain(d, edc) { + if (edc->ed_next_list == NULL || edc->ed_next_list->eid > vcpu) + break; + } + ed->ed_next_list = edc->ed_next_list; + edc->ed_next_list = ed; + + if (test_bit(EDF_CPUPINNED, &edc->ed_flags)) { + ed->processor = (edc->processor + 1) % smp_num_cpus; + set_bit(EDF_CPUPINNED, &ed->ed_flags); + } else { + ed->processor = (edc->processor + 1) % smp_num_cpus; /* XXX */ + } + } + + return ed; + + out: + d->exec_domain[vcpu] = NULL; + arch_free_exec_domain_struct(ed); + + return NULL; } struct domain *alloc_domain_struct(void) { struct domain *d; - if ( (d = arch_alloc_domain_struct()) == NULL ) + if ( (d = xmalloc(struct domain)) == NULL ) return NULL; memset(d, 0, sizeof(*d)); - if ( SCHED_OP(alloc_task, d) < 0 ) - { - arch_free_domain_struct(d); - return NULL; - } + if ( alloc_exec_domain_struct(d, 0) == NULL ) + goto out; return d; + + out: + xfree(d); + return NULL; } /* * Add and remove a domain */ -void sched_add_domain(struct domain *d) +void sched_add_domain(struct exec_domain *ed) { + struct domain *d = ed->domain; + /* Must be unpaused by control software to start execution. */ - set_bit(DF_CTRLPAUSE, &d->flags); + set_bit(EDF_CTRLPAUSE, &ed->ed_flags); if ( d->id != IDLE_DOMAIN_ID ) { /* Initialise the per-domain timer. */ - init_ac_timer(&d->timer); - d->timer.cpu = d->processor; - d->timer.data = (unsigned long)d; - d->timer.function = &dom_timer_fn; + init_ac_timer(&ed->timer); + ed->timer.cpu = ed->processor; + ed->timer.data = (unsigned long)ed; + ed->timer.function = &dom_timer_fn; } else { - schedule_data[d->processor].idle = d; + schedule_data[ed->processor].idle = ed; } - SCHED_OP(add_task, d); - - TRACE_2D(TRC_SCHED_DOM_ADD, d->id, d); + SCHED_OP(add_task, ed); + TRACE_2D(TRC_SCHED_DOM_ADD, d->id, ed->eid); } -void sched_rem_domain(struct domain *d) +void sched_rem_domain(struct exec_domain *ed) { - rem_ac_timer(&d->timer); - SCHED_OP(rem_task, d); - TRACE_2D(TRC_SCHED_DOM_REM, d->id, d); + rem_ac_timer(&ed->timer); + SCHED_OP(rem_task, ed); + TRACE_2D(TRC_SCHED_DOM_REM, ed->domain->id, ed->eid); } void init_idle_task(void) @@ -153,57 +184,64 @@ BUG(); } -void domain_sleep(struct domain *d) +void domain_sleep(struct exec_domain *ed) { unsigned long flags; - spin_lock_irqsave(&schedule_data[d->processor].schedule_lock, flags); + spin_lock_irqsave(&schedule_data[ed->processor].schedule_lock, flags); + if ( likely(!domain_runnable(ed)) ) + SCHED_OP(sleep, ed); + spin_unlock_irqrestore(&schedule_data[ed->processor].schedule_lock, flags); - if ( likely(!domain_runnable(d)) ) - SCHED_OP(sleep, d); - - spin_unlock_irqrestore(&schedule_data[d->processor].schedule_lock, flags); + TRACE_2D(TRC_SCHED_SLEEP, ed->domain->id, ed->eid); /* Synchronous. */ - while ( test_bit(DF_RUNNING, &d->flags) && !domain_runnable(d) ) + while ( test_bit(EDF_RUNNING, &ed->ed_flags) && !domain_runnable(ed) ) cpu_relax(); } -void domain_wake(struct domain *d) +void domain_wake(struct exec_domain *ed) { unsigned long flags; - spin_lock_irqsave(&schedule_data[d->processor].schedule_lock, flags); - - if ( likely(domain_runnable(d)) ) + spin_lock_irqsave(&schedule_data[ed->processor].schedule_lock, flags); + if ( likely(domain_runnable(ed)) ) _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |