dynamic_debug: refactor dynamic_pr_debug and friends
authorRasmus Villemoes <linux@rasmusvillemoes.dk>
Fri, 8 Mar 2019 00:27:56 +0000 (16:27 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 8 Mar 2019 02:32:00 +0000 (18:32 -0800)
For the upcoming 'define the _ddebug descriptor in assembly', we need
all the descriptors in a translation unit to have distinct names
(because asm does not understand C scope).  The easiest way to achieve
that is as usual with an extra level of macros, passing the identifier
to use to the innermost macro, generating it via __UNIQUE_ID or
something.

However, instead of repeating that exercise for dynamic_pr_debug,
dynamic_dev_dbg, dynamic_netdev_dbg and dynamic_hex_dump separately, we
can use the similarity between their bodies to implement them via a
common macro, _dynamic_func_call - though the hex_dump case requires a
slight variant, since print_hex_dump does not take the _ddebug
descriptor.  We'll also get to use that variant elsewhere (btrfs).

Link: http://lkml.kernel.org/r/20190212214150.4807-11-linux@rasmusvillemoes.dk
Signed-off-by: Rasmus Villemoes <linux@rasmusvillemoes.dk>
Acked-by: Jason Baron <jbaron@akamai.com>
Cc: David Sterba <dsterba@suse.com>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Petr Mladek <pmladek@suse.com>
Cc: "Rafael J . Wysocki" <rafael.j.wysocki@intel.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
include/linux/dynamic_debug.h

index 3f8977cfa4793360828905f9922b772568a27a9e..c2be029b9b539f28b6b2c4fe63941701504543c2 100644 (file)
@@ -112,40 +112,54 @@ void __dynamic_netdev_dbg(struct _ddebug *descriptor,
 
 #endif
 
-#define dynamic_pr_debug(fmt, ...)                             \
-do {                                                           \
-       DEFINE_DYNAMIC_DEBUG_METADATA(descriptor, fmt);         \
-       if (DYNAMIC_DEBUG_BRANCH(descriptor))                   \
-               __dynamic_pr_debug(&descriptor, pr_fmt(fmt),    \
-                                  ##__VA_ARGS__);              \
+#define __dynamic_func_call(id, fmt, func, ...) do {   \
+       DEFINE_DYNAMIC_DEBUG_METADATA(id, fmt);         \
+       if (DYNAMIC_DEBUG_BRANCH(id))                   \
+               func(&id, ##__VA_ARGS__);               \
 } while (0)
 
-#define dynamic_dev_dbg(dev, fmt, ...)                         \
-do {                                                           \
-       DEFINE_DYNAMIC_DEBUG_METADATA(descriptor, fmt);         \
-       if (DYNAMIC_DEBUG_BRANCH(descriptor))                   \
-               __dynamic_dev_dbg(&descriptor, dev, fmt,        \
-                                 ##__VA_ARGS__);               \
+#define __dynamic_func_call_no_desc(id, fmt, func, ...) do {   \
+       DEFINE_DYNAMIC_DEBUG_METADATA(id, fmt);                 \
+       if (DYNAMIC_DEBUG_BRANCH(id))                           \
+               func(__VA_ARGS__);                              \
 } while (0)
 
-#define dynamic_netdev_dbg(dev, fmt, ...)                      \
-do {                                                           \
-       DEFINE_DYNAMIC_DEBUG_METADATA(descriptor, fmt);         \
-       if (DYNAMIC_DEBUG_BRANCH(descriptor))                   \
-               __dynamic_netdev_dbg(&descriptor, dev, fmt,     \
-                                    ##__VA_ARGS__);            \
-} while (0)
+/*
+ * "Factory macro" for generating a call to func, guarded by a
+ * DYNAMIC_DEBUG_BRANCH. The dynamic debug decriptor will be
+ * initialized using the fmt argument. The function will be called with
+ * the address of the descriptor as first argument, followed by all
+ * the varargs. Note that fmt is repeated in invocations of this
+ * macro.
+ */
+#define _dynamic_func_call(fmt, func, ...)                             \
+       __dynamic_func_call(__UNIQUE_ID(ddebug), fmt, func, ##__VA_ARGS__)
+/*
+ * A variant that does the same, except that the descriptor is not
+ * passed as the first argument to the function; it is only called
+ * with precisely the macro's varargs.
+ */
+#define _dynamic_func_call_no_desc(fmt, func, ...)     \
+       __dynamic_func_call_no_desc(__UNIQUE_ID(ddebug), fmt, func, ##__VA_ARGS__)
 
-#define dynamic_hex_dump(prefix_str, prefix_type, rowsize,     \
-                        groupsize, buf, len, ascii)            \
-do {                                                           \
-       DEFINE_DYNAMIC_DEBUG_METADATA(descriptor,               \
-               __builtin_constant_p(prefix_str) ? prefix_str : "hexdump");\
-       if (DYNAMIC_DEBUG_BRANCH(descriptor))                   \
-               print_hex_dump(KERN_DEBUG, prefix_str,          \
-                              prefix_type, rowsize, groupsize, \
-                              buf, len, ascii);                \
-} while (0)
+#define dynamic_pr_debug(fmt, ...)                             \
+       _dynamic_func_call(fmt, __dynamic_pr_debug,             \
+                          pr_fmt(fmt), ##__VA_ARGS__)
+
+#define dynamic_dev_dbg(dev, fmt, ...)                         \
+       _dynamic_func_call(fmt,__dynamic_dev_dbg,               \
+                          dev, fmt, ##__VA_ARGS__)
+
+#define dynamic_netdev_dbg(dev, fmt, ...)                      \
+       _dynamic_func_call(fmt, __dynamic_netdev_dbg,           \
+                          dev, fmt, ##__VA_ARGS__)
+
+#define dynamic_hex_dump(prefix_str, prefix_type, rowsize,             \
+                        groupsize, buf, len, ascii)                    \
+       _dynamic_func_call_no_desc(__builtin_constant_p(prefix_str) ? prefix_str : "hexdump", \
+                                  print_hex_dump,                      \
+                                  KERN_DEBUG, prefix_str, prefix_type, \
+                                  rowsize, groupsize, buf, len, ascii)
 
 #else