Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933253AbcKNId6 (ORCPT ); Mon, 14 Nov 2016 03:33:58 -0500 Received: from mail-pg0-f66.google.com ([74.125.83.66]:34854 "EHLO mail-pg0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752250AbcKNIdx (ORCPT ); Mon, 14 Nov 2016 03:33:53 -0500 From: Taeung Song To: Arnaldo Carvalho de Melo Cc: linux-kernel@vger.kernel.org, Jiri Olsa , Namhyung Kim , Ingo Molnar , Peter Zijlstra , Wang Nan , Taeung Song Subject: [PATCH v2 7/7] perf config: Mark where are config items from (user or system) Date: Mon, 14 Nov 2016 17:21:42 +0900 Message-Id: <1479111702-5989-8-git-send-email-treeze.taeung@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1479111702-5989-1-git-send-email-treeze.taeung@gmail.com> References: <1479111702-5989-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: 3696 Lines: 111 To write config items to a particular config file, we should know where are the config items from. Config setting functionality autogenerate config file with existing config items. So, 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. To avoid merging user and system config items on user config file, we should know where each value is from. Cc: Namhyung Kim Cc: Jiri Olsa Cc: Wang Nan Signed-off-by: Taeung Song --- tools/perf/builtin-config.c | 6 +++++- tools/perf/util/config.c | 16 +++++++++++++++- tools/perf/util/config.h | 4 +++- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/tools/perf/builtin-config.c b/tools/perf/builtin-config.c index 2e7e295..09c0c71 100644 --- a/tools/perf/builtin-config.c +++ b/tools/perf/builtin-config.c @@ -46,14 +46,18 @@ static int set_config(struct perf_config_set *set, const char *file_name, if (set == NULL) 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(§ion->items, item) { + if (!use_system_config && section->from_system_config) + continue; if (item->value) fprintf(fp, "\t%s = %s\n", item->name, item->value); diff --git a/tools/perf/util/config.c b/tools/perf/util/config.c index c8fb65d..3d906db 100644 --- a/tools/perf/util/config.c +++ b/tools/perf/util/config.c @@ -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 @@ static int collect_config(const char *var, const char *value, 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); } diff --git a/tools/perf/util/config.h b/tools/perf/util/config.h index 0fcdb8c..1a59a6b 100644 --- a/tools/perf/util/config.h +++ b/tools/perf/util/config.h @@ -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); -- 2.7.4