|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 5 of 6] xen: sched_sedf: beautify statisics in SEDF
By gathering all the related fields in a struct (as it is being done
in credit) and using the macros we now have available. No functional
changes involved.
Signed-off-by: Dario Faggioli <dario.faggioli@xxxxxxxxxx>
diff --git a/xen/common/sched_sedf.c b/xen/common/sched_sedf.c
--- a/xen/common/sched_sedf.c
+++ b/xen/common/sched_sedf.c
@@ -14,7 +14,6 @@
#include <xen/errno.h>
#ifndef NDEBUG
-#define SEDF_STATS
#define CHECK(_p) \
do { \
if ( !(_p) ) \
@@ -45,6 +44,37 @@
#define IMPLY(a, b) (!(a) || (b))
#define EQ(a, b) ((!!(a)) == (!!(b)))
+/*
+ * SEDF_STATS
+ *
+ * Some statistics about vCPU execution.
+ *
+ * Some of them are displayed with runq dumps
+ * ('r' on the Xen console).
+ */
+#ifdef SCHED_STATS
+
+#define SEDF_STATS
+
+#define SCHED_VCPU_STATS_RESET(_V) \
+ do \
+ { \
+ memset(&(_V)->stats, 0, sizeof((_V)->stats)); \
+ } while ( 0 )
+
+#define SCHED_VCPU_STAT_CRANK(_V, _X) (((_V)->stats._X)++)
+
+/*#define SCHED_VCPU_STAT_SET(_V, _X, _Y) (((_V)->stats._X) = (_Y))*/
+
+#else /* !SCHED_STATS */
+
+#undef SEDF_STATS
+
+#define SCHED_VCPU_STATS_RESET(_V) do {} while ( 0 )
+#define SCHED_VCPU_STAT_CRANK(_V, _X) do {} while ( 0 )
+/*#define SCHED_VCPU_STAT_SET(_V, _X, _Y) do {} while ( 0 )*/
+
+#endif /* SCHED_STATS */
struct sedf_dom_info {
struct domain *domain;
@@ -92,14 +122,16 @@ struct sedf_vcpu_info {
s_time_t extra_time_tot;
#ifdef SEDF_STATS
- s_time_t block_time_tot;
- s_time_t penalty_time_tot;
- int block_tot;
- int short_block_tot;
- int long_block_tot;
- int short_cont;
- int pen_extra_blocks;
- int pen_extra_slices;
+ struct {
+ s_time_t block_time_tot;
+ s_time_t penalty_time_tot;
+ int block_tot;
+ int short_block_tot;
+ int long_block_tot;
+ int short_cont;
+ int pen_extra_blocks;
+ int pen_extra_slices;
+ } stats;
#endif
};
@@ -332,6 +364,7 @@ static void *sedf_alloc_vdata(const stru
INIT_LIST_HEAD(&(inf->extralist[EXTRA_PEN_Q]));
INIT_LIST_HEAD(&(inf->extralist[EXTRA_UTIL_Q]));
+ SCHED_VCPU_STATS_RESET(inf);
SCHED_STAT_CRANK(vcpu_init);
return inf;
@@ -688,9 +721,7 @@ static struct task_slice sedf_do_extra_s
runinf->status |= EXTRA_RUN_PEN;
ret.task = runinf->vcpu;
ret.time = EXTRA_QUANTUM;
-#ifdef SEDF_STATS
- runinf->pen_extra_slices++;
-#endif
+ SCHED_VCPU_STAT_CRANK(runinf, pen_extra_slices);
}
else
{
@@ -989,9 +1020,7 @@ static void unblock_short_extra_support(
{
inf->score[0] = (inf->period << 10) /
inf->short_block_lost_tot;
-#ifdef SEDF_STATS
- inf->pen_extra_blocks++;
-#endif
+ SCHED_VCPU_STAT_CRANK(inf, pen_extra_blocks);
if ( extraq_on(inf->vcpu, EXTRA_PEN_Q) )
/* Remove domain for possible resorting! */
extraq_del(inf->vcpu, EXTRA_PEN_Q);
@@ -1108,9 +1137,7 @@ static void sedf_wake(const struct sched
inf->deadl_abs = now + inf->slice;
}
-#ifdef SEDF_STATS
- inf->block_tot++;
-#endif
+ SCHED_VCPU_STAT_CRANK(inf, block_tot);
if ( unlikely(now < PERIOD_BEGIN(inf)) )
{
@@ -1132,9 +1159,7 @@ static void sedf_wake(const struct sched
if ( now < inf->deadl_abs )
{
/* Short blocking */
-#ifdef SEDF_STATS
- inf->short_block_tot++;
-#endif
+ SCHED_VCPU_STAT_CRANK(inf, short_block_tot);
unblock_short_extra_support(inf, now);
extraq_check_add_unblocked(d, 1);
@@ -1142,9 +1167,7 @@ static void sedf_wake(const struct sched
else
{
/* Long unblocking */
-#ifdef SEDF_STATS
- inf->long_block_tot++;
-#endif
+ SCHED_VCPU_STAT_CRANK(inf, long_block_tot);
unblock_long_cons_b(inf, now);
extraq_check_add_unblocked(d, 1);
@@ -1160,8 +1183,8 @@ static void sedf_wake(const struct sched
/* Do some statistics here... */
if ( inf->block_abs != 0 )
{
- inf->block_time_tot += now - inf->block_abs;
- inf->penalty_time_tot +=
+ inf->stats.block_time_tot += now - inf->block_abs;
+ inf->stats.penalty_time_tot +=
PERIOD_BEGIN(inf) + inf->cputime - inf->block_abs;
}
#endif
@@ -1197,22 +1220,22 @@ static void sedf_dump_domain(struct vcpu
EDOM_INFO(d)->extra_time_tot, EDOM_INFO(d)->extraweight);
#ifdef SEDF_STATS
- if ( EDOM_INFO(d)->block_time_tot != 0 )
- printk(" pen=%"PRIu64"%%", (EDOM_INFO(d)->penalty_time_tot * 100) /
- EDOM_INFO(d)->block_time_tot);
- if ( EDOM_INFO(d)->block_tot != 0 )
+ if ( EDOM_INFO(d)->stats.block_time_tot != 0 )
+ printk(" pen=%"PRIu64"%%", (EDOM_INFO(d)->stats.penalty_time_tot *
100) /
+ EDOM_INFO(d)->stats.block_time_tot);
+ if ( EDOM_INFO(d)->stats.block_tot != 0 )
printk("\n blks=%u sh=%u (%u%%) (shc=%u (%u%%) shex=%i "\
"shexsl=%i) l=%u (%u%%) avg: b=%"PRIu64" p=%"PRIu64"",
- EDOM_INFO(d)->block_tot, EDOM_INFO(d)->short_block_tot,
- (EDOM_INFO(d)->short_block_tot * 100)
- / EDOM_INFO(d)->block_tot, EDOM_INFO(d)->short_cont,
- (EDOM_INFO(d)->short_cont * 100) / EDOM_INFO(d)->block_tot,
- EDOM_INFO(d)->pen_extra_blocks,
- EDOM_INFO(d)->pen_extra_slices,
- EDOM_INFO(d)->long_block_tot,
- (EDOM_INFO(d)->long_block_tot * 100) / EDOM_INFO(d)->block_tot,
- (EDOM_INFO(d)->block_time_tot) / EDOM_INFO(d)->block_tot,
- (EDOM_INFO(d)->penalty_time_tot) / EDOM_INFO(d)->block_tot);
+ EDOM_INFO(d)->stats.block_tot,
EDOM_INFO(d)->stats.short_block_tot,
+ (EDOM_INFO(d)->stats.short_block_tot * 100)
+ / EDOM_INFO(d)->stats.block_tot, EDOM_INFO(d)->stats.short_cont,
+ (EDOM_INFO(d)->stats.short_cont * 100) /
EDOM_INFO(d)->stats.block_tot,
+ EDOM_INFO(d)->stats.pen_extra_blocks,
+ EDOM_INFO(d)->stats.pen_extra_slices,
+ EDOM_INFO(d)->stats.long_block_tot,
+ (EDOM_INFO(d)->stats.long_block_tot * 100) /
EDOM_INFO(d)->stats.block_tot,
+ (EDOM_INFO(d)->stats.block_time_tot) /
EDOM_INFO(d)->stats.block_tot,
+ (EDOM_INFO(d)->stats.penalty_time_tot) /
EDOM_INFO(d)->stats.block_tot);
#endif
printk("\n");
}
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |