void svg_pstate(int cpu, u64 start, u64 end, u64 freq) { double height = 0; if (!svgfile) return; if (max_freq) height = freq * 1.0 / max_freq * (SLOT_HEIGHT + SLOT_MULT); height = 1 + cpu2y(cpu) + SLOT_MULT + SLOT_HEIGHT - height; fprintf(svgfile, "<line x1=\"%4.8f\" x2=\"%4.8f\" y1=\"%4.1f\" y2=\"%4.1f\" class=\"pstate\"/>\n", time2pixels(start), time2pixels(end), height, height); fprintf(svgfile, "<text x=\"%4.8f\" y=\"%4.8f\" font-size=\"0.25pt\">%s</text>\n", time2pixels(start), height+0.9, HzToHuman(freq)); }
void do_cpufreq_stats(void) { DIR *dir; struct dirent *dirent; FILE *file; char filename[PATH_MAX]; char line[1024]; int ret = 0; int maxfreq = 0; uint64_t total_time = 0; memcpy(&oldfreqs, &freqs, sizeof(freqs)); memset(&cpufreqstrings, 0, sizeof(cpufreqstrings)); sprintf(cpufreqstrings[0], _("P-states (frequencies)\n")); for (ret = 0; ret<16; ret++) freqs[ret].count = 0; dir = opendir("/sys/devices/system/cpu"); if (!dir) return; while ((dirent = readdir(dir))) { int i; if (dirent->d_name[0]=='.') continue; sprintf(filename, "/sys/devices/system/cpu/%s/cpufreq/stats/time_in_state", dirent->d_name); file = fopen(filename, "r"); if (!file) continue; memset(line, 0, 1024); i = 0; while (!feof(file)) { uint64_t f,count; char *c; if (fgets(line, 1023,file)==NULL) break; f = strtoull(line, &c, 10); if (!c) break; count = strtoull(c, NULL, 10); if (freqs[i].frequency && freqs[i].frequency != f) { zap(); break; } freqs[i].frequency = f; freqs[i].count += count; if (f && maxfreq < i) maxfreq = i; i++; if (i>15) break; } fclose(file); } closedir(dir); for (ret = 0; ret < 16; ret++) { delta[ret].count = freqs[ret].count - oldfreqs[ret].count; total_time += delta[ret].count; delta[ret].frequency = freqs[ret].frequency; if (freqs[ret].frequency != oldfreqs[ret].frequency) return; /* duff data */ } if (!total_time) return; qsort(&delta, maxfreq+1, sizeof(struct cpufreqdata), sort_by_count); if (maxfreq>4) maxfreq=4; qsort(&delta, maxfreq+1, sizeof(struct cpufreqdata), sort_by_freq); if (delta[0].frequency == delta[1].frequency + 1000) turbo_hz = delta[0].frequency; topfreq = -1; for (ret = 0 ; ret<=maxfreq; ret++) { sprintf(cpufreqstrings[ret+1], "%6s %5.1f%%\n", HzToHuman(delta[ret].frequency), delta[ret].count * 100.0 / total_time); if (delta[ret].count > total_time/2) topfreq = ret; } }