perf config: Mark where are config items from (user or system)
authorTaeung Song <treeze.taeung@gmail.com>
Fri, 4 Nov 2016 06:44:22 +0000 (15:44 +0900)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Mon, 14 Nov 2016 16:10:37 +0000 (13:10 -0300)
To write config items to a particular config file, we should know where
is each config section and item from.

Current setting functionality of perf-config use autogenerating way by
overwriting collected config items to a config file.

For example, when collecting config items from user and system config
files (i.e. ~/.perfconfig and $(sysconf)/perfconfig), perf_config_set
can contain both user and system config items.  So we should know where
each value is from to avoid merging user and system config items on user
config file.

Signed-off-by: Taeung Song <treeze.taeung@gmail.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Nambong Ha <over3025@gmail.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Wang Nan <wangnan0@huawei.com>
Cc: Wookje Kwon <aweee0@gmail.com>
Link: http://lkml.kernel.org/r/1478241862-31230-7-git-send-email-treeze.taeung@gmail.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/builtin-config.c
tools/perf/util/config.c
tools/perf/util/config.h

index 7c861b54f3a640b084f1237c61f061a11acca83c..8c0d93b7c2f0316dc95d18d1b36bbb38b3fac191 100644 (file)
@@ -48,14 +48,18 @@ static int set_config(struct perf_config_set *set, const char *file_name,
        if (!fp)
                return -1;
 
-       perf_config_set__collect(set, var, value);
+       perf_config_set__collect(set, file_name, var, value);
        fprintf(fp, "%s\n", first_line);
 
        /* overwrite configvariables */
        perf_config_items__for_each_entry(&set->sections, section) {
+               if (!use_system_config && section->from_system_config)
+                       continue;
                fprintf(fp, "[%s]\n", section->name);
 
                perf_config_items__for_each_entry(&section->items, item) {
+                       if (!use_system_config && section->from_system_config)
+                               continue;
                        if (item->value)
                                fprintf(fp, "\t%s = %s\n",
                                        item->name, item->value);
index c8fb65d923cb223b8da0b72b98edc705527b30c6..3d906dbbef74b768ed5c1f72f08af0948afc7535 100644 (file)
@@ -594,6 +594,19 @@ static int collect_config(const char *var, const char *value,
                        goto out_free;
        }
 
+       /* perf_config_set can contain both user and system config items.
+        * So we should know where each value is from.
+        * The classification would be needed when a particular config file
+        * is overwrited by setting feature i.e. set_config().
+        */
+       if (strcmp(config_file_name, perf_etc_perfconfig()) == 0) {
+               section->from_system_config = true;
+               item->from_system_config = true;
+       } else {
+               section->from_system_config = false;
+               item->from_system_config = false;
+       }
+
        ret = set_value(item, value);
        return ret;
 
@@ -602,9 +615,10 @@ out_free:
        return -1;
 }
 
-int perf_config_set__collect(struct perf_config_set *set,
+int perf_config_set__collect(struct perf_config_set *set, const char *file_name,
                             const char *var, const char *value)
 {
+       config_file_name = file_name;
        return collect_config(var, value, set);
 }
 
index 0fcdb8c594b09a2b36e03c0b3974807e5e945434..1a59a6b43f8bd622772af23000bed69e9693c4a9 100644 (file)
@@ -7,12 +7,14 @@
 struct perf_config_item {
        char *name;
        char *value;
+       bool from_system_config;
        struct list_head node;
 };
 
 struct perf_config_section {
        char *name;
        struct list_head items;
+       bool from_system_config;
        struct list_head node;
 };
 
@@ -33,7 +35,7 @@ const char *perf_etc_perfconfig(void);
 
 struct perf_config_set *perf_config_set__new(void);
 void perf_config_set__delete(struct perf_config_set *set);
-int perf_config_set__collect(struct perf_config_set *set,
+int perf_config_set__collect(struct perf_config_set *set, const char *file_name,
                             const char *var, const char *value);
 void perf_config__init(void);
 void perf_config__exit(void);