[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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.