From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751513AbbJDIjp (ORCPT ); Sun, 4 Oct 2015 04:39:45 -0400 Received: from mail-pa0-f51.google.com ([209.85.220.51]:35792 "EHLO mail-pa0-f51.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751377AbbJDIjG (ORCPT ); Sun, 4 Oct 2015 04:39:06 -0400 From: Taeung Song To: Arnaldo Carvalho de Melo Cc: linux-kernel@vger.kernel.org, jolsa@redhat.com, namhyung@kernel.org, Ingo Molnar , Taeung Song Subject: [PATCH v7 4/7] perf config: Add 'get' functionality Date: Sun, 4 Oct 2015 16:35:07 +0900 Message-Id: <1443944110-6414-5-git-send-email-treeze.taeung@gmail.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1443944110-6414-1-git-send-email-treeze.taeung@gmail.com> References: <1443944110-6414-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 This patch consists of functions which can get specific config variables. For the syntax examples, perf config [] [section.name ...] display key-value pairs of specific config variables # perf config report.queue-size report.children Signed-off-by: Taeung Song --- tools/perf/Documentation/perf-config.txt | 2 + tools/perf/builtin-config.c | 75 ++++++++++++++++++++++++++++++-- tools/perf/util/cache.h | 1 + 3 files changed, 74 insertions(+), 4 deletions(-) diff --git a/tools/perf/Documentation/perf-config.txt b/tools/perf/Documentation/perf-config.txt index 15fbbd9..7b83406 100644 --- a/tools/perf/Documentation/perf-config.txt +++ b/tools/perf/Documentation/perf-config.txt @@ -8,6 +8,8 @@ perf-config - Get and set variables in a configuration file. SYNOPSIS -------- [verse] +'perf config' [] [section.name ...] +or 'perf config' [] -l | --list or 'perf config' [] -a | --list-all diff --git a/tools/perf/builtin-config.c b/tools/perf/builtin-config.c index 8e16e18..731056c 100644 --- a/tools/perf/builtin-config.c +++ b/tools/perf/builtin-config.c @@ -16,7 +16,7 @@ static bool use_system_config, use_user_config; static const char * const config_usage[] = { - "perf config [] [options]", + "perf config [] [options] [section.name ...]", NULL }; @@ -452,6 +452,35 @@ static int show_all_config(struct list_head *sections) return 0; } +static int show_spec_config(struct list_head *sections, + const char *section_name, const char *name) +{ + int i; + struct config_section *section = NULL; + struct config_element *element = NULL; + + find_config(sections, §ion, &element, section_name, name); + + if (section && element) { + printf("%s.%s=%s\n", section->name, + element->name, element->value); + return 0; + } + + for (i = 0; default_configsets[i].section_name != NULL; i++) { + struct default_configset *config = &default_configsets[i]; + + if (!strcmp(config->section_name, section_name) && + !strcmp(config->name, name)) { + printf("%s.%s=%s (default)\n", config->section_name, + config->name, config->value); + return 0; + } + } + + return -1; +} + static int collect_current_config(const char *var, const char *value, void *spec_sections __maybe_unused) { @@ -497,9 +526,42 @@ static int collect_current_config(const char *var, const char *value, return 0; } +static int perf_configset_with_option(configset_fn_t fn, struct list_head *sections, + const char *var) +{ + char *section_name; + char *name; + const char *last_dot; + char *key = strdup(var); + + if (!key) { + pr_err("%s: strdup failed\n", __func__); + return -1; + } + last_dot = strchr(key, '.'); + /* + * Since "key" actually contains the section name and the real + * key name separated by a dot, we have to know where the dot is. + */ + if (last_dot == NULL || last_dot == key) { + pr_err("The config variable does not contain a section: %s\n", key); + return -1; + } + if (!last_dot[1]) { + pr_err("The config varible does not contain variable name: %s\n", key); + return -1; + } + + section_name = strsep(&key, "."); + name = strsep(&key, "."); + free(key); + + return fn(sections, section_name, name); +} + int cmd_config(int argc, const char **argv, const char *prefix __maybe_unused) { - int ret = 0; + int i, ret = 0; struct list_head sections; const char *system_config = perf_etc_perfconfig(); char *user_config = mkpath("%s/.perfconfig", getenv("HOME")); @@ -532,7 +594,6 @@ int cmd_config(int argc, const char **argv, const char *prefix __maybe_unused) break; } case ACTION_LIST: - default: if (argc) { pr_err("Error: takes no arguments\n"); if (actions == ACTION_LIST_ALL) @@ -540,7 +601,13 @@ int cmd_config(int argc, const char **argv, const char *prefix __maybe_unused) else parse_options_usage(config_usage, config_options, "l", 1); return -1; - } else + } + default: + if (argc) + for (i = 0; argv[i]; i++) + ret = perf_configset_with_option(show_spec_config, §ions, + argv[i]); + else ret = show_config(§ions); } diff --git a/tools/perf/util/cache.h b/tools/perf/util/cache.h index 712e82b..e9bb75e 100644 --- a/tools/perf/util/cache.h +++ b/tools/perf/util/cache.h @@ -33,6 +33,7 @@ struct config_section { }; typedef int (*config_fn_t)(const char *, const char *, void *); +typedef int (*configset_fn_t)(struct list_head *, const char *, const char *); extern int perf_default_config(const char *, const char *, void *); extern int perf_config(config_fn_t fn, void *); extern int perf_config_from_file(config_fn_t fn, const char *filename, void *data); -- 1.9.1