102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectchar netcpu_kstat10_id[]="\ 202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project@(#)netcpu_kstat10.c (c) Copyright 2005-2007, Hewlett-Packard Company Version 2.4.3"; 302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if HAVE_CONFIG_H 502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# include <config.h> 602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif 702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <stdio.h> 902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 1002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if HAVE_INTTYPES_H 1102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# include <inttypes.h> 1202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else 1302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# if HAVE_STDINT_H 1402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# include <stdint.h> 1502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# endif 1602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif 1702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 1802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if HAVE_UNISTD_H 1902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# include <unistd.h> 2002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif 2102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if HAVE_STRINGS_H 2202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# include <strings.h> 2302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif 2402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if STDC_HEADERS 2502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# include <stdlib.h> 2602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# include <stddef.h> 2702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else 2802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# if HAVE_STDLIB_H 2902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# include <stdlib.h> 3002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# endif 3102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif 3202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 3302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <errno.h> 3402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 3502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <kstat.h> 3602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/sysinfo.h> 3702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 3802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include "netsh.h" 3902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include "netlib.h" 4002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 4102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic kstat_ctl_t *kc = NULL; 4202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic kid_t kcid = 0; 4302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 4402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projecttypedef struct cpu_time_counters { 4502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project uint64_t idle; 4602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project uint64_t user; 4702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project uint64_t kernel; 4802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project uint64_t interrupt; 4902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project} cpu_time_counters_t; 5002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 5102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic cpu_time_counters_t starting_cpu_counters[MAXCPUS]; 5202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic cpu_time_counters_t ending_cpu_counters[MAXCPUS]; 5302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic cpu_time_counters_t delta_cpu_counters[MAXCPUS]; 5402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic cpu_time_counters_t corrected_cpu_counters[MAXCPUS]; 5502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 5602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic void 5702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectprint_cpu_time_counters(char *name, int instance, cpu_time_counters_t *counters) 5802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{ 5902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project fprintf(where,"%s[%d]:\n",name,instance); 6002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project fprintf(where, 6102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project "\t idle %llu\n",counters[instance].idle); 6202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project fprintf(where, 6302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project "\t user %llu\n",counters[instance].user); 6402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project fprintf(where, 6502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project "\t kernel %llu\n",counters[instance].kernel); 6602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project fprintf(where, 6702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project "\t interrupt %llu\n",counters[instance].interrupt); 6802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project} 6902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 7002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid 7102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcpu_util_init(void) 7202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{ 7302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project kc = kstat_open(); 7402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 7502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project if (kc == NULL) { 7602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project fprintf(where, 7702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project "cpu_util_init: kstat_open: errno %d %s\n", 7802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project errno, 7902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project strerror(errno)); 8002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project fflush(where); 8102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project exit(-1); 8202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project } 8302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project return; 8402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project} 8502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 8602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid 8702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcpu_util_terminate(void) 8802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{ 8902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project kstat_close(kc); 9002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project return; 9102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project} 9202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 9302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectint 9402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectget_cpu_method(void) 9502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{ 9602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project return KSTAT_10; 9702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project} 9802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 9902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic void 10002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectprint_unexpected_statistic_warning(char *who, char *what, char *why) 10102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{ 10202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project if (why) { 10302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project fprintf(where, 10402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project "WARNING! WARNING! WARNING! WARNING!\n"); 10502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project fprintf(where, 10602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project "%s found an unexpected %s statistic %.16s\n", 10702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project who, 10802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project why, 10902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project what); 11002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project } 11102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project else { 11202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project fprintf(where, 11302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project "%s is ignoring statistic %.16s\n", 11402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project who, 11502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project what); 11602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project } 11702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project} 11802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 11902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic void 12002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectget_cpu_counters(int cpu_num, cpu_time_counters_t *counters) 12102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{ 12202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 12302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project kstat_t *ksp; 12402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project int found=0; 12502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project kid_t nkcid; 12602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project kstat_named_t *knp; 12702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project int i; 12802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 12902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project ksp = kstat_lookup(kc, "cpu", cpu_num, "sys"); 13002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project if ((ksp) && (ksp->ks_type == KSTAT_TYPE_NAMED)) { 13102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* happiness and joy, keep going */ 13202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project nkcid = kstat_read(kc, ksp, NULL); 13302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project if (nkcid != -1) { 13402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* happiness and joy, keep going. we could consider adding a 13502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project "found < 3" to the end conditions, but then we wouldn't 13602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project search to the end and find that Sun added some nsec. we 13702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project probably want to see if they add an nsec. raj 2005-01-28 */ 13802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project for (i = ksp->ks_ndata, knp = ksp->ks_data; 13902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project i > 0; 14002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project knp++,i--) { 14102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* we would be hosed if the same name could appear twice */ 14202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project if (!strcmp("cpu_nsec_idle",knp->name)) { 14302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project found++; 14402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project counters[cpu_num].idle = knp->value.ui64; 14502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project } 14602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project else if (!strcmp("cpu_nsec_user",knp->name)) { 14702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project found++; 14802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project counters[cpu_num].user = knp->value.ui64; 14902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project } 15002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project else if (!strcmp("cpu_nsec_kernel",knp->name)) { 15102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project found++; 15202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project counters[cpu_num].kernel = knp->value.ui64; 15302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project } 15402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project else if (strstr(knp->name,"nsec")) { 15502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* finding another nsec here means Sun have changed 15602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project something and we need to warn the user. raj 2005-01-28 */ 15702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project print_unexpected_statistic_warning("get_cpu_counters", 15802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project knp->name, 15902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project "nsec"); 16002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project } 16102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project else if (debug >=2) { 16202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 16302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* might want to tell people about what we are skipping. 16402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project however, only display other names debug >=2. raj 16502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 2005-01-28 16602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project */ 16702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 16802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project print_unexpected_statistic_warning("get_cpu_counters", 16902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project knp->name, 17002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project NULL); 17102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project } 17202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project } 17302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project if (3 == found) { 17402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* happiness and joy */ 17502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project return; 17602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project } 17702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project else { 17802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project fprintf(where, 17902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project "get_cpu_counters could not find one or more of the expected counters!\n"); 18002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project fflush(where); 18102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project exit(-1); 18202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project } 18302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project } 18402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project else { 18502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* the kstat_read returned an error or the chain changed */ 18602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project fprintf(where, 18702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project "get_cpu_counters: kstat_read failed or chain id changed %d %s\n", 18802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project errno, 18902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project strerror(errno)); 19002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project fflush(where); 19102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project exit(-1); 19202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project } 19302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project } 19402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project else { 19502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* the lookup failed or found the wrong type */ 19602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project fprintf(where, 19702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project "get_cpu_counters: kstat_lookup failed for module 'cpu' instance %d name 'sys' and KSTAT_TYPE_NAMED: errno %d %s\n", 19802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project cpu_num, 19902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project errno, 20002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project strerror(errno)); 20102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project fflush(where); 20202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project exit(-1); 20302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project } 20402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project} 20502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 20602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic void 20702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectget_interrupt_counters(int cpu_num, cpu_time_counters_t *counters) 20802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{ 20902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project kstat_t *ksp; 21002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project int found=0; 21102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project kid_t nkcid; 21202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project kstat_named_t *knp; 21302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project int i; 21402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 21502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project ksp = kstat_lookup(kc, "cpu", cpu_num, "intrstat"); 21602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 21702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project counters[cpu_num].interrupt = 0; 21802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project if ((ksp) && (ksp->ks_type == KSTAT_TYPE_NAMED)) { 21902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* happiness and joy, keep going */ 22002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project nkcid = kstat_read(kc, ksp, NULL); 22102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project if (nkcid != -1) { 22202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* happiness and joy, keep going. we could consider adding a 22302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project "found < 15" to the end conditions, but then we wouldn't 22402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project search to the end and find that Sun added some "time." we 22502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project probably want to see if they add a "nsec." raj 2005-01-28 */ 22602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project for (i = ksp->ks_ndata, knp = ksp->ks_data; 22702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project i > 0; 22802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project knp++,i--) { 22902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project if (strstr(knp->name,"time")) { 23002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project found++; 23102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project counters[cpu_num].interrupt += knp->value.ui64; 23202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project } 23302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project else if (debug >=2) { 23402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 23502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* might want to tell people about what we are skipping. 23602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project however, only display other names debug >=2. raj 23702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 2005-01-28 23802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project */ 23902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 24002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project print_unexpected_statistic_warning("get_cpu_counters", 24102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project knp->name, 24202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project NULL); 24302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project } 24402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project } 24502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project if (15 == found) { 24602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* happiness and joy */ 24702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project return; 24802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project } 24902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project else { 25002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project fprintf(where, 25102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project "get_cpu_counters could not find one or more of the expected counters!\n"); 25202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project fflush(where); 25302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project exit(-1); 25402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project } 25502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project } 25602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project else { 25702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* the kstat_read returned an error or the chain changed */ 25802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project fprintf(where, 25902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project "get_cpu_counters: kstat_read failed or chain id changed %d %s\n", 26002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project errno, 26102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project strerror(errno)); 26202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project fflush(where); 26302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project exit(-1); 26402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project } 26502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project } 26602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project else { 26702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* the lookup failed or found the wrong type */ 26802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project fprintf(where, 26902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project "get_cpu_counters: kstat_lookup failed for module 'cpu' instance %d class 'intrstat' and KSTAT_TYPE_NAMED: errno %d %s\n", 27002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project cpu_num, 27102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project errno, 27202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project strerror(errno)); 27302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project fflush(where); 27402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project exit(-1); 27502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project } 27602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 27702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project} 27802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 27902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic void 28002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectget_cpu_time_counters(cpu_time_counters_t *counters) 28102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{ 28202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 28302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project int i; 28402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 28502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project for (i = 0; i < lib_num_loc_cpus; i++){ 28602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project get_cpu_counters(i, counters); 28702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project get_interrupt_counters(i, counters); 28802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project } 28902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 29002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project return; 29102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project} 29202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 29302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* the kstat10 mechanism, since it is based on actual nanosecond 29402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project counters is not going to use a comparison to an idle rate. so, the 29502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project calibrate_idle_rate routine will be rather simple :) raj 2005-01-28 29602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project */ 29702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 29802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectfloat 29902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcalibrate_idle_rate(int iterations, int interval) 30002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{ 30102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project return 0.0; 30202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project} 30302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 30402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectfloat 30502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcalc_cpu_util_internal(float elapsed_time) 30602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{ 30702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project int i; 30802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project float correction_factor; 30902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project float actual_rate; 31002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 31102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project uint64_t total_cpu_nsec; 31202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 31302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* multiply by 100 and divide by total and you get whole 31402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project percentages. multiply by 1000 and divide by total and you get 31502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project tenths of percentages. multiply by 10000 and divide by total and 31602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project you get hundredths of percentages. etc etc etc raj 2005-01-28 */ 31702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 31802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define CALC_PERCENT 100 31902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define CALC_TENTH_PERCENT 1000 32002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define CALC_HUNDREDTH_PERCENT 10000 32102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define CALC_THOUSANDTH_PERCENT 100000 32202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define CALC_ACCURACY CALC_THOUSANDTH_PERCENT 32302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 32402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project uint64_t fraction_idle; 32502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project uint64_t fraction_user; 32602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project uint64_t fraction_kernel; 32702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project uint64_t fraction_interrupt; 32802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 32902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project uint64_t interrupt_idle; 33002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project uint64_t interrupt_user; 33102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project uint64_t interrupt_kernel; 33202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 33302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project lib_local_cpu_util = (float)0.0; 33402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 33502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* It is possible that the library measured a time other than */ 33602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* the one that the user want for the cpu utilization */ 33702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* calculations - for example, tests that were ended by */ 33802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* watchdog timers such as the udp stream test. We let these */ 33902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* tests tell up what the elapsed time should be. */ 34002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 34102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project if (elapsed_time != 0.0) { 34202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project correction_factor = (float) 1.0 + 34302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project ((lib_elapsed - elapsed_time) / elapsed_time); 34402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project } 34502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project else { 34602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project correction_factor = (float) 1.0; 34702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project } 34802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 34902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project for (i = 0; i < lib_num_loc_cpus; i++) { 35002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 35102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* this is now the fun part. we have the nanoseconds _allegedly_ 35202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project spent in user, idle and kernel. We also have nanoseconds spent 35302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project servicing interrupts. Sadly, in the developer's finite wisdom, 35402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project the interrupt time accounting is in parallel with the other 35502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project accounting. this means that time accounted in user, kernel or 35602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project idle will also include time spent in interrupt. for netperf's 35702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project porpoises we do not really care about that for user and kernel, 35802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project but we certainly do care for idle. the $64B question becomes - 35902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project how to "correct" for this? 36002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 36102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project we could just subtract interrupt time from idle. that has the 36202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project virtue of simplicity and also "punishes" Sun for doing 36302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project something that seems to be so stupid. however, we probably 36402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project have to be "fair" even to the allegedly stupid so the other 36502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project mechanism, suggested by a Sun engineer is to subtract interrupt 36602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project time from each of user, kernel and idle in proportion to their 36702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project numbers. then we sum the corrected user, kernel and idle along 36802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project with the interrupt time and use that to calculate a new idle 36902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project percentage and thus a CPU util percentage. 37002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 37102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project that is what we will attempt to do here. raj 2005-01-28 37202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 37302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project of course, we also have to wonder what we should do if there is 37402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project more interrupt time than the sum of user, kernel and idle. 37502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project that is a theoretical possibility I suppose, but for the 37602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project time-being, one that we will blythly ignore, except perhaps for 37702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project a quick check. raj 2005-01-31 37802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project */ 37902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 38002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* we ass-u-me that these counters will never wrap during a 38102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project netperf run. this may not be a particularly safe thing to 38202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project do. raj 2005-01-28 */ 38302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project delta_cpu_counters[i].idle = ending_cpu_counters[i].idle - 38402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project starting_cpu_counters[i].idle; 38502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project delta_cpu_counters[i].user = ending_cpu_counters[i].user - 38602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project starting_cpu_counters[i].user; 38702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project delta_cpu_counters[i].kernel = ending_cpu_counters[i].kernel - 38802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project starting_cpu_counters[i].kernel; 38902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project delta_cpu_counters[i].interrupt = ending_cpu_counters[i].interrupt - 39002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project starting_cpu_counters[i].interrupt; 39102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 39202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project if (debug) { 39302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project print_cpu_time_counters("delta_cpu_counters",i,delta_cpu_counters); 39402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project } 39502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 39602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* for this summation, we do not include interrupt time */ 39702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project total_cpu_nsec = 39802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project delta_cpu_counters[i].idle + 39902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project delta_cpu_counters[i].user + 40002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project delta_cpu_counters[i].kernel; 40102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 40202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project if (debug) { 40302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project fprintf(where,"total_cpu_nsec %llu\n",total_cpu_nsec); 40402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project } 40502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 40602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project if (delta_cpu_counters[i].interrupt > total_cpu_nsec) { 40702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* we are not in Kansas any more Toto, and I am not quite sure 40802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project the best way to get our tails out of here so let us just 40902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project punt. raj 2005-01-31 */ 41002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project fprintf(where, 41102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project "WARNING! WARNING! WARNING! WARNING! WARNING! \n"); 41202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project fprintf(where, 41302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project "calc_cpu_util_internal: more interrupt time than others combined!\n"); 41402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project fprintf(where, 41502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project "\tso CPU util cannot be estimated\n"); 41602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project fprintf(where, 41702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project "\t delta[%d].interrupt %llu\n",i,delta_cpu_counters[i].interrupt); 41802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project fprintf(where, 41902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project "\t delta[%d].idle %llu\n",i,delta_cpu_counters[i].idle); 42002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project fprintf(where, 42102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project "\t delta[%d].user %llu\n",i,delta_cpu_counters[i].user); 42202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project fprintf(where, 42302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project "\t delta[%d].kernel %llu\n",i,delta_cpu_counters[i].kernel); 42402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project fflush(where); 42502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 42602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project lib_local_cpu_util = -1.0; 42702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project lib_local_per_cpu_util[i] = -1.0; 42802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project return -1.0; 42902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project } 43002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 43102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* and now some fun with integer math. i initially tried to 43202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project promote things to long doubled but that didn't seem to result 43302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project in happiness and joy. raj 2005-01-28 */ 43402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 43502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project fraction_idle = 43602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project (delta_cpu_counters[i].idle * CALC_ACCURACY) / total_cpu_nsec; 43702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 43802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project fraction_user = 43902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project (delta_cpu_counters[i].user * CALC_ACCURACY) / total_cpu_nsec; 44002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 44102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project fraction_kernel = 44202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project (delta_cpu_counters[i].kernel * CALC_ACCURACY) / total_cpu_nsec; 44302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 44402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* ok, we have our fractions, now we want to take that fraction of 44502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project the interrupt time and subtract that from the bucket. */ 44602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 44702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project interrupt_idle = ((delta_cpu_counters[i].interrupt * fraction_idle) / 44802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project CALC_ACCURACY); 44902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 45002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project interrupt_user = ((delta_cpu_counters[i].interrupt * fraction_user) / 45102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project CALC_ACCURACY); 45202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 45302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project interrupt_kernel = ((delta_cpu_counters[i].interrupt * fraction_kernel) / 45402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project CALC_ACCURACY); 45502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 45602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project if (debug) { 45702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project fprintf(where, 45802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project "\tfraction_idle %llu interrupt_idle %llu\n", 45902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project fraction_idle, 46002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project interrupt_idle); 46102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project fprintf(where, 46202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project "\tfraction_user %llu interrupt_user %llu\n", 46302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project fraction_user, 46402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project interrupt_user); 46502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project fprintf(where,"\tfraction_kernel %llu interrupt_kernel %llu\n", 46602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project fraction_kernel, 46702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project interrupt_kernel); 46802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project } 46902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 47002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project corrected_cpu_counters[i].idle = delta_cpu_counters[i].idle - 47102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project interrupt_idle; 47202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 47302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project corrected_cpu_counters[i].user = delta_cpu_counters[i].user - 47402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project interrupt_user; 47502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 47602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project corrected_cpu_counters[i].kernel = delta_cpu_counters[i].kernel - 47702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project interrupt_kernel; 47802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 47902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project corrected_cpu_counters[i].interrupt = delta_cpu_counters[i].interrupt; 48002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 48102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project if (debug) { 48202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project print_cpu_time_counters("corrected_cpu_counters", 48302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project i, 48402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project corrected_cpu_counters); 48502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project } 48602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 48702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* I was going to checkfor going less than zero, but since all the 48802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project calculations are in unsigned quantities that would seem to be a 48902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project triffle silly... raj 2005-01-28 */ 49002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 49102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* ok, now we sum the numbers again, this time including interrupt 49202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project */ 49302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 49402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project total_cpu_nsec = 49502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project corrected_cpu_counters[i].idle + 49602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project corrected_cpu_counters[i].user + 49702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project corrected_cpu_counters[i].kernel + 49802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project corrected_cpu_counters[i].interrupt; 49902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 50002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* and recalculate our fractions we are really only going to use 50102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project fraction_idle, but lets calculate the rest just for the heck of 50202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project it. one day we may want to display them. raj 2005-01-28 */ 50302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 50402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* multiply by 100 and divide by total and you get whole 50502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project percentages. multiply by 1000 and divide by total and you get 50602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project tenths of percentages. multiply by 10000 and divide by total 50702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project and you get hundredths of percentages. etc etc etc raj 50802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 2005-01-28 */ 50902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project fraction_idle = 51002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project (corrected_cpu_counters[i].idle * CALC_ACCURACY) / total_cpu_nsec; 51102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 51202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project fraction_user = 51302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project (corrected_cpu_counters[i].user * CALC_ACCURACY) / total_cpu_nsec; 51402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 51502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project fraction_kernel = 51602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project (corrected_cpu_counters[i].kernel * CALC_ACCURACY) / total_cpu_nsec; 51702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 51802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project fraction_interrupt = 51902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project (corrected_cpu_counters[i].interrupt * CALC_ACCURACY) / total_cpu_nsec; 52002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 52102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project if (debug) { 52202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project fprintf(where,"\tfraction_idle %lu\n",fraction_idle); 52302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project fprintf(where,"\tfraction_user %lu\n",fraction_user); 52402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project fprintf(where,"\tfraction_kernel %lu\n",fraction_kernel); 52502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project fprintf(where,"\tfraction_interrupt %lu\n",fraction_interrupt); 52602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project } 52702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 52802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* and finally, what is our CPU utilization? */ 52902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project lib_local_per_cpu_util[i] = 100.0 - (((float)fraction_idle / 53002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project (float)CALC_ACCURACY) * 100.0); 53102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project if (debug) { 53202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project fprintf(where, 53302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project "lib_local_per_cpu_util[%d] %g\n", 53402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project i, 53502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project lib_local_per_cpu_util[i]); 53602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project } 53702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project lib_local_cpu_util += lib_local_per_cpu_util[i]; 53802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project } 53902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* we want the average across all n processors */ 54002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project lib_local_cpu_util /= (float)lib_num_loc_cpus; 54102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 54202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project lib_local_cpu_util *= correction_factor; 54302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project return lib_local_cpu_util; 54402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 54502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 54602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project} 54702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 54802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid 54902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcpu_start_internal(void) 55002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{ 55102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project get_cpu_time_counters(starting_cpu_counters); 55202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project return; 55302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project} 55402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 55502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid 55602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcpu_stop_internal(void) 55702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{ 55802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project get_cpu_time_counters(ending_cpu_counters); 55902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project} 560