diff -r 76e1f7018b01 xen/common/sched_credit.c --- a/xen/common/sched_credit.c Mon Jan 31 08:10:00 2011 +0100 +++ b/xen/common/sched_credit.c Wed Feb 02 10:59:44 2011 +0100 @@ -50,6 +50,8 @@ (CSCHED_CREDITS_PER_MSEC * CSCHED_MSECS_PER_TSLICE) #define CSCHED_CREDITS_PER_ACCT \ (CSCHED_CREDITS_PER_MSEC * CSCHED_MSECS_PER_TICK * CSCHED_TICKS_PER_ACCT) +#define CSCHED_ACCT_TSLICE \ + (MILLISECS(CSCHED_MSECS_PER_TICK) * CSCHED_TICKS_PER_ACCT) /* @@ -320,6 +322,7 @@ csched_free_pdata(const struct scheduler struct csched_private *prv = CSCHED_PRIV(ops); struct csched_pcpu *spc = pcpu; unsigned long flags; + uint64_t now = NOW(); if ( spc == NULL ) return; @@ -334,6 +337,8 @@ csched_free_pdata(const struct scheduler { prv->master = first_cpu(prv->cpus); migrate_timer(&prv->master_ticker, prv->master); + set_timer(&prv->master_ticker, now + CSCHED_ACCT_TSLICE + - now % CSCHED_ACCT_TSLICE); } kill_timer(&spc->ticker); if ( prv->ncpus == 0 ) @@ -367,8 +372,7 @@ csched_alloc_pdata(const struct schedule { prv->master = cpu; init_timer(&prv->master_ticker, csched_acct, prv, cpu); - set_timer(&prv->master_ticker, NOW() + - MILLISECS(CSCHED_MSECS_PER_TICK) * CSCHED_TICKS_PER_ACCT); + set_timer(&prv->master_ticker, NOW() + CSCHED_ACCT_TSLICE); } init_timer(&spc->ticker, csched_tick, (void *)(unsigned long)cpu, cpu); @@ -1138,8 +1142,7 @@ csched_acct(void* dummy) prv->runq_sort++; out: - set_timer( &prv->master_ticker, NOW() + - MILLISECS(CSCHED_MSECS_PER_TICK) * CSCHED_TICKS_PER_ACCT ); + set_timer( &prv->master_ticker, NOW() + CSCHED_ACCT_TSLICE ); } static void @@ -1531,22 +1534,31 @@ csched_deinit(const struct scheduler *op static void csched_tick_suspend(const struct scheduler *ops, unsigned int cpu) { + struct csched_private *prv; struct csched_pcpu *spc; + prv = CSCHED_PRIV(ops); spc = CSCHED_PCPU(cpu); stop_timer(&spc->ticker); + if ( prv->master == cpu ) + stop_timer(&prv->master_ticker); } static void csched_tick_resume(const struct scheduler *ops, unsigned int cpu) { + struct csched_private *prv; struct csched_pcpu *spc; uint64_t now = NOW(); + prv = CSCHED_PRIV(ops); spc = CSCHED_PCPU(cpu); set_timer(&spc->ticker, now + MILLISECS(CSCHED_MSECS_PER_TICK) - now % MILLISECS(CSCHED_MSECS_PER_TICK) ); + if ( prv->master == cpu ) + set_timer(&prv->master_ticker, now + CSCHED_ACCT_TSLICE + - now % CSCHED_ACCT_TSLICE); } static struct csched_private _csched_priv;