# HG changeset patch # User Boris Ostrovsky <boris.ostrovsky@amd.com> # Date 1338309680 -7200 # Node ID 3d52d9fe62559ed6f90cb33a4b95f536ab5bc683 # Parent 53e0571f94e4bcc45270dcbd444c7c91166cef6d xenpm: Fix reporting of C0 residence times Idle state residence times as provided by pmstat_get_cx_stat() are not reported precisely since remote core may be in idle state and therefore has not updated its statistics at the time local core collected them. This causes C0 residencies as calculated by xenpm to sometimes become negative. Signed-off-by: Boris Ostrovsky <boris.ostrovsky@amd.com> diff -r 53e0571f94e4 -r 3d52d9fe6255 tools/misc/xenpm.c --- a/tools/misc/xenpm.c Fri May 25 08:21:25 2012 +0100 +++ b/tools/misc/xenpm.c Tue May 29 18:41:20 2012 +0200 @@ -351,8 +351,12 @@ static void signal_int_handler(int signo for ( i = 0; i < max_cpu_nr; i++ ) if ( !get_cxstat_by_cpuid(xc_handle, i, &cxstat_end[i]) ) for ( j = 0; j < cxstat_end[i].nr; j++ ) - sum_cx[i] += cxstat_end[i].residencies[j] - - cxstat_start[i].residencies[j]; + { + int64_t diff = (int64_t)cxstat_end[i].residencies[j] - + (int64_t)cxstat_start[i].residencies[j]; + if ( diff >=0 ) + sum_cx[i] += diff; + } } if ( get_pxstat_by_cpuid(xc_handle, 0, NULL) != -ENODEV ) @@ -379,8 +383,10 @@ static void signal_int_handler(int signo { for ( j = 0; j < cxstat_end[i].nr; j++ ) { - res = cxstat_end[i].residencies[j] - - cxstat_start[i].residencies[j]; + int64_t diff = (int64_t)cxstat_end[i].residencies[j] - + (int64_t)cxstat_start[i].residencies[j]; + + res = ( diff >= 0 ) ? diff : 0; triggers = cxstat_end[i].triggers[j] - cxstat_start[i].triggers[j]; avg_res = (triggers==0) ? 0: (double)res/triggers/1000000.0;