[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20190617222034.10799-7-linux@rasmusvillemoes.dk>
Date: Tue, 18 Jun 2019 00:20:32 +0200
From: Rasmus Villemoes <linux@...musvillemoes.dk>
To: Ingo Molnar <mingo@...nel.org>,
Andrew Morton <akpm@...ux-foundation.org>
Cc: Jason Baron <jbaron@...mai.com>,
Nathan Chancellor <natechancellor@...il.com>,
Nick Desaulniers <ndesaulniers@...gle.com>,
linux-kernel@...r.kernel.org,
Rasmus Villemoes <linux@...musvillemoes.dk>
Subject: [PATCH v6 6/8] dynamic_debug: introduce CONFIG_DYNAMIC_DEBUG_RELATIVE_POINTERS
Based on the same idea for struct bug_entry, one can use relative
pointers in struct _ddebug. It only makes sense for 64 bit
architectures, where one saves 16 bytes per entry (out of 40 or 56,
depending on CONFIG_JUMP_LABEL).
Unlike the bug_entry case, this turns out not to work with some older
toolchains, so the actual config option must be set by the user and
not just selected by the various architectures. Still, the
architecture must select HAVE_DYNAMIC_DEBUG_RELATIVE_POINTERS and is
then responsible for providing a suitable
DEFINE_DYNAMIC_DEBUG_METADATA macro in <asm/dynamic_debug.h>.
Signed-off-by: Rasmus Villemoes <linux@...musvillemoes.dk>
---
include/linux/dynamic_debug.h | 14 ++++++++++++++
lib/Kconfig.debug | 13 +++++++++++++
lib/dynamic_debug.c | 20 ++++++++++++++++++++
3 files changed, 47 insertions(+)
diff --git a/include/linux/dynamic_debug.h b/include/linux/dynamic_debug.h
index 7d6d0153096e..572921e880ec 100644
--- a/include/linux/dynamic_debug.h
+++ b/include/linux/dynamic_debug.h
@@ -16,10 +16,17 @@ struct _ddebug {
* These fields are used to drive the user interface
* for selecting and displaying debug callsites.
*/
+#ifdef CONFIG_DYNAMIC_DEBUG_RELATIVE_POINTERS
+ signed int modname_disp;
+ signed int function_disp;
+ signed int filename_disp;
+ signed int format_disp;
+#else
const char *modname;
const char *function;
const char *filename;
const char *format;
+#endif
/*
* The flags field controls the behaviour at the callsite.
* The bits here are changed dynamically when the user
@@ -77,6 +84,12 @@ void __dynamic_ibdev_dbg(struct _ddebug *descriptor,
const struct ib_device *ibdev,
const char *fmt, ...);
+#ifdef CONFIG_DYNAMIC_DEBUG_RELATIVE_POINTERS
+#include <asm/dynamic_debug.h>
+#ifndef DEFINE_DYNAMIC_DEBUG_METADATA
+# error "asm/dynamic_debug.h must provide definition of DEFINE_DYNAMIC_DEBUG_METADATA"
+#endif
+#else
#define DEFINE_DYNAMIC_DEBUG_METADATA(name, fmt) \
static struct _ddebug __aligned(8) \
__attribute__((section("__verbose"))) name = { \
@@ -87,6 +100,7 @@ void __dynamic_ibdev_dbg(struct _ddebug *descriptor,
.flags_lineno = _DPRINTK_FLAGS_LINENO_INIT, \
_DPRINTK_KEY_INIT \
}
+#endif
#ifdef CONFIG_JUMP_LABEL
diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
index cbdfae379896..f3d2e234c15f 100644
--- a/lib/Kconfig.debug
+++ b/lib/Kconfig.debug
@@ -164,6 +164,19 @@ config DYNAMIC_DEBUG
See Documentation/admin-guide/dynamic-debug-howto.rst for additional
information.
+config HAVE_DYNAMIC_DEBUG_RELATIVE_POINTERS
+ bool
+
+config DYNAMIC_DEBUG_RELATIVE_POINTERS
+ bool "Reduce size of dynamic debug metadata"
+ depends on DYNAMIC_DEBUG
+ depends on HAVE_DYNAMIC_DEBUG_RELATIVE_POINTERS
+ help
+ If you say Y here, the static memory footprint of the kernel
+ image will be reduced somewhat (about 40K for a typical
+ distro kernel). There is no performance difference either
+ way.
+
endmenu # "printk and dmesg options"
menu "Compile-time checks and compiler options"
diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c
index 3a1a80041cd6..f1646795692c 100644
--- a/lib/dynamic_debug.c
+++ b/lib/dynamic_debug.c
@@ -39,6 +39,24 @@
#include <rdma/ib_verbs.h>
+#ifdef CONFIG_DYNAMIC_DEBUG_RELATIVE_POINTERS
+static inline const char *dd_modname(const struct _ddebug *dd)
+{
+ return (const char *)dd + dd->modname_disp;
+}
+static inline const char *dd_function(const struct _ddebug *dd)
+{
+ return (const char *)dd + dd->function_disp;
+}
+static inline const char *dd_filename(const struct _ddebug *dd)
+{
+ return (const char *)dd + dd->filename_disp;
+}
+static inline const char *dd_format(const struct _ddebug *dd)
+{
+ return (const char *)dd + dd->format_disp;
+}
+#else
static inline const char *dd_modname(const struct _ddebug *dd)
{
return dd->modname;
@@ -55,6 +73,8 @@ static inline const char *dd_format(const struct _ddebug *dd)
{
return dd->format;
}
+#endif
+
static inline unsigned dd_lineno(const struct _ddebug *dd)
{
return dd->flags_lineno >> 8;
--
2.20.1
Powered by blists - more mailing lists