Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0e8131bc authored by Connor O'Brien's avatar Connor O'Brien Committed by Alexander Grund
Browse files

ANDROID: cpufreq: times: optimize proc files



The majority of the time spent reading /proc/uid_time_in_state is due
to seq_printf calls. Use the faster seq_put_* variations instead.

Also skip empty hash buckets in uid_seq_next for a further performance
improvement.

Bug: 111216804
Test: Read /proc/uid_time_in_state and confirm output is sane
Test: Compare read times to confirm performance improvement
Change-Id: If8783b498ed73d2ddb186a49438af41ac5ab9957
Signed-off-by: default avatarConnor O'Brien <connoro@google.com>
parent 51740873
Loading
Loading
Loading
Loading
+20 −14
Original line number Diff line number Diff line
@@ -193,10 +193,12 @@ static void *uid_seq_start(struct seq_file *seq, loff_t *pos)

static void *uid_seq_next(struct seq_file *seq, void *v, loff_t *pos)
{
	do {
		(*pos)++;

		if (*pos >= HASH_SIZE(uid_hash_table))
			return NULL;
	} while (hlist_empty(&uid_hash_table[*pos]));

	return &uid_hash_table[*pos];
}
@@ -220,7 +222,8 @@ static int uid_time_in_state_seq_show(struct seq_file *m, void *v)
				if (freqs->freq_table[i] ==
				    CPUFREQ_ENTRY_INVALID)
					continue;
				seq_printf(m, " %d", freqs->freq_table[i]);
				seq_put_decimal_ull(m, " ",
						    freqs->freq_table[i]);
			}
		}
		seq_putc(m, '\n');
@@ -229,13 +232,16 @@ static int uid_time_in_state_seq_show(struct seq_file *m, void *v)
	rcu_read_lock();

	hlist_for_each_entry_rcu(uid_entry, (struct hlist_head *)v, hash) {
		if (uid_entry->max_state)
			seq_printf(m, "%d:", uid_entry->uid);
		if (uid_entry->max_state) {
			seq_put_decimal_ull(m, "", uid_entry->uid);
			seq_putc(m, ':');
		}
		for (i = 0; i < uid_entry->max_state; ++i) {
			u64 time;
			if (freq_index_invalid(i))
				continue;
			seq_printf(m, " %lu", (unsigned long)cputime_to_clock_t(
					   uid_entry->time_in_state[i]));
			time = cputime_to_clock_t(uid_entry->time_in_state[i]);
			seq_put_decimal_ull(m, " ", time);
		}
		if (uid_entry->max_state)
			seq_putc(m, '\n');
@@ -256,13 +262,13 @@ static int concurrent_time_seq_show(struct seq_file *m, void *v,
	hlist_for_each_entry_rcu(uid_entry, (struct hlist_head *)v, hash) {
		atomic64_t *times = get_times(uid_entry->concurrent_times);

		seq_put_decimal_ull(m, 0, (u64)uid_entry->uid);
		seq_put_decimal_ull(m, "", (u64)uid_entry->uid);
		seq_putc(m, ':');

		for (i = 0; i < num_possible_cpus; ++i) {
			u64 time = cputime_to_clock_t(atomic64_read(&times[i]));

			seq_put_decimal_ull(m, ' ', time);
			seq_put_decimal_ull(m, " ", time);
		}
		seq_putc(m, '\n');
	}
@@ -280,7 +286,7 @@ static inline atomic64_t *get_active_times(struct concurrent_times *times)
static int concurrent_active_time_seq_show(struct seq_file *m, void *v)
{
	if (v == uid_hash_table) {
		seq_printf(m, "cpus: %d", num_possible_cpus());
		seq_put_decimal_ull(m, "cpus: ", num_possible_cpus());
		seq_putc(m, '\n');
	}

@@ -306,18 +312,18 @@ static int concurrent_policy_time_seq_show(struct seq_file *m, void *v)
				continue;
			if (freqs != last_freqs) {
				if (last_freqs) {
					seq_printf(m, ": %d", cnt);
					seq_put_decimal_ull(m, ": ", cnt);
					seq_putc(m, ' ');
					cnt = 0;
				}
				seq_printf(m, "policy%d", i);
				seq_put_decimal_ull(m, "policy", i);

				last_freqs = freqs;
			}
			cnt++;
		}
		if (last_freqs) {
			seq_printf(m, ": %d", cnt);
			seq_put_decimal_ull(m, ": ", cnt);
			seq_putc(m, '\n');
		}
	}