* [PATCH v2 1/5] perf config: Use new perf_config_set__init() to initialize config set
2016-05-24 7:17 [RFC][PATCH v2 0/5] perf config: Reimplement perf_config() using perf_config_set__inter() Taeung Song
@ 2016-05-24 7:17 ` Taeung Song
2016-05-24 7:17 ` [PATCH v2 2/5] perf config: Reimplement perf_config() using perf_config_set__iter() Taeung Song
` (3 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Taeung Song @ 2016-05-24 7:17 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo
Cc: linux-kernel, Jiri Olsa, Namhyung Kim, Ingo Molnar,
Peter Zijlstra, Alexander Shishkin, Masami Hiramatsu,
Taeung Song, Jiri Olsa
Instead of perf_config(), This function initialize config set
collecting all configs from config files (i.e. user config
~/.perfconfig and system config $(sysconfdir)/perfconfig).
If there are the same config variable both user and system
config file, user config has higher priority than system config.
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Signed-off-by: Taeung Song <treeze.taeung@gmail.com>
---
tools/perf/util/config.c | 50 +++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 49 insertions(+), 1 deletion(-)
diff --git a/tools/perf/util/config.c b/tools/perf/util/config.c
index dad7d82..5d01899 100644
--- a/tools/perf/util/config.c
+++ b/tools/perf/util/config.c
@@ -645,13 +645,61 @@ out_free:
return -1;
}
+static int perf_config_set__init(struct perf_config_set *set)
+{
+ int ret = 0, found = 0;
+ const char *home = NULL;
+
+ /* Setting $PERF_CONFIG makes perf read _only_ the given config file. */
+ if (config_exclusive_filename)
+ return perf_config_from_file(collect_config, config_exclusive_filename, set);
+ if (perf_config_system() && !access(perf_etc_perfconfig(), R_OK)) {
+ ret += perf_config_from_file(collect_config, perf_etc_perfconfig(), set);
+ found += 1;
+ }
+
+ home = getenv("HOME");
+ if (perf_config_global() && home) {
+ char *user_config = strdup(mkpath("%s/.perfconfig", home));
+ struct stat st;
+
+ if (user_config == NULL) {
+ warning("Not enough memory to process %s/.perfconfig, "
+ "ignoring it.", home);
+ goto out;
+ }
+
+ if (stat(user_config, &st) < 0)
+ goto out_free;
+
+ if (st.st_uid && (st.st_uid != geteuid())) {
+ warning("File %s not owned by current user or root, "
+ "ignoring it.", user_config);
+ goto out_free;
+ }
+
+ if (!st.st_size)
+ goto out_free;
+
+ ret += perf_config_from_file(collect_config, user_config, set);
+ found += 1;
+out_free:
+ free(user_config);
+ }
+out:
+ if (found == 0)
+ return -1;
+ return ret;
+}
+
struct perf_config_set *perf_config_set__new(void)
{
struct perf_config_set *set = zalloc(sizeof(*set));
if (set) {
INIT_LIST_HEAD(&set->sections);
- perf_config(collect_config, set);
+ if (perf_config_set__init(set) < 0)
+ return NULL;
}
return set;
--
2.5.0
^ permalink raw reply [flat|nested] 6+ messages in thread* [PATCH v2 2/5] perf config: Reimplement perf_config() using perf_config_set__iter()
2016-05-24 7:17 [RFC][PATCH v2 0/5] perf config: Reimplement perf_config() using perf_config_set__inter() Taeung Song
2016-05-24 7:17 ` [PATCH v2 1/5] perf config: Use new perf_config_set__init() to initialize config set Taeung Song
@ 2016-05-24 7:17 ` Taeung Song
2016-05-24 7:17 ` [PATCH v2 3/5] perf config: Modify perf_config_set__delete() using global variable 'config_set' Taeung Song
` (2 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Taeung Song @ 2016-05-24 7:17 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo
Cc: linux-kernel, Jiri Olsa, Namhyung Kim, Ingo Molnar,
Peter Zijlstra, Alexander Shishkin, Masami Hiramatsu,
Taeung Song, Jiri Olsa, Wang Nan, Ingo Molnar
Everytime perf_config() is called, perf_config() always read config files.
(i.e. user config '~/.perfconfig' and system config '$(sysconfdir)/perfconfig')
But we need to use config set that already contains all config
key-value pairs to avoid this repetitive work reading the config files
in perf_config().
In other words, if new perf_config() is called,
only first time 'config_set' is initialized collecting all configs
from the config files and it work with perf_config_set__iter().
If we do, what old perf_config() handle is the same as new perf_config() work
without the repetitive work that read the config files.
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Wang Nan <wangnan0@huawei.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Signed-off-by: Taeung Song <treeze.taeung@gmail.com>
---
tools/perf/util/config.c | 98 ++++++++++++++++++++++++------------------------
1 file changed, 50 insertions(+), 48 deletions(-)
diff --git a/tools/perf/util/config.c b/tools/perf/util/config.c
index 5d01899..487d390 100644
--- a/tools/perf/util/config.c
+++ b/tools/perf/util/config.c
@@ -28,6 +28,7 @@ static int config_linenr;
static int config_file_eof;
const char *config_exclusive_filename;
+struct perf_config_set *config_set;
static int get_next_char(void)
{
@@ -477,54 +478,6 @@ static int perf_config_global(void)
return !perf_env_bool("PERF_CONFIG_NOGLOBAL", 0);
}
-int perf_config(config_fn_t fn, void *data)
-{
- int ret = 0, found = 0;
- const char *home = NULL;
-
- /* Setting $PERF_CONFIG makes perf read _only_ the given config file. */
- if (config_exclusive_filename)
- return perf_config_from_file(fn, config_exclusive_filename, data);
- if (perf_config_system() && !access(perf_etc_perfconfig(), R_OK)) {
- ret += perf_config_from_file(fn, perf_etc_perfconfig(),
- data);
- found += 1;
- }
-
- home = getenv("HOME");
- if (perf_config_global() && home) {
- char *user_config = strdup(mkpath("%s/.perfconfig", home));
- struct stat st;
-
- if (user_config == NULL) {
- warning("Not enough memory to process %s/.perfconfig, "
- "ignoring it.", home);
- goto out;
- }
-
- if (stat(user_config, &st) < 0)
- goto out_free;
-
- if (st.st_uid && (st.st_uid != geteuid())) {
- warning("File %s not owned by current user or root, "
- "ignoring it.", user_config);
- goto out_free;
- }
-
- if (!st.st_size)
- goto out_free;
-
- ret += perf_config_from_file(fn, user_config, data);
- found += 1;
-out_free:
- free(user_config);
- }
-out:
- if (found == 0)
- return -1;
- return ret;
-}
-
static struct perf_config_section *find_section(struct list_head *sections,
const char *section_name)
{
@@ -705,6 +658,55 @@ struct perf_config_set *perf_config_set__new(void)
return set;
}
+static int perf_config_set__check(void)
+{
+ if (config_set != NULL)
+ return 0;
+
+ config_set = perf_config_set__new();
+ if (!config_set)
+ return -1;
+
+ return 0;
+}
+
+static int perf_config_set__iter(struct perf_config_set *set, config_fn_t fn, void *data)
+{
+ struct perf_config_section *section;
+ struct perf_config_item *item;
+ struct list_head *sections;
+ char key[BUFSIZ];
+
+ if (set == NULL)
+ return -1;
+
+ sections = &set->sections;
+ if (list_empty(sections))
+ return -1;
+
+ list_for_each_entry(section, sections, node) {
+ list_for_each_entry(item, §ion->items, node) {
+ char *value = item->value;
+
+ if (value) {
+ scnprintf(key, sizeof(key), "%s.%s",
+ section->name, item->name);
+ if (fn(key, value, data) < 0)
+ return -1;
+ }
+ }
+ }
+
+ return 0;
+}
+
+int perf_config(config_fn_t fn, void *data)
+{
+ if (perf_config_set__check() < 0)
+ return -1;
+ return perf_config_set__iter(config_set, fn, data);
+}
+
static void perf_config_item__delete(struct perf_config_item *item)
{
zfree(&item->name);
--
2.5.0
^ permalink raw reply [flat|nested] 6+ messages in thread* [PATCH v2 3/5] perf config: Modify perf_config_set__delete() using global variable 'config_set'
2016-05-24 7:17 [RFC][PATCH v2 0/5] perf config: Reimplement perf_config() using perf_config_set__inter() Taeung Song
2016-05-24 7:17 ` [PATCH v2 1/5] perf config: Use new perf_config_set__init() to initialize config set Taeung Song
2016-05-24 7:17 ` [PATCH v2 2/5] perf config: Reimplement perf_config() using perf_config_set__iter() Taeung Song
@ 2016-05-24 7:17 ` Taeung Song
2016-05-24 7:17 ` [PATCH v2 4/5] perf config: Reimplement show_config() using perf_config() Taeung Song
2016-05-24 7:17 ` [PATCH v2 5/5] perf config: Reset config set at only 'config' sub-command Taeung Song
4 siblings, 0 replies; 6+ messages in thread
From: Taeung Song @ 2016-05-24 7:17 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo
Cc: linux-kernel, Jiri Olsa, Namhyung Kim, Ingo Molnar,
Peter Zijlstra, Alexander Shishkin, Masami Hiramatsu,
Taeung Song, Jiri Olsa
This function deleted allocated config set but
the global variable 'config_set' is used all around
so this directly remove 'config_set' instead of using local variable 'set'.
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Signed-off-by: Taeung Song <treeze.taeung@gmail.com>
---
tools/perf/builtin-config.c | 2 +-
tools/perf/util/config.c | 8 ++++----
tools/perf/util/config.h | 2 +-
3 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/tools/perf/builtin-config.c b/tools/perf/builtin-config.c
index fe1b77f..8eef3fb 100644
--- a/tools/perf/builtin-config.c
+++ b/tools/perf/builtin-config.c
@@ -106,7 +106,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(set);
+ perf_config_set__delete();
out_err:
return ret;
}
diff --git a/tools/perf/util/config.c b/tools/perf/util/config.c
index 487d390..abfe1b2 100644
--- a/tools/perf/util/config.c
+++ b/tools/perf/util/config.c
@@ -594,7 +594,7 @@ static int collect_config(const char *var, const char *value,
out_free:
free(key);
- perf_config_set__delete(set);
+ perf_config_set__delete();
return -1;
}
@@ -741,10 +741,10 @@ static void perf_config_set__purge(struct perf_config_set *set)
}
}
-void perf_config_set__delete(struct perf_config_set *set)
+void perf_config_set__delete(void)
{
- perf_config_set__purge(set);
- free(set);
+ perf_config_set__purge(config_set);
+ zfree(&config_set);
}
/*
diff --git a/tools/perf/util/config.h b/tools/perf/util/config.h
index 22ec626..be4e603 100644
--- a/tools/perf/util/config.h
+++ b/tools/perf/util/config.h
@@ -21,6 +21,6 @@ struct perf_config_set {
};
struct perf_config_set *perf_config_set__new(void);
-void perf_config_set__delete(struct perf_config_set *set);
+void perf_config_set__delete(void);
#endif /* __PERF_CONFIG_H */
--
2.5.0
^ permalink raw reply [flat|nested] 6+ messages in thread* [PATCH v2 4/5] perf config: Reimplement show_config() using perf_config()
2016-05-24 7:17 [RFC][PATCH v2 0/5] perf config: Reimplement perf_config() using perf_config_set__inter() Taeung Song
` (2 preceding siblings ...)
2016-05-24 7:17 ` [PATCH v2 3/5] perf config: Modify perf_config_set__delete() using global variable 'config_set' Taeung Song
@ 2016-05-24 7:17 ` Taeung Song
2016-05-24 7:17 ` [PATCH v2 5/5] perf config: Reset config set at only 'config' sub-command Taeung Song
4 siblings, 0 replies; 6+ messages in thread
From: Taeung Song @ 2016-05-24 7:17 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo
Cc: linux-kernel, Jiri Olsa, Namhyung Kim, Ingo Molnar,
Peter Zijlstra, Alexander Shishkin, Masami Hiramatsu,
Taeung Song, Jiri Olsa
Old show_config() directly use config set so
there are many duplicated code with perf_config_set__iter().
So reimplement show_config() using perf_config() that use
perf_config_set__iter() with config set that already
contains all configs.
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Signed-off-by: Taeung Song <treeze.taeung@gmail.com>
---
tools/perf/builtin-config.c | 29 +++++++----------------------
1 file changed, 7 insertions(+), 22 deletions(-)
diff --git a/tools/perf/builtin-config.c b/tools/perf/builtin-config.c
index 8eef3fb..4a61411 100644
--- a/tools/perf/builtin-config.c
+++ b/tools/perf/builtin-config.c
@@ -33,28 +33,13 @@ static struct option config_options[] = {
OPT_END()
};
-static int show_config(struct perf_config_set *set)
+static int show_config(const char *key, const char *value,
+ void *cb __maybe_unused)
{
- struct perf_config_section *section;
- struct perf_config_item *item;
- struct list_head *sections;
-
- if (set == NULL)
- return -1;
-
- sections = &set->sections;
- if (list_empty(sections))
- return -1;
-
- list_for_each_entry(section, sections, node) {
- list_for_each_entry(item, §ion->items, node) {
- char *value = item->value;
-
- if (value)
- printf("%s.%s=%s\n", section->name,
- item->name, value);
- }
- }
+ if (value)
+ printf("%s=%s\n", key, value);
+ else
+ printf("%s\n", key);
return 0;
}
@@ -92,7 +77,7 @@ int cmd_config(int argc, const char **argv, const char *prefix __maybe_unused)
pr_err("Error: takes no arguments\n");
parse_options_usage(config_usage, config_options, "l", 1);
} else {
- ret = show_config(set);
+ ret = perf_config(show_config, NULL);
if (ret < 0) {
const char * config_filename = config_exclusive_filename;
if (!config_exclusive_filename)
--
2.5.0
^ permalink raw reply [flat|nested] 6+ messages in thread* [PATCH v2 5/5] perf config: Reset config set at only 'config' sub-command
2016-05-24 7:17 [RFC][PATCH v2 0/5] perf config: Reimplement perf_config() using perf_config_set__inter() Taeung Song
` (3 preceding siblings ...)
2016-05-24 7:17 ` [PATCH v2 4/5] perf config: Reimplement show_config() using perf_config() Taeung Song
@ 2016-05-24 7:17 ` Taeung Song
4 siblings, 0 replies; 6+ messages in thread
From: Taeung Song @ 2016-05-24 7:17 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo
Cc: linux-kernel, Jiri Olsa, Namhyung Kim, Ingo Molnar,
Peter Zijlstra, Alexander Shishkin, Masami Hiramatsu,
Taeung Song, Jiri Olsa
When first calling perf_config(), config set is
initialized but 'config' sub-command need to reset
config set because of '--user' or '--system' options.
The options of 'config' sub-command is to select
a particular config file location so the config set
should be reinitialized collecting configs from
selected exclusive config file.
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Signed-off-by: Taeung Song <treeze.taeung@gmail.com>
---
tools/perf/builtin-config.c | 12 +++++-------
1 file changed, 5 insertions(+), 7 deletions(-)
diff --git a/tools/perf/builtin-config.c b/tools/perf/builtin-config.c
index 4a61411..dc5b52f 100644
--- a/tools/perf/builtin-config.c
+++ b/tools/perf/builtin-config.c
@@ -47,7 +47,6 @@ 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 *set;
char *user_config = mkpath("%s/.perfconfig", getenv("HOME"));
argc = parse_options(argc, argv, config_options, config_usage,
@@ -65,11 +64,11 @@ int cmd_config(int argc, const char **argv, const char *prefix __maybe_unused)
else if (use_user_config)
config_exclusive_filename = user_config;
- set = perf_config_set__new();
- if (!set) {
- ret = -1;
- goto out_err;
- }
+ /*
+ * Reset config set at only 'config' sub-command
+ * because of options config file location.
+ */
+ perf_config_set__delete();
switch (actions) {
case ACTION_LIST:
@@ -92,6 +91,5 @@ int cmd_config(int argc, const char **argv, const char *prefix __maybe_unused)
}
perf_config_set__delete();
-out_err:
return ret;
}
--
2.5.0
^ permalink raw reply [flat|nested] 6+ messages in thread