/* show cpu idle information on CPU cpuid */ static int get_cxstat_by_cpuid(xc_interface *xc_handle, int cpuid, struct xc_cx_stat *cxstat) { int ret = 0; int max_cx_num = 0; ret = xc_pm_get_max_cx(xc_handle, cpuid, &max_cx_num); if ( ret ) return -errno; if ( !cxstat ) return -EINVAL; if ( !max_cx_num ) return -ENODEV; cxstat->triggers = calloc(max_cx_num, sizeof(*cxstat->triggers)); cxstat->residencies = calloc(max_cx_num, sizeof(*cxstat->residencies)); cxstat->pc = calloc(MAX_PKG_RESIDENCIES, sizeof(*cxstat->pc)); cxstat->cc = calloc(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; } cxstat->nr = max_cx_num; cxstat->nr_pc = MAX_PKG_RESIDENCIES; cxstat->nr_cc = MAX_CORE_RESIDENCIES; ret = xc_pm_get_cxstat(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; }
/* show cpu idle information on CPU cpuid */ static int get_cxstat_by_cpuid(xc_interface *xc_handle, int cpuid, struct xc_cx_stat *cxstat) { int ret = 0; int max_cx_num = 0; ret = xc_pm_get_max_cx(xc_handle, cpuid, &max_cx_num); if ( ret ) return -errno; if ( !cxstat ) return -EINVAL; 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 ) { free(cxstat->triggers); return -ENOMEM; } ret = xc_pm_get_cxstat(xc_handle, cpuid, cxstat); if( ret ) { ret = -errno; free(cxstat->triggers); free(cxstat->residencies); cxstat->triggers = NULL; cxstat->residencies = NULL; } return ret; }