Ejemplo n.º 1
0
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));

}
Ejemplo n.º 2
0
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;
	}

}