Re: [PATCH] PM / EM: Expose the Energy Model in debugfs

From: Quentin Perret
Date: Tue Jan 22 2019 - 10:34:24 EST


On Monday 07 Jan 2019 at 12:26:08 (+0000), Quentin Perret wrote:
> diff --git a/kernel/power/energy_model.c b/kernel/power/energy_model.c
> index d9dc2c38764a..8ef48daa62ff 100644
> --- a/kernel/power/energy_model.c
> +++ b/kernel/power/energy_model.c
> @@ -10,6 +10,7 @@
>
> #include <linux/cpu.h>
> #include <linux/cpumask.h>
> +#include <linux/debugfs.h>
> #include <linux/energy_model.h>
> #include <linux/sched/topology.h>
> #include <linux/slab.h>
> @@ -23,6 +24,88 @@ static DEFINE_PER_CPU(struct em_perf_domain *, em_data);
> */
> static DEFINE_MUTEX(em_pd_mutex);
>
> +#ifdef CONFIG_DEBUG_FS
> +static struct dentry *rootdir;
> +
> +static int em_debug_create_cs(struct em_cap_state *cs, struct dentry *pd)
> +{
> + struct dentry *d;
> + char name[24];
> +
> + snprintf(name, sizeof(name), "cs:%lu", cs->frequency);
> +
> + d = debugfs_create_dir(name, pd);
> + if (!d)
> + return -ENOMEM;
> +
> + if (!debugfs_create_ulong("frequency", 0444, d, &cs->frequency))
> + return -ENOMEM;

Looking at the patches Greg just sent I assume all this is wrong.
I'll send a v2 without the 'if' all over.

Thanks,
Quentin

> +
> + if (!debugfs_create_ulong("power", 0444, d, &cs->power))
> + return -ENOMEM;
> +
> + if (!debugfs_create_ulong("cost", 0444, d, &cs->cost))
> + return -ENOMEM;
> +
> + return 0;
> +}
> +
> +static int em_debug_cpus_show(struct seq_file *s, void *unused)
> +{
> + seq_printf(s, "%*pbl\n", cpumask_pr_args(to_cpumask(s->private)));
> +
> + return 0;
> +}
> +DEFINE_SHOW_ATTRIBUTE(em_debug_cpus);
> +
> +static int em_debug_create_pd(struct em_perf_domain *pd, int cpu)
> +{
> + struct dentry *d;
> + char name[16];
> + int i;
> +
> + if (!rootdir)
> + return -EINVAL;
> +
> + snprintf(name, sizeof(name), "pd%d", cpu);
> +
> + /* Create the directory of the performance domain */
> + d = debugfs_create_dir(name, rootdir);
> + if (!d)
> + return -ENOMEM;
> +
> + /* Create one file per pd to expose the related CPUs */
> + if (!debugfs_create_file("cpus", 0444, d, pd->cpus,
> + &em_debug_cpus_fops))
> + return -ENOMEM;
> +
> + /* Create a sub-directory for each capacity state */
> + for (i = 0; i < pd->nr_cap_states; i++) {
> + if (em_debug_create_cs(&pd->table[i], d))
> + return -ENOMEM;
> + }
> +
> + return 0;
> +}
> +
> +static int __init em_debug_init(void)
> +{
> + /* Create /sys/kernel/debug/energy_model directory */
> + rootdir = debugfs_create_dir("energy_model", NULL);
> + if (!rootdir) {
> + pr_err("%s: Failed to create root directory\n", __func__);
> + return -ENOMEM;
> + }
> +
> + return 0;
> +}
> +core_initcall(em_debug_init);
> +#else /* CONFIG_DEBUG_FS */
> +static int em_debug_create_pd(struct em_perf_domain *pd, int cpu)
> +{
> + return 0;
> +}
> +#endif
> static struct em_perf_domain *em_create_pd(cpumask_t *span, int nr_states,
> struct em_data_callback *cb)
> {
> @@ -102,6 +185,9 @@ static struct em_perf_domain *em_create_pd(cpumask_t *span, int nr_states,
> pd->nr_cap_states = nr_states;
> cpumask_copy(to_cpumask(pd->cpus), span);
>
> + if (em_debug_create_pd(pd, cpu))
> + pr_err("Failed to create debugfs for pd%d\n", cpu);
> +
> return pd;
>
> free_cs_table:
> --
> 2.20.1
>