[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 3/3] xenpm: use new Cx statistics interface
> From: Jan Beulich > Sent: Wednesday, March 05, 2014 6:38 PM > > Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> Acked-by: Kevin Tian <kevin.tian@xxxxxxxxx> > > --- a/tools/misc/xenpm.c > +++ b/tools/misc/xenpm.c > @@ -29,6 +29,9 @@ > #include <inttypes.h> > #include <sys/time.h> > > +#define MAX_PKG_RESIDENCIES 12 > +#define MAX_CORE_RESIDENCIES 8 > + > #define ARRAY_SIZE(a) (sizeof (a) / sizeof ((a)[0])) > > static xc_interface *xc_handle; > @@ -100,9 +103,9 @@ static void parse_cpuid_and_int(int argc > } > } > > -static void print_cxstat(int cpuid, struct xc_cx_stat *cxstat) > +static void print_cxstat(int cpuid, const struct xc_cx_stat_v2 *cxstat) > { > - int i; > + unsigned int i; > > printf("cpu id : %d\n", cpuid); > printf("total C-states : %d\n", cxstat->nr); > @@ -115,22 +118,20 @@ static void print_cxstat(int cpuid, stru > printf(" residency [%20"PRIu64" > ms]\n", > cxstat->residencies[i]/1000000UL); > } > - printf("pc2 : [%20"PRIu64" ms]\n" > - "pc3 : [%20"PRIu64" ms]\n" > - "pc6 : [%20"PRIu64" ms]\n" > - "pc7 : [%20"PRIu64" ms]\n", > - cxstat->pc2/1000000UL, cxstat->pc3/1000000UL, > - cxstat->pc6/1000000UL, cxstat->pc7/1000000UL); > - printf("cc3 : [%20"PRIu64" ms]\n" > - "cc6 : [%20"PRIu64" ms]\n" > - "cc7 : [%20"PRIu64" ms]\n", > - cxstat->cc3/1000000UL, cxstat->cc6/1000000UL, > - cxstat->cc7/1000000UL); > + for ( i = 0; i < MAX_PKG_RESIDENCIES && i < cxstat->nr_pc; ++i ) > + if ( cxstat->pc[i] ) > + printf("pc%d : [%20"PRIu64" ms]\n", i + 1, > + cxstat->pc[i] / 1000000UL); > + for ( i = 0; i < MAX_CORE_RESIDENCIES && i < cxstat->nr_cc; ++i ) > + if ( cxstat->cc[i] ) > + printf("cc%d : [%20"PRIu64" ms]\n", i + 1, > + cxstat->cc[i] / 1000000UL); > printf("\n"); > } > > /* show cpu idle information on CPU cpuid */ > -static int get_cxstat_by_cpuid(xc_interface *xc_handle, int cpuid, struct > xc_cx_stat *cxstat) > +static int get_cxstat_by_cpuid(xc_interface *xc_handle, int cpuid, > + struct xc_cx_stat_v2 *cxstat) > { > int ret = 0; > int max_cx_num = 0; > @@ -145,24 +146,36 @@ static int get_cxstat_by_cpuid(xc_interf > if ( !max_cx_num ) > return -ENODEV; > > - cxstat->triggers = malloc(max_cx_num * sizeof(uint64_t)); > - if ( !cxstat->triggers ) > - return -ENOMEM; > - cxstat->residencies = malloc(max_cx_num * sizeof(uint64_t)); > - if ( !cxstat->residencies ) > + cxstat->triggers = malloc(max_cx_num * sizeof(*cxstat->triggers)); > + cxstat->residencies = malloc(max_cx_num * > sizeof(*cxstat->residencies)); > + cxstat->pc = malloc(MAX_PKG_RESIDENCIES * sizeof(*cxstat->pc)); > + cxstat->cc = malloc(MAX_CORE_RESIDENCIES * sizeof(*cxstat->cc)); > + if ( !cxstat->triggers || !cxstat->residencies || > + !cxstat->pc || !cxstat->cc ) > { > + free(cxstat->cc); > + free(cxstat->pc); > + free(cxstat->residencies); > free(cxstat->triggers); > return -ENOMEM; > } > > - ret = xc_pm_get_cxstat(xc_handle, cpuid, cxstat); > + cxstat->nr = max_cx_num; > + cxstat->nr_pc = MAX_PKG_RESIDENCIES; > + cxstat->nr_cc = MAX_CORE_RESIDENCIES; > + > + ret = xc_pm_get_cx_stat(xc_handle, cpuid, cxstat); > if( ret ) > { > ret = -errno; > free(cxstat->triggers); > free(cxstat->residencies); > + free(cxstat->pc); > + free(cxstat->cc); > cxstat->triggers = NULL; > cxstat->residencies = NULL; > + cxstat->pc = NULL; > + cxstat->cc = NULL; > } > > return ret; > @@ -183,7 +196,7 @@ static int show_max_cstate(xc_interface > static int show_cxstat_by_cpuid(xc_interface *xc_handle, int cpuid) > { > int ret = 0; > - struct xc_cx_stat cxstatinfo; > + struct xc_cx_stat_v2 cxstatinfo; > > ret = get_cxstat_by_cpuid(xc_handle, cpuid, &cxstatinfo); > if ( ret ) > @@ -198,6 +211,8 @@ static int show_cxstat_by_cpuid(xc_inter > > free(cxstatinfo.triggers); > free(cxstatinfo.residencies); > + free(cxstatinfo.pc); > + free(cxstatinfo.cc); > return 0; > } > > @@ -331,7 +346,7 @@ void pxstat_func(int argc, char *argv[]) > } > > static uint64_t usec_start, usec_end; > -static struct xc_cx_stat *cxstat, *cxstat_start, *cxstat_end; > +static struct xc_cx_stat_v2 *cxstat, *cxstat_start, *cxstat_end; > static struct xc_px_stat *pxstat, *pxstat_start, *pxstat_end; > static int *avgfreq; > static uint64_t *sum, *sum_cx, *sum_px; > @@ -482,25 +497,26 @@ static void signal_int_handler(int signo > /* print out CC? and PC? */ > for ( i = 0; i < socket_nr; i++ ) > { > + unsigned int n; > uint64_t res; > + > for ( j = 0; j <= info.max_cpu_index; j++ ) > { > if ( cpu_to_socket[j] == socket_ids[i] ) > break; > } > printf("\nSocket %d\n", socket_ids[i]); > - res = cxstat_end[j].pc2 - cxstat_start[j].pc2; > - printf("\tPC2\t%"PRIu64" ms\t%.2f%%\n", res / > 1000000UL, > - 100UL * res / (double)sum_cx[j]); > - res = cxstat_end[j].pc3 - cxstat_start[j].pc3; > - printf("\tPC3\t%"PRIu64" ms\t%.2f%%\n", res / > 1000000UL, > - 100UL * res / (double)sum_cx[j]); > - res = cxstat_end[j].pc6 - cxstat_start[j].pc6; > - printf("\tPC6\t%"PRIu64" ms\t%.2f%%\n", res / > 1000000UL, > - 100UL * res / (double)sum_cx[j]); > - res = cxstat_end[j].pc7 - cxstat_start[j].pc7; > - printf("\tPC7\t%"PRIu64" ms\t%.2f%%\n", res / > 1000000UL, > - 100UL * res / (double)sum_cx[j]); > + for ( n = 0; n < MAX_PKG_RESIDENCIES; ++n ) > + { > + if ( n >= cxstat_end[j].nr_pc ) > + continue; > + res = cxstat_end[j].pc[n]; > + if ( n < cxstat_start[j].nr_pc ) > + res -= cxstat_start[j].pc[n]; > + printf("\tPC%u\t%"PRIu64" ms\t%.2f%%\n", > + n + 1, res / 1000000UL, > + 100UL * res / (double)sum_cx[j]); > + } > for ( k = 0; k < core_nr; k++ ) > { > for ( j = 0; j <= info.max_cpu_index; j++ ) > @@ -510,15 +526,17 @@ static void signal_int_handler(int signo > break; > } > printf("\t Core %d CPU %d\n", core_ids[k], j); > - res = cxstat_end[j].cc3 - cxstat_start[j].cc3; > - printf("\t\tCC3\t%"PRIu64" ms\t%.2f%%\n", res / > 1000000UL, > - 100UL * res / (double)sum_cx[j]); > - res = cxstat_end[j].cc6 - cxstat_start[j].cc6; > - printf("\t\tCC6\t%"PRIu64" ms\t%.2f%%\n", res / > 1000000UL, > - 100UL * res / (double)sum_cx[j]); > - res = cxstat_end[j].cc7 - cxstat_start[j].cc7; > - printf("\t\tCC7\t%"PRIu64" ms\t%.2f%%\n", res / > 1000000UL, > - 100UL * res / (double)sum_cx[j]); > + for ( n = 0; n < MAX_CORE_RESIDENCIES; ++n ) > + { > + if ( n >= cxstat_end[j].nr_cc ) > + continue; > + res = cxstat_end[j].cc[n]; > + if ( n < cxstat_start[j].nr_cc ) > + res -= cxstat_start[j].cc[n]; > + printf("\t\tCC%u\t%"PRIu64" ms\t%.2f%%\n", > + n + 1, res / 1000000UL, > + 100UL * res / (double)sum_cx[j]); > + } > } > } > } > @@ -529,6 +547,8 @@ static void signal_int_handler(int signo > { > free(cxstat[i].triggers); > free(cxstat[i].residencies); > + free(cxstat[i].pc); > + free(cxstat[i].cc); > free(pxstat[i].trans_pt); > free(pxstat[i].pt); > } > _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |