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

Signed-off-by: Alexander Shishkin <alexander.shish...@linux.intel.com>
---
 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 8e37939d21..f6dd3d6071 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) : -EINVAL,                                \
+               DEBUG_PERF_ERR                                  \
        };                                                      \
        &__err_site;                                            \
 })
diff --git a/kernel/events/core.c b/kernel/events/core.c
index c6f43d1d5f..3ff28fc8bd 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -76,10 +76,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.5.0

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to