Add the rt linux 4.1.3-rt3 as base
[kvmfornfv.git] / kernel / include / linux / dynamic_debug.h
diff --git a/kernel/include/linux/dynamic_debug.h b/kernel/include/linux/dynamic_debug.h
new file mode 100644 (file)
index 0000000..4f1bbc6
--- /dev/null
@@ -0,0 +1,137 @@
+#ifndef _DYNAMIC_DEBUG_H
+#define _DYNAMIC_DEBUG_H
+
+/*
+ * An instance of this structure is created in a special
+ * ELF section at every dynamic debug callsite.  At runtime,
+ * the special section is treated as an array of these.
+ */
+struct _ddebug {
+       /*
+        * These fields are used to drive the user interface
+        * for selecting and displaying debug callsites.
+        */
+       const char *modname;
+       const char *function;
+       const char *filename;
+       const char *format;
+       unsigned int lineno:18;
+       /*
+        * The flags field controls the behaviour at the callsite.
+        * The bits here are changed dynamically when the user
+        * writes commands to <debugfs>/dynamic_debug/control
+        */
+#define _DPRINTK_FLAGS_NONE    0
+#define _DPRINTK_FLAGS_PRINT   (1<<0) /* printk() a message using the format */
+#define _DPRINTK_FLAGS_INCL_MODNAME    (1<<1)
+#define _DPRINTK_FLAGS_INCL_FUNCNAME   (1<<2)
+#define _DPRINTK_FLAGS_INCL_LINENO     (1<<3)
+#define _DPRINTK_FLAGS_INCL_TID                (1<<4)
+#if defined DEBUG
+#define _DPRINTK_FLAGS_DEFAULT _DPRINTK_FLAGS_PRINT
+#else
+#define _DPRINTK_FLAGS_DEFAULT 0
+#endif
+       unsigned int flags:8;
+} __attribute__((aligned(8)));
+
+
+int ddebug_add_module(struct _ddebug *tab, unsigned int n,
+                               const char *modname);
+
+#if defined(CONFIG_DYNAMIC_DEBUG)
+extern int ddebug_remove_module(const char *mod_name);
+extern __printf(2, 3)
+void __dynamic_pr_debug(struct _ddebug *descriptor, const char *fmt, ...);
+
+extern int ddebug_dyndbg_module_param_cb(char *param, char *val,
+                                       const char *modname);
+
+struct device;
+
+extern __printf(3, 4)
+void __dynamic_dev_dbg(struct _ddebug *descriptor, const struct device *dev,
+                      const char *fmt, ...);
+
+struct net_device;
+
+extern __printf(3, 4)
+void __dynamic_netdev_dbg(struct _ddebug *descriptor,
+                         const struct net_device *dev,
+                         const char *fmt, ...);
+
+#define DEFINE_DYNAMIC_DEBUG_METADATA(name, fmt)               \
+       static struct _ddebug  __aligned(8)                     \
+       __attribute__((section("__verbose"))) name = {          \
+               .modname = KBUILD_MODNAME,                      \
+               .function = __func__,                           \
+               .filename = __FILE__,                           \
+               .format = (fmt),                                \
+               .lineno = __LINE__,                             \
+               .flags =  _DPRINTK_FLAGS_DEFAULT,               \
+       }
+
+#define dynamic_pr_debug(fmt, ...)                             \
+do {                                                           \
+       DEFINE_DYNAMIC_DEBUG_METADATA(descriptor, fmt);         \
+       if (unlikely(descriptor.flags & _DPRINTK_FLAGS_PRINT))  \
+               __dynamic_pr_debug(&descriptor, pr_fmt(fmt),    \
+                                  ##__VA_ARGS__);              \
+} while (0)
+
+#define dynamic_dev_dbg(dev, fmt, ...)                         \
+do {                                                           \
+       DEFINE_DYNAMIC_DEBUG_METADATA(descriptor, fmt);         \
+       if (unlikely(descriptor.flags & _DPRINTK_FLAGS_PRINT))  \
+               __dynamic_dev_dbg(&descriptor, dev, fmt,        \
+                                 ##__VA_ARGS__);               \
+} while (0)
+
+#define dynamic_netdev_dbg(dev, fmt, ...)                      \
+do {                                                           \
+       DEFINE_DYNAMIC_DEBUG_METADATA(descriptor, fmt);         \
+       if (unlikely(descriptor.flags & _DPRINTK_FLAGS_PRINT))  \
+               __dynamic_netdev_dbg(&descriptor, dev, fmt,     \
+                                    ##__VA_ARGS__);            \
+} while (0)
+
+#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 (unlikely(descriptor.flags & _DPRINTK_FLAGS_PRINT))  \
+               print_hex_dump(KERN_DEBUG, prefix_str,          \
+                              prefix_type, rowsize, groupsize, \
+                              buf, len, ascii);                \
+} while (0)
+
+#else
+
+#include <linux/string.h>
+#include <linux/errno.h>
+
+static inline int ddebug_remove_module(const char *mod)
+{
+       return 0;
+}
+
+static inline int ddebug_dyndbg_module_param_cb(char *param, char *val,
+                                               const char *modname)
+{
+       if (strstr(param, "dyndbg")) {
+               /* avoid pr_warn(), which wants pr_fmt() fully defined */
+               printk(KERN_WARNING "dyndbg param is supported only in "
+                       "CONFIG_DYNAMIC_DEBUG builds\n");
+               return 0; /* allow and ignore */
+       }
+       return -EINVAL;
+}
+
+#define dynamic_pr_debug(fmt, ...)                                     \
+       do { if (0) printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__); } while (0)
+#define dynamic_dev_dbg(dev, fmt, ...)                                 \
+       do { if (0) dev_printk(KERN_DEBUG, dev, fmt, ##__VA_ARGS__); } while (0)
+#endif
+
+#endif