From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753694AbbGXLrH (ORCPT ); Fri, 24 Jul 2015 07:47:07 -0400 Received: from mga11.intel.com ([192.55.52.93]:25168 "EHLO mga11.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752645AbbGXLqZ (ORCPT ); Fri, 24 Jul 2015 07:46:25 -0400 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.15,538,1432623600"; d="scan'208";a="529558419" From: Alexander Shishkin To: Peter Zijlstra , Ingo Molnar Cc: linux-kernel@vger.kernel.org, adrian.hunter@intel.com, Arnaldo Carvalho de Melo , Vince Weaver , Stephane Eranian , Alexander Shishkin Subject: [PATCH RFC v1 2/4] perf: Add file name and line number to perf extended error reports Date: Fri, 24 Jul 2015 14:45:57 +0300 Message-Id: <1437738359-23920-3-git-send-email-alexander.shishkin@linux.intel.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1437738359-23920-1-git-send-email-alexander.shishkin@linux.intel.com> References: <1437738359-23920-1-git-send-email-alexander.shishkin@linux.intel.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org If kernel debugging is enabled, include additional information to extended syscall error reports: file name and line number, to make error hunting even easier. And in really desperate times, this allows for such things (a variation on Hugh Dickins' trick [1]): #undef EINVAL #define EINVAL perf_err(-22, "") However, CONFIG_DEBUG_KERNEL might not be the right option for this as I notice that, for example, debian enables it in its kernels. [1] http://marc.info/?l=linux-kernel&m=141215166009542 NYet-Signed-off-by: Alexander Shishkin --- include/linux/perf_event.h | 11 +++++++++++ kernel/events/core.c | 7 +++++++ 2 files changed, 18 insertions(+) diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h index 9e9af962f6..d84a2914f5 100644 --- a/include/linux/perf_event.h +++ b/include/linux/perf_event.h @@ -68,11 +68,21 @@ struct perf_guest_info_callbacks { struct perf_err_site { const char *message; const char *owner; +#ifdef CONFIG_DEBUG_KERNEL + const char *file; + const int line; +#endif const int code; }; #ifdef CONFIG_PERF_EVENTS +#ifdef CONFIG_DEBUG_KERNEL +#define DEBUG_PERF_ERR .file = __FILE__, .line = __LINE__, +#else +#define DEBUG_PERF_ERR +#endif + /* * Place all occurrences of struct perf_err_site into a special section, * so that we can find out their offsets, which we'll use to refer back @@ -88,6 +98,7 @@ extern const struct perf_err_site __start___perf_err[], __stop___perf_err[]; .owner = PERF_MODNAME, \ .code = __builtin_constant_p((__c)) ? \ (__c) : 0, \ + DEBUG_PERF_ERR \ }; \ (__e) = &__err_site; \ }) diff --git a/kernel/events/core.c b/kernel/events/core.c index 85bcf3a5f9..4ff09fdc67 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -75,10 +75,17 @@ static void perf_error_report_site(struct perf_event_attr *attr, buffer = kasprintf(GFP_KERNEL, "{\n" +#ifdef CONFIG_DEBUG_KERNEL + "\t\"file\": \"%s\",\n" + "\t\"line\": %d,\n" +#endif "\t\"code\": %d,\n" "\t\"module\": \"%s\",\n" "\t\"message\": \"%s\"\n" "}\n", +#ifdef CONFIG_DEBUG_KERNEL + site->file, site->line, +#endif site->code, site->owner, site->message ); if (!buffer) -- 2.1.4