Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S934301AbcCNMQr (ORCPT ); Mon, 14 Mar 2016 08:16:47 -0400 Received: from mail-pa0-f67.google.com ([209.85.220.67]:34213 "EHLO mail-pa0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S934254AbcCNMQV (ORCPT ); Mon, 14 Mar 2016 08:16:21 -0400 From: Taeung Song To: Arnaldo Carvalho de Melo Cc: linux-kernel@vger.kernel.org, Jiri Olsa , Namhyung Kim , Ingo Molnar , Peter Zijlstra , Taeung Song Subject: [PATCH v2 2/5] perf config: Let show_config() work with perf_config_set Date: Mon, 14 Mar 2016 21:16:06 +0900 Message-Id: <1457957769-3700-3-git-send-email-treeze.taeung@gmail.com> X-Mailer: git-send-email 2.5.0 In-Reply-To: <1457957769-3700-1-git-send-email-treeze.taeung@gmail.com> References: <1457957769-3700-1-git-send-email-treeze.taeung@gmail.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3047 Lines: 115 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 Cc: Jiri Olsa Signed-off-by: Taeung Song --- 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