Current show_config() has a problem when user or
system config files have same config variables i.e.

    # cat ~/.perfconfig
        [top]
            children = false

    when $(sysconfdir) is /usr/local/etc
    # cat /usr/local/etc/perfconfig
        [top]
            children = true

Before:
    # perf config --user --list
    top.children=false

    # perf config --system --list
    top.children=true

    # perf config --list
    top.children=true
    top.children=false

Because perf_config() can call show_config()
each the config file (user and system).
So fix it.

After:
    # perf config --user --list
    top.children=false

    # perf config --system --list
    top.children=true

    # perf config --list
    top.children=false

Cc: Namhyung Kim <[email protected]>
Cc: Jiri Olsa <[email protected]>
Signed-off-by: Taeung Song <[email protected]>
---
 tools/perf/builtin-config.c | 31 ++++++++++++++++++++++++-------
 1 file changed, 24 insertions(+), 7 deletions(-)

diff --git a/tools/perf/builtin-config.c b/tools/perf/builtin-config.c
index 412c725..2217772 100644
--- a/tools/perf/builtin-config.c
+++ b/tools/perf/builtin-config.c
@@ -33,13 +33,21 @@ static struct option config_options[] = {
        OPT_END()
 };
 
-static int show_config(const char *key, const char *value,
-                      void *cb __maybe_unused)
+static int show_config(struct perf_config_set *perf_configs)
 {
-       if (value)
-               printf("%s=%s\n", key, value);
-       else
-               printf("%s\n", key);
+       struct perf_config_item *config;
+       struct list_head *config_list = &perf_configs->config_list;
+
+       if (list_empty(config_list))
+               return -1;
+
+       list_for_each_entry(config, config_list, list) {
+               char *value = config->value;
+
+               if (value)
+                       printf("%s.%s=%s\n", config->section,
+                              config->name, value);
+       }
 
        return 0;
 }
@@ -47,6 +55,7 @@ static int show_config(const char *key, const char *value,
 int cmd_config(int argc, const char **argv, const char *prefix __maybe_unused)
 {
        int ret = 0;
+       struct perf_config_set *perf_configs;
        char *user_config = mkpath("%s/.perfconfig", getenv("HOME"));
 
        argc = parse_options(argc, argv, config_options, config_usage,
@@ -64,13 +73,19 @@ int cmd_config(int argc, const char **argv, const char 
*prefix __maybe_unused)
        else if (use_user_config)
                config_exclusive_filename = user_config;
 
+       perf_configs = perf_config_set__new();
+       if (!perf_configs) {
+               ret = -1;
+               goto out_err;
+       }
+
        switch (actions) {
        case ACTION_LIST:
                if (argc) {
                        pr_err("Error: takes no arguments\n");
                        parse_options_usage(config_usage, config_options, "l", 
1);
                } else {
-                       ret = perf_config(show_config, NULL);
+                       ret = show_config(perf_configs);
                        if (ret < 0) {
                                const char * config_filename = 
config_exclusive_filename;
                                if (!config_exclusive_filename)
@@ -84,5 +99,7 @@ int cmd_config(int argc, const char **argv, const char 
*prefix __maybe_unused)
                usage_with_options(config_usage, config_options);
        }
 
+       perf_config_set__delete(perf_configs);
+out_err:
        return ret;
 }
-- 
2.5.0

Reply via email to