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
> 

Reply via email to