[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] cleaned up some statistics code,
ChangeSet 1.1159.170.107, 2005/03/29 16:57:43+01:00, sd386@xxxxxxxxxxxxxxxxx cleaned up some statistics code, new domains are now best effort by default, fixed possible bug for best effort domains sched_sedf.c | 47 ++++++++++++++++++++++++++++++++++++++--------- 1 files changed, 38 insertions(+), 9 deletions(-) diff -Nru a/xen/common/sched_sedf.c b/xen/common/sched_sedf.c --- a/xen/common/sched_sedf.c 2005-05-09 14:05:05 -04:00 +++ b/xen/common/sched_sedf.c 2005-05-09 14:05:05 -04:00 @@ -15,10 +15,15 @@ //#include <xen/adv_sched_hist.h> -#define SEDFLEVEL 2 +//verbosity settings +#define SEDFLEVEL 0 #define PRINT(_f, _a...) \ if ((_f)<=SEDFLEVEL) printk(_a ); +#ifdef DEBUG + #define SEDF_STATS +#endif + //various ways of unblocking domains #define UNBLOCK_ISOCHRONOUS_EDF 1 #define UNBLOCK_EDF 2 @@ -81,15 +86,18 @@ s_time_t short_block_lost_tot; //Statistics + s_time_t extra_time_tot; + +#ifdef SEDF_STATS s_time_t block_time_tot; s_time_t penalty_time_tot; - s_time_t extra_time_tot; int block_tot; int short_block_tot; int long_block_tot; int short_cont; int pen_extra_blocks; int pen_extra_slices; +#endif }; struct sedf_cpu_info { @@ -181,7 +189,7 @@ static inline void extraq_check(struct domain *d) { if (extraq_on(d, EXTRA_UTIL_Q)) { PRINT(2,"Dom %i is on extraQ\n",d->id); - if (!(DOM_INFO(d)->extra & EXTRA_AWARE)) { + if (!(DOM_INFO(d)->extra & EXTRA_AWARE) && !extra_runs(DOM_INFO(d))) { extraq_del(d, EXTRA_UTIL_Q); PRINT(2,"Removed dom %i from L1 extraQ\n",d->id); } @@ -306,12 +314,12 @@ inf->extra = EXTRA_NONE;//EXTRA_AWARE; } else { - //other domains don't get any execution time at all in the beginning! + //other domains run in best effort mode inf->period = MILLISECS(20); inf->slice = 0; inf->absdead = 0; inf->latency = 0; - inf->extra = EXTRA_NONE;//EXTRA_AWARE + inf->extra = EXTRA_AWARE; } inf->period_orig = inf->period; inf->slice_orig = inf->slice; INIT_LIST_HEAD(&(inf->list)); @@ -481,7 +489,10 @@ #endif { //domain was running in L1 extraq => score is inverse of utilization and is used somewhat incremental! - inf->score[EXTRA_UTIL_Q] = (inf->period << 10) / inf->slice;//use fixed point arithmetic with 10 bits + if (inf->slice) + inf->score[EXTRA_UTIL_Q] = (inf->period << 10) / inf->slice;//use fixed point arithmetic with 10 bits + else + inf->score[EXTRA_UTIL_Q] = 2^10; } if (domain_runnable(d)) extraq_add_sort_update(d, i, oldscore); //add according to score: weighted round robin @@ -529,7 +540,9 @@ runinf->extra |= EXTRA_RUN_PEN; ret.task = runinf->owner; ret.time = EXTRA_QUANTUM; +#ifdef SEDF_STATS runinf->pen_extra_slices++; +#endif } else if (!list_empty(extraq[EXTRA_UTIL_Q])) { //use elements from the normal extraqueue @@ -729,8 +742,10 @@ //we don't have a reasonable amount of time in our slice left :( unblock_short_vcons(inf, now); //start in next period! } +#ifdef SEDF_STATS else inf->short_cont++; //we let the domain run in the current period +#endif } static inline void unblock_short_extra_support(struct sedf_dom_info* inf, s_time_t now) { /*this unblocking scheme tries to support the domain, by assigning it a priority in extratime distribution @@ -747,7 +762,9 @@ if (inf->short_block_lost_tot) { inf->score[0] = (inf->period << 10) / inf->short_block_lost_tot; +#ifdef SEDF_STATS inf->pen_extra_blocks++; +#endif if (extraq_on(inf->owner, EXTRA_PEN_Q)) extraq_del(inf->owner, EXTRA_PEN_Q); //remove domain for possible resorting! else //remember that we want to be on the penalty queue, @@ -791,7 +808,9 @@ inf->cputime += now - inf->absblock; //treat blocked time as consumed by the domain if (inf->cputime + EXTRA_QUANTUM <= inf->slice) { +#ifdef SEDF_STATS inf->short_cont++; //we let the domain run in the current period +#endif } else { //we don't have a reasonable amount of time in our slice left => switch to burst mode @@ -851,8 +870,7 @@ switch (get_run_type(cur)) { case DOMAIN_EDF: //check whether we need to make an earlier sched-decision - if ((PERIOD_BEGIN(other_inf) < schedule_data[other->processor].s_timer.expires) - && (other_inf->absdead < cur_inf->absdead)) + if ((PERIOD_BEGIN(other_inf) < schedule_data[other->processor].s_timer.expires)) return 1; else return 0; case DOMAIN_EXTRA_PEN: @@ -892,8 +910,9 @@ inf->absdead = now + inf->slice; //initial setup of the deadline PRINT(3,"waking up domain %i (deadl= %llu period= %llu now= %llu)\n",d->id,inf->absdead,inf->period,now); - +#ifdef SEDF_STATS inf->block_tot++; +#endif if (unlikely(now< PERIOD_BEGIN(inf))) { PRINT(4,"extratime unblock\n"); //this might happen, imagine unblocking in extra-time! @@ -917,7 +936,9 @@ if (now < inf->absdead) { PRINT(4,"short unblocking\n"); //short blocking +#ifdef SEDF_STATS inf->short_block_tot++; +#endif #if (UNBLOCK <= UNBLOCK_ATROPOS) unblock_short_vcons(inf, now); #elif (UNBLOCK == UNBLOCK_SHORT_RESUME) @@ -940,7 +961,9 @@ else { PRINT(4,"long unblocking\n"); //long blocking +#ifdef SEDF_STATS inf->long_block_tot++; +#endif //PRINT(3,"old=%llu ",inf->absdead); #if (UNBLOCK == UNBLOCK_ISOCHRONOUS_EDF) unblock_long_vcons(inf, now); @@ -973,18 +996,22 @@ __add_to_waitqueue_sort(d); PRINT(3,"added to waitq\n"); +#ifdef SEDF_STATS //do some statistics here... if (inf->absblock != 0) { inf->block_time_tot += now - inf->absblock; inf->penalty_time_tot += PERIOD_BEGIN(inf) + inf->cputime - inf->absblock; } +#endif //sanity check: make sure each extra-aware domain IS on the util-q! /*if (inf->extra & EXTRA_AWARE) { if (!extraq_on(d, EXTRA_UTIL_Q)) printf("sedf_wake: domain %i is extra-aware, but NOT on L1 extraq!\n",d->id); }*/ + //check whether the awakened task needs to get scheduled before the next sched. decision //and check, whether we are idling and this domain is extratime aware + //Save approximation: Always switch to scheduler! if (should_switch(schedule_data[d->processor].curr, d, now)){ #ifdef ADV_SCHED_HISTO adv_sched_hist_start(d->processor); @@ -1002,6 +1029,7 @@ DOM_INFO(d)->score[EXTRA_UTIL_Q], (DOM_INFO(d)->extra & EXTRA_AWARE) ? "yes" : "no", DOM_INFO(d)->extra_time_tot); if (d->cpu_time !=0) printf(" (%lu%)", (DOM_INFO(d)->extra_time_tot * 100) / d->cpu_time); +#ifdef SEDF_STATS if (DOM_INFO(d)->block_time_tot!=0) printf(" pen=%lu%", (DOM_INFO(d)->penalty_time_tot * 100) / DOM_INFO(d)->block_time_tot); if (DOM_INFO(d)->block_tot!=0) @@ -1012,6 +1040,7 @@ DOM_INFO(d)->long_block_tot, (DOM_INFO(d)->long_block_tot * 100) / DOM_INFO(d)->block_tot, (DOM_INFO(d)->block_time_tot) / DOM_INFO(d)->block_tot, (DOM_INFO(d)->penalty_time_tot) / DOM_INFO(d)->block_tot); +#endif printf("\n"); } _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |