By applying this patch, the credit scheduler subtracts accurately credit
consumed and sets correctly priority.
CSCHED_CREDITS_PER_TICK is changed from 100 to 10000, because vcpu's
credit is subtracted in csched_schedule().
The difference between this patch and last patch is that start_time
variable was moved from csched_vcpu structure to csched_pcpu structure.
Best regards,
Naoki Nishiguchi
diff -r 6595393a3d28 xen/common/sched_credit.c
--- a/xen/common/sched_credit.c Tue Dec 09 16:28:02 2008 +0000
+++ b/xen/common/sched_credit.c Tue Dec 16 19:15:18 2008 +0900
@@ -42,7 +42,7 @@
#define CSCHED_MSECS_PER_TICK 10
#define CSCHED_MSECS_PER_TSLICE \
(CSCHED_MSECS_PER_TICK * CSCHED_TICKS_PER_TSLICE)
-#define CSCHED_CREDITS_PER_TICK 100
+#define CSCHED_CREDITS_PER_TICK 10000
#define CSCHED_CREDITS_PER_TSLICE \
(CSCHED_CREDITS_PER_TICK * CSCHED_TICKS_PER_TSLICE)
#define CSCHED_CREDITS_PER_ACCT \
@@ -188,6 +188,7 @@ struct csched_pcpu {
uint32_t runq_sort_last;
struct timer ticker;
unsigned int tick;
+ s_time_t start_time;
};
/*
@@ -545,11 +546,6 @@ csched_vcpu_acct(unsigned int cpu)
svc->pri = CSCHED_PRI_TS_UNDER;
/*
- * Update credits
- */
- atomic_sub(CSCHED_CREDITS_PER_TICK, &svc->credit);
-
- /*
* Put this VCPU and domain back on the active list if it was
* idling.
*
@@ -1168,12 +1164,27 @@ csched_schedule(s_time_t now)
{
const int cpu = smp_processor_id();
struct list_head * const runq = RUNQ(cpu);
+ struct csched_pcpu * const spc = CSCHED_PCPU(cpu);
struct csched_vcpu * const scurr = CSCHED_VCPU(current);
struct csched_vcpu *snext;
struct task_slice ret;
+ s_time_t passed = now - spc->start_time;
+ int consumed;
CSCHED_STAT_CRANK(schedule);
CSCHED_VCPU_CHECK(current);
+
+ /*
+ * Update credit
+ */
+ consumed = ( passed +
+ (MILLISECS(CSCHED_MSECS_PER_TSLICE) /
+ CSCHED_CREDITS_PER_TSLICE - 1)
+ ) /
+ ( MILLISECS(CSCHED_MSECS_PER_TSLICE) /
+ CSCHED_CREDITS_PER_TSLICE );
+ if ( consumed > 0 && !is_idle_vcpu(current) )
+ atomic_sub(consumed, &scurr->credit);
/*
* Select next runnable local VCPU (ie top of local runq)
@@ -1217,6 +1228,8 @@ csched_schedule(s_time_t now)
*/
ret.time = MILLISECS(CSCHED_MSECS_PER_TSLICE);
ret.task = snext->vcpu;
+
+ spc->start_time = now;
CSCHED_VCPU_CHECK(ret.task);
return ret;
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|