* [PATCH] xen,credit1: Add variable timeslice
@ 2011-09-01 15:30 George Dunlap
2011-09-01 15:49 ` Tim Deegan
2011-09-13 9:25 ` George Dunlap
0 siblings, 2 replies; 5+ messages in thread
From: George Dunlap @ 2011-09-01 15:30 UTC (permalink / raw)
To: xen-devel; +Cc: george.dunlap
Add a xen command-line parameter, sched_credit_tslice_ms,
to set the timeslice of the credit1 scheduler.
Signed-off-by: George Dunlap <george.dunlap@eu.citrix.com>
diff -r 4a4882df5649 -r 782284c5b1bc xen/common/sched_credit.c
--- a/xen/common/sched_credit.c Wed Aug 31 15:23:49 2011 +0100
+++ b/xen/common/sched_credit.c Thu Sep 01 16:29:50 2011 +0100
@@ -41,15 +41,9 @@
*/
#define CSCHED_DEFAULT_WEIGHT 256
#define CSCHED_TICKS_PER_TSLICE 3
-#define CSCHED_TICKS_PER_ACCT 3
-#define CSCHED_MSECS_PER_TICK 10
-#define CSCHED_MSECS_PER_TSLICE \
- (CSCHED_MSECS_PER_TICK * CSCHED_TICKS_PER_TSLICE)
+/* Default timeslice: 30ms */
+#define CSCHED_DEFAULT_TSLICE_MS 30
#define CSCHED_CREDITS_PER_MSEC 10
-#define CSCHED_CREDITS_PER_TSLICE \
- (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)
/*
@@ -113,6 +107,8 @@
*/
static bool_t __read_mostly sched_credit_default_yield;
boolean_param("sched_credit_default_yield", sched_credit_default_yield);
+static int __read_mostly sched_credit_tslice_ms = CSCHED_DEFAULT_TSLICE_MS;
+integer_param("sched_credit_tslice_ms", sched_credit_tslice_ms);
/*
* Physical CPU
@@ -176,6 +172,9 @@ struct csched_private {
uint32_t credit;
int credit_balance;
uint32_t runq_sort;
+ /* Period of master and tick in milliseconds */
+ unsigned tslice_ms, tick_period_us, ticks_per_tslice;
+ unsigned credits_per_tslice;
};
static void csched_tick(void *_cpu);
@@ -326,7 +325,7 @@ csched_free_pdata(const struct scheduler
spin_lock_irqsave(&prv->lock, flags);
- prv->credit -= CSCHED_CREDITS_PER_ACCT;
+ prv->credit -= prv->credits_per_tslice;
prv->ncpus--;
cpu_clear(cpu, prv->idlers);
cpu_clear(cpu, prv->cpus);
@@ -360,19 +359,19 @@ csched_alloc_pdata(const struct schedule
spin_lock_irqsave(&prv->lock, flags);
/* Initialize/update system-wide config */
- prv->credit += CSCHED_CREDITS_PER_ACCT;
+ prv->credit += prv->credits_per_tslice;
prv->ncpus++;
cpu_set(cpu, prv->cpus);
if ( prv->ncpus == 1 )
{
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() + MILLISECS(prv->tslice_ms));
}
init_timer(&spc->ticker, csched_tick, (void *)(unsigned long)cpu, cpu);
- set_timer(&spc->ticker, NOW() + MILLISECS(CSCHED_MSECS_PER_TICK));
+ set_timer(&spc->ticker, NOW() + MICROSECS(prv->tick_period_us) );
INIT_LIST_HEAD(&spc->runq);
spc->runq_sort_last = prv->runq_sort;
@@ -1002,7 +1001,7 @@ csched_acct(void* dummy)
* for one full accounting period. We allow a domain to earn more
* only when the system-wide credit balance is negative.
*/
- credit_peak = sdom->active_vcpu_count * CSCHED_CREDITS_PER_ACCT;
+ credit_peak = sdom->active_vcpu_count * prv->credits_per_tslice;
if ( prv->credit_balance < 0 )
{
credit_peak += ( ( -prv->credit_balance
@@ -1014,7 +1013,7 @@ csched_acct(void* dummy)
if ( sdom->cap != 0U )
{
- credit_cap = ((sdom->cap * CSCHED_CREDITS_PER_ACCT) + 99) / 100;
+ credit_cap = ((sdom->cap * prv->credits_per_tslice) + 99) / 100;
if ( credit_cap < credit_peak )
credit_peak = credit_cap;
@@ -1092,10 +1091,10 @@ csched_acct(void* dummy)
}
/* Lower bound on credits */
- if ( credit < -CSCHED_CREDITS_PER_TSLICE )
+ if ( credit < -prv->credits_per_tslice )
{
CSCHED_STAT_CRANK(acct_min_credit);
- credit = -CSCHED_CREDITS_PER_TSLICE;
+ credit = -prv->credits_per_tslice;
atomic_set(&svc->credit, credit);
}
}
@@ -1117,7 +1116,7 @@ csched_acct(void* dummy)
}
/* Upper bound on credits means VCPU stops earning */
- if ( credit > CSCHED_CREDITS_PER_TSLICE )
+ if ( credit > prv->credits_per_tslice )
{
__csched_vcpu_acct_stop_locked(prv, svc);
/* Divide credits in half, so that when it starts
@@ -1141,8 +1140,8 @@ 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() + MILLISECS(prv->tslice_ms));
}
static void
@@ -1169,7 +1168,7 @@ csched_tick(void *_cpu)
*/
csched_runq_sort(prv, cpu);
- set_timer(&spc->ticker, NOW() + MILLISECS(CSCHED_MSECS_PER_TICK));
+ set_timer(&spc->ticker, NOW() + MICROSECS(prv->tick_period_us) );
}
static struct csched_vcpu *
@@ -1375,7 +1374,7 @@ csched_schedule(
* Return task to run next...
*/
ret.time = (is_idle_vcpu(snext->vcpu) ?
- -1 : MILLISECS(CSCHED_MSECS_PER_TSLICE));
+ -1 : MILLISECS(prv->tslice_ms));
ret.task = snext->vcpu;
CSCHED_VCPU_CHECK(ret.task);
@@ -1469,10 +1468,9 @@ csched_dump(const struct scheduler *ops)
"\tweight = %u\n"
"\trunq_sort = %u\n"
"\tdefault-weight = %d\n"
- "\tmsecs per tick = %dms\n"
+ "\ttslice = %dms\n"
"\tcredits per msec = %d\n"
"\tticks per tslice = %d\n"
- "\tticks per acct = %d\n"
"\tmigration delay = %uus\n",
prv->ncpus,
prv->master,
@@ -1481,10 +1479,9 @@ csched_dump(const struct scheduler *ops)
prv->weight,
prv->runq_sort,
CSCHED_DEFAULT_WEIGHT,
- CSCHED_MSECS_PER_TICK,
+ prv->tslice_ms,
CSCHED_CREDITS_PER_MSEC,
- CSCHED_TICKS_PER_TSLICE,
- CSCHED_TICKS_PER_ACCT,
+ prv->ticks_per_tslice,
vcpu_migration_delay);
cpumask_scnprintf(idlers_buf, sizeof(idlers_buf), prv->idlers);
@@ -1526,6 +1523,13 @@ csched_init(struct scheduler *ops)
INIT_LIST_HEAD(&prv->active_sdom);
prv->master = UINT_MAX;
+ prv->tslice_ms = sched_credit_tslice_ms;
+ prv->ticks_per_tslice = CSCHED_TICKS_PER_TSLICE;
+ if ( prv->tslice_ms < prv->ticks_per_tslice )
+ prv->ticks_per_tslice = 1;
+ prv->tick_period_us = prv->tslice_ms * 1000 / prv->ticks_per_tslice;
+ prv->credits_per_tslice = CSCHED_CREDITS_PER_MSEC * prv->tslice_ms;
+
return 0;
}
@@ -1550,13 +1554,16 @@ static void csched_tick_suspend(const st
static void csched_tick_resume(const struct scheduler *ops, unsigned int cpu)
{
+ struct csched_private *prv;
struct csched_pcpu *spc;
uint64_t now = NOW();
spc = CSCHED_PCPU(cpu);
- set_timer(&spc->ticker, now + MILLISECS(CSCHED_MSECS_PER_TICK)
- - now % MILLISECS(CSCHED_MSECS_PER_TICK) );
+ prv = CSCHED_PRIV(ops);
+
+ set_timer(&spc->ticker, now + MICROSECS(prv->tick_period_us)
+ - now % MICROSECS(prv->tick_period_us) );
}
static struct csched_private _csched_priv;
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] xen,credit1: Add variable timeslice
2011-09-01 15:49 ` Tim Deegan
@ 2011-09-01 15:45 ` George Dunlap
0 siblings, 0 replies; 5+ messages in thread
From: George Dunlap @ 2011-09-01 15:45 UTC (permalink / raw)
To: Tim Deegan; +Cc: George Dunlap, xen-devel@lists.xensource.com
On Thu, 2011-09-01 at 16:49 +0100, Tim Deegan wrote:
> At 16:30 +0100 on 01 Sep (1314894626), George Dunlap wrote:
> > Add a xen command-line parameter, sched_credit_tslice_ms,
> > to set the timeslice of the credit1 scheduler.
>
> Does that really need to be set at boot time? It seem like sounething
> that should go through the credit scheduler's run-time interfaces.
Yes, setting at run-time would be convenient. But it involves a lot of
plumbing through to user-space tools that I don't have time to do at the
moment. (Hopefully sometime in the next few months, maybe before 4.2.)
-George
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] xen,credit1: Add variable timeslice
2011-09-01 15:30 [PATCH] xen,credit1: Add variable timeslice George Dunlap
@ 2011-09-01 15:49 ` Tim Deegan
2011-09-01 15:45 ` George Dunlap
2011-09-13 9:25 ` George Dunlap
1 sibling, 1 reply; 5+ messages in thread
From: Tim Deegan @ 2011-09-01 15:49 UTC (permalink / raw)
To: George Dunlap; +Cc: xen-devel
At 16:30 +0100 on 01 Sep (1314894626), George Dunlap wrote:
> Add a xen command-line parameter, sched_credit_tslice_ms,
> to set the timeslice of the credit1 scheduler.
Does that really need to be set at boot time? It seem like sounething
that should go through the credit scheduler's run-time interfaces.
Tim.
--
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] xen,credit1: Add variable timeslice
2011-09-01 15:30 [PATCH] xen,credit1: Add variable timeslice George Dunlap
2011-09-01 15:49 ` Tim Deegan
@ 2011-09-13 9:25 ` George Dunlap
2011-09-13 9:44 ` Keir Fraser
1 sibling, 1 reply; 5+ messages in thread
From: George Dunlap @ 2011-09-13 9:25 UTC (permalink / raw)
To: xen-devel; +Cc: george.dunlap, Tim Deegan, Keir Fraser
Ping?
On Thu, Sep 1, 2011 at 4:30 PM, George Dunlap
<george.dunlap@eu.citrix.com> wrote:
> Add a xen command-line parameter, sched_credit_tslice_ms,
> to set the timeslice of the credit1 scheduler.
>
> Signed-off-by: George Dunlap <george.dunlap@eu.citrix.com>
>
> diff -r 4a4882df5649 -r 782284c5b1bc xen/common/sched_credit.c
> --- a/xen/common/sched_credit.c Wed Aug 31 15:23:49 2011 +0100
> +++ b/xen/common/sched_credit.c Thu Sep 01 16:29:50 2011 +0100
> @@ -41,15 +41,9 @@
> */
> #define CSCHED_DEFAULT_WEIGHT 256
> #define CSCHED_TICKS_PER_TSLICE 3
> -#define CSCHED_TICKS_PER_ACCT 3
> -#define CSCHED_MSECS_PER_TICK 10
> -#define CSCHED_MSECS_PER_TSLICE \
> - (CSCHED_MSECS_PER_TICK * CSCHED_TICKS_PER_TSLICE)
> +/* Default timeslice: 30ms */
> +#define CSCHED_DEFAULT_TSLICE_MS 30
> #define CSCHED_CREDITS_PER_MSEC 10
> -#define CSCHED_CREDITS_PER_TSLICE \
> - (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)
>
>
> /*
> @@ -113,6 +107,8 @@
> */
> static bool_t __read_mostly sched_credit_default_yield;
> boolean_param("sched_credit_default_yield", sched_credit_default_yield);
> +static int __read_mostly sched_credit_tslice_ms = CSCHED_DEFAULT_TSLICE_MS;
> +integer_param("sched_credit_tslice_ms", sched_credit_tslice_ms);
>
> /*
> * Physical CPU
> @@ -176,6 +172,9 @@ struct csched_private {
> uint32_t credit;
> int credit_balance;
> uint32_t runq_sort;
> + /* Period of master and tick in milliseconds */
> + unsigned tslice_ms, tick_period_us, ticks_per_tslice;
> + unsigned credits_per_tslice;
> };
>
> static void csched_tick(void *_cpu);
> @@ -326,7 +325,7 @@ csched_free_pdata(const struct scheduler
>
> spin_lock_irqsave(&prv->lock, flags);
>
> - prv->credit -= CSCHED_CREDITS_PER_ACCT;
> + prv->credit -= prv->credits_per_tslice;
> prv->ncpus--;
> cpu_clear(cpu, prv->idlers);
> cpu_clear(cpu, prv->cpus);
> @@ -360,19 +359,19 @@ csched_alloc_pdata(const struct schedule
> spin_lock_irqsave(&prv->lock, flags);
>
> /* Initialize/update system-wide config */
> - prv->credit += CSCHED_CREDITS_PER_ACCT;
> + prv->credit += prv->credits_per_tslice;
> prv->ncpus++;
> cpu_set(cpu, prv->cpus);
> if ( prv->ncpus == 1 )
> {
> 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() + MILLISECS(prv->tslice_ms));
> }
>
> init_timer(&spc->ticker, csched_tick, (void *)(unsigned long)cpu, cpu);
> - set_timer(&spc->ticker, NOW() + MILLISECS(CSCHED_MSECS_PER_TICK));
> + set_timer(&spc->ticker, NOW() + MICROSECS(prv->tick_period_us) );
>
> INIT_LIST_HEAD(&spc->runq);
> spc->runq_sort_last = prv->runq_sort;
> @@ -1002,7 +1001,7 @@ csched_acct(void* dummy)
> * for one full accounting period. We allow a domain to earn more
> * only when the system-wide credit balance is negative.
> */
> - credit_peak = sdom->active_vcpu_count * CSCHED_CREDITS_PER_ACCT;
> + credit_peak = sdom->active_vcpu_count * prv->credits_per_tslice;
> if ( prv->credit_balance < 0 )
> {
> credit_peak += ( ( -prv->credit_balance
> @@ -1014,7 +1013,7 @@ csched_acct(void* dummy)
>
> if ( sdom->cap != 0U )
> {
> - credit_cap = ((sdom->cap * CSCHED_CREDITS_PER_ACCT) + 99) / 100;
> + credit_cap = ((sdom->cap * prv->credits_per_tslice) + 99) / 100;
> if ( credit_cap < credit_peak )
> credit_peak = credit_cap;
>
> @@ -1092,10 +1091,10 @@ csched_acct(void* dummy)
> }
>
> /* Lower bound on credits */
> - if ( credit < -CSCHED_CREDITS_PER_TSLICE )
> + if ( credit < -prv->credits_per_tslice )
> {
> CSCHED_STAT_CRANK(acct_min_credit);
> - credit = -CSCHED_CREDITS_PER_TSLICE;
> + credit = -prv->credits_per_tslice;
> atomic_set(&svc->credit, credit);
> }
> }
> @@ -1117,7 +1116,7 @@ csched_acct(void* dummy)
> }
>
> /* Upper bound on credits means VCPU stops earning */
> - if ( credit > CSCHED_CREDITS_PER_TSLICE )
> + if ( credit > prv->credits_per_tslice )
> {
> __csched_vcpu_acct_stop_locked(prv, svc);
> /* Divide credits in half, so that when it starts
> @@ -1141,8 +1140,8 @@ 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() + MILLISECS(prv->tslice_ms));
> }
>
> static void
> @@ -1169,7 +1168,7 @@ csched_tick(void *_cpu)
> */
> csched_runq_sort(prv, cpu);
>
> - set_timer(&spc->ticker, NOW() + MILLISECS(CSCHED_MSECS_PER_TICK));
> + set_timer(&spc->ticker, NOW() + MICROSECS(prv->tick_period_us) );
> }
>
> static struct csched_vcpu *
> @@ -1375,7 +1374,7 @@ csched_schedule(
> * Return task to run next...
> */
> ret.time = (is_idle_vcpu(snext->vcpu) ?
> - -1 : MILLISECS(CSCHED_MSECS_PER_TSLICE));
> + -1 : MILLISECS(prv->tslice_ms));
> ret.task = snext->vcpu;
>
> CSCHED_VCPU_CHECK(ret.task);
> @@ -1469,10 +1468,9 @@ csched_dump(const struct scheduler *ops)
> "\tweight = %u\n"
> "\trunq_sort = %u\n"
> "\tdefault-weight = %d\n"
> - "\tmsecs per tick = %dms\n"
> + "\ttslice = %dms\n"
> "\tcredits per msec = %d\n"
> "\tticks per tslice = %d\n"
> - "\tticks per acct = %d\n"
> "\tmigration delay = %uus\n",
> prv->ncpus,
> prv->master,
> @@ -1481,10 +1479,9 @@ csched_dump(const struct scheduler *ops)
> prv->weight,
> prv->runq_sort,
> CSCHED_DEFAULT_WEIGHT,
> - CSCHED_MSECS_PER_TICK,
> + prv->tslice_ms,
> CSCHED_CREDITS_PER_MSEC,
> - CSCHED_TICKS_PER_TSLICE,
> - CSCHED_TICKS_PER_ACCT,
> + prv->ticks_per_tslice,
> vcpu_migration_delay);
>
> cpumask_scnprintf(idlers_buf, sizeof(idlers_buf), prv->idlers);
> @@ -1526,6 +1523,13 @@ csched_init(struct scheduler *ops)
> INIT_LIST_HEAD(&prv->active_sdom);
> prv->master = UINT_MAX;
>
> + prv->tslice_ms = sched_credit_tslice_ms;
> + prv->ticks_per_tslice = CSCHED_TICKS_PER_TSLICE;
> + if ( prv->tslice_ms < prv->ticks_per_tslice )
> + prv->ticks_per_tslice = 1;
> + prv->tick_period_us = prv->tslice_ms * 1000 / prv->ticks_per_tslice;
> + prv->credits_per_tslice = CSCHED_CREDITS_PER_MSEC * prv->tslice_ms;
> +
> return 0;
> }
>
> @@ -1550,13 +1554,16 @@ static void csched_tick_suspend(const st
>
> static void csched_tick_resume(const struct scheduler *ops, unsigned int cpu)
> {
> + struct csched_private *prv;
> struct csched_pcpu *spc;
> uint64_t now = NOW();
>
> spc = CSCHED_PCPU(cpu);
>
> - set_timer(&spc->ticker, now + MILLISECS(CSCHED_MSECS_PER_TICK)
> - - now % MILLISECS(CSCHED_MSECS_PER_TICK) );
> + prv = CSCHED_PRIV(ops);
> +
> + set_timer(&spc->ticker, now + MICROSECS(prv->tick_period_us)
> + - now % MICROSECS(prv->tick_period_us) );
> }
>
> static struct csched_private _csched_priv;
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel
>
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] xen,credit1: Add variable timeslice
2011-09-13 9:25 ` George Dunlap
@ 2011-09-13 9:44 ` Keir Fraser
0 siblings, 0 replies; 5+ messages in thread
From: Keir Fraser @ 2011-09-13 9:44 UTC (permalink / raw)
To: George Dunlap, xen-devel; +Cc: Tim Deegan
On 13/09/2011 10:25, "George Dunlap" <George.Dunlap@eu.citrix.com> wrote:
> Ping?
Now done.
-- Keir
> On Thu, Sep 1, 2011 at 4:30 PM, George Dunlap
> <george.dunlap@eu.citrix.com> wrote:
>> Add a xen command-line parameter, sched_credit_tslice_ms,
>> to set the timeslice of the credit1 scheduler.
>>
>> Signed-off-by: George Dunlap <george.dunlap@eu.citrix.com>
>>
>> diff -r 4a4882df5649 -r 782284c5b1bc xen/common/sched_credit.c
>> --- a/xen/common/sched_credit.c Wed Aug 31 15:23:49 2011 +0100
>> +++ b/xen/common/sched_credit.c Thu Sep 01 16:29:50 2011 +0100
>> @@ -41,15 +41,9 @@
>> */
>> #define CSCHED_DEFAULT_WEIGHT 256
>> #define CSCHED_TICKS_PER_TSLICE 3
>> -#define CSCHED_TICKS_PER_ACCT 3
>> -#define CSCHED_MSECS_PER_TICK 10
>> -#define CSCHED_MSECS_PER_TSLICE \
>> - (CSCHED_MSECS_PER_TICK * CSCHED_TICKS_PER_TSLICE)
>> +/* Default timeslice: 30ms */
>> +#define CSCHED_DEFAULT_TSLICE_MS 30
>> #define CSCHED_CREDITS_PER_MSEC 10
>> -#define CSCHED_CREDITS_PER_TSLICE \
>> - (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)
>>
>>
>> /*
>> @@ -113,6 +107,8 @@
>> */
>> static bool_t __read_mostly sched_credit_default_yield;
>> boolean_param("sched_credit_default_yield", sched_credit_default_yield);
>> +static int __read_mostly sched_credit_tslice_ms = CSCHED_DEFAULT_TSLICE_MS;
>> +integer_param("sched_credit_tslice_ms", sched_credit_tslice_ms);
>>
>> /*
>> * Physical CPU
>> @@ -176,6 +172,9 @@ struct csched_private {
>> uint32_t credit;
>> int credit_balance;
>> uint32_t runq_sort;
>> + /* Period of master and tick in milliseconds */
>> + unsigned tslice_ms, tick_period_us, ticks_per_tslice;
>> + unsigned credits_per_tslice;
>> };
>>
>> static void csched_tick(void *_cpu);
>> @@ -326,7 +325,7 @@ csched_free_pdata(const struct scheduler
>>
>> spin_lock_irqsave(&prv->lock, flags);
>>
>> - prv->credit -= CSCHED_CREDITS_PER_ACCT;
>> + prv->credit -= prv->credits_per_tslice;
>> prv->ncpus--;
>> cpu_clear(cpu, prv->idlers);
>> cpu_clear(cpu, prv->cpus);
>> @@ -360,19 +359,19 @@ csched_alloc_pdata(const struct schedule
>> spin_lock_irqsave(&prv->lock, flags);
>>
>> /* Initialize/update system-wide config */
>> - prv->credit += CSCHED_CREDITS_PER_ACCT;
>> + prv->credit += prv->credits_per_tslice;
>> prv->ncpus++;
>> cpu_set(cpu, prv->cpus);
>> if ( prv->ncpus == 1 )
>> {
>> 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() + MILLISECS(prv->tslice_ms));
>> }
>>
>> init_timer(&spc->ticker, csched_tick, (void *)(unsigned long)cpu, cpu);
>> - set_timer(&spc->ticker, NOW() + MILLISECS(CSCHED_MSECS_PER_TICK));
>> + set_timer(&spc->ticker, NOW() + MICROSECS(prv->tick_period_us) );
>>
>> INIT_LIST_HEAD(&spc->runq);
>> spc->runq_sort_last = prv->runq_sort;
>> @@ -1002,7 +1001,7 @@ csched_acct(void* dummy)
>> * for one full accounting period. We allow a domain to earn more
>> * only when the system-wide credit balance is negative.
>> */
>> - credit_peak = sdom->active_vcpu_count * CSCHED_CREDITS_PER_ACCT;
>> + credit_peak = sdom->active_vcpu_count * prv->credits_per_tslice;
>> if ( prv->credit_balance < 0 )
>> {
>> credit_peak += ( ( -prv->credit_balance
>> @@ -1014,7 +1013,7 @@ csched_acct(void* dummy)
>>
>> if ( sdom->cap != 0U )
>> {
>> - credit_cap = ((sdom->cap * CSCHED_CREDITS_PER_ACCT) + 99) / 100;
>> + credit_cap = ((sdom->cap * prv->credits_per_tslice) + 99) / 100;
>> if ( credit_cap < credit_peak )
>> credit_peak = credit_cap;
>>
>> @@ -1092,10 +1091,10 @@ csched_acct(void* dummy)
>> }
>>
>> /* Lower bound on credits */
>> - if ( credit < -CSCHED_CREDITS_PER_TSLICE )
>> + if ( credit < -prv->credits_per_tslice )
>> {
>> CSCHED_STAT_CRANK(acct_min_credit);
>> - credit = -CSCHED_CREDITS_PER_TSLICE;
>> + credit = -prv->credits_per_tslice;
>> atomic_set(&svc->credit, credit);
>> }
>> }
>> @@ -1117,7 +1116,7 @@ csched_acct(void* dummy)
>> }
>>
>> /* Upper bound on credits means VCPU stops earning */
>> - if ( credit > CSCHED_CREDITS_PER_TSLICE )
>> + if ( credit > prv->credits_per_tslice )
>> {
>> __csched_vcpu_acct_stop_locked(prv, svc);
>> /* Divide credits in half, so that when it starts
>> @@ -1141,8 +1140,8 @@ 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() + MILLISECS(prv->tslice_ms));
>> }
>>
>> static void
>> @@ -1169,7 +1168,7 @@ csched_tick(void *_cpu)
>> */
>> csched_runq_sort(prv, cpu);
>>
>> - set_timer(&spc->ticker, NOW() + MILLISECS(CSCHED_MSECS_PER_TICK));
>> + set_timer(&spc->ticker, NOW() + MICROSECS(prv->tick_period_us) );
>> }
>>
>> static struct csched_vcpu *
>> @@ -1375,7 +1374,7 @@ csched_schedule(
>> * Return task to run next...
>> */
>> ret.time = (is_idle_vcpu(snext->vcpu) ?
>> - -1 : MILLISECS(CSCHED_MSECS_PER_TSLICE));
>> + -1 : MILLISECS(prv->tslice_ms));
>> ret.task = snext->vcpu;
>>
>> CSCHED_VCPU_CHECK(ret.task);
>> @@ -1469,10 +1468,9 @@ csched_dump(const struct scheduler *ops)
>> "\tweight = %u\n"
>> "\trunq_sort = %u\n"
>> "\tdefault-weight = %d\n"
>> - "\tmsecs per tick = %dms\n"
>> + "\ttslice = %dms\n"
>> "\tcredits per msec = %d\n"
>> "\tticks per tslice = %d\n"
>> - "\tticks per acct = %d\n"
>> "\tmigration delay = %uus\n",
>> prv->ncpus,
>> prv->master,
>> @@ -1481,10 +1479,9 @@ csched_dump(const struct scheduler *ops)
>> prv->weight,
>> prv->runq_sort,
>> CSCHED_DEFAULT_WEIGHT,
>> - CSCHED_MSECS_PER_TICK,
>> + prv->tslice_ms,
>> CSCHED_CREDITS_PER_MSEC,
>> - CSCHED_TICKS_PER_TSLICE,
>> - CSCHED_TICKS_PER_ACCT,
>> + prv->ticks_per_tslice,
>> vcpu_migration_delay);
>>
>> cpumask_scnprintf(idlers_buf, sizeof(idlers_buf), prv->idlers);
>> @@ -1526,6 +1523,13 @@ csched_init(struct scheduler *ops)
>> INIT_LIST_HEAD(&prv->active_sdom);
>> prv->master = UINT_MAX;
>>
>> + prv->tslice_ms = sched_credit_tslice_ms;
>> + prv->ticks_per_tslice = CSCHED_TICKS_PER_TSLICE;
>> + if ( prv->tslice_ms < prv->ticks_per_tslice )
>> + prv->ticks_per_tslice = 1;
>> + prv->tick_period_us = prv->tslice_ms * 1000 / prv->ticks_per_tslice;
>> + prv->credits_per_tslice = CSCHED_CREDITS_PER_MSEC * prv->tslice_ms;
>> +
>> return 0;
>> }
>>
>> @@ -1550,13 +1554,16 @@ static void csched_tick_suspend(const st
>>
>> static void csched_tick_resume(const struct scheduler *ops, unsigned int
>> cpu)
>> {
>> + struct csched_private *prv;
>> struct csched_pcpu *spc;
>> uint64_t now = NOW();
>>
>> spc = CSCHED_PCPU(cpu);
>>
>> - set_timer(&spc->ticker, now + MILLISECS(CSCHED_MSECS_PER_TICK)
>> - - now % MILLISECS(CSCHED_MSECS_PER_TICK) );
>> + prv = CSCHED_PRIV(ops);
>> +
>> + set_timer(&spc->ticker, now + MICROSECS(prv->tick_period_us)
>> + - now % MICROSECS(prv->tick_period_us) );
>> }
>>
>> static struct csched_private _csched_priv;
>>
>> _______________________________________________
>> Xen-devel mailing list
>> Xen-devel@lists.xensource.com
>> http://lists.xensource.com/xen-devel
>>
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2011-09-13 9:44 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-09-01 15:30 [PATCH] xen,credit1: Add variable timeslice George Dunlap
2011-09-01 15:49 ` Tim Deegan
2011-09-01 15:45 ` George Dunlap
2011-09-13 9:25 ` George Dunlap
2011-09-13 9:44 ` Keir Fraser
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).