drm: Pull the test on drm_debug in the logging macros
authorLespiau, Damien <damien.lespiau@intel.com>
Mon, 24 Mar 2014 15:53:15 +0000 (15:53 +0000)
committerDave Airlie <airlied@redhat.com>
Fri, 28 Mar 2014 02:57:36 +0000 (12:57 +1000)
In the logging code, we are currently checking is we need to output in
drm_ut_debug_printk(). This is too late. The problem is that when we write
something like:

    DRM_DEBUG_DRIVER("ELD on [CONNECTOR:%d:%s], [ENCODER:%d:%s]\n",
                     connector->base.id,
                     drm_get_connector_name(connector),
                     connector->encoder->base.id,
                     drm_get_encoder_name(connector->encoder));

We start by evaluating the arguments (so call drm_get_connector_name() and
drm_get_connector_name()) before ending up in drm_ut_debug_printk() which will
then does nothing.

This means we execute a lot of instructions (drm_get_connector_name(), in turn,
calls snprintf() for example) to happily discard them in the normal case,
drm.debug=0.

So, let's put the test on drm_debug earlier, in the macros themselves.
Sprinkle an unlikely() as well for good measure.

Signed-off-by: Damien Lespiau <damien.lespiau@intel.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
drivers/gpu/drm/drm_stub.c
include/drm/drmP.h

index dc2c6095d850ea1b285893666ec2565baab9e371..81ed83288557f2c803e3732844ea524849eee35a 100644 (file)
@@ -97,26 +97,24 @@ int drm_err(const char *func, const char *format, ...)
 }
 EXPORT_SYMBOL(drm_err);
 
-void drm_ut_debug_printk(unsigned int request_level,
-                        const char *prefix,
+void drm_ut_debug_printk(const char *prefix,
                         const char *function_name,
                         const char *format, ...)
 {
        struct va_format vaf;
        va_list args;
 
-       if (drm_debug & request_level) {
-               va_start(args, format);
-               vaf.fmt = format;
-               vaf.va = &args;
-
-               if (function_name)
-                       printk(KERN_DEBUG "[%s:%s], %pV", prefix,
-                              function_name, &vaf);
-               else
-                       printk(KERN_DEBUG "%pV", &vaf);
-               va_end(args);
-       }
+       va_start(args, format);
+       vaf.fmt = format;
+       vaf.va = &args;
+
+       if (function_name)
+               printk(KERN_DEBUG "[%s:%s], %pV", prefix,
+                      function_name, &vaf);
+       else
+               printk(KERN_DEBUG "%pV", &vaf);
+
+       va_end(args);
 }
 EXPORT_SYMBOL(drm_ut_debug_printk);
 
index 665176e68b488ccb6e10d7bac5c87872a894770b..cde156293d9dd84b8235572338c40671dab5dc25 100644 (file)
@@ -121,9 +121,8 @@ struct videomode;
 #define DRM_UT_KMS             0x04
 #define DRM_UT_PRIME           0x08
 
-extern __printf(4, 5)
-void drm_ut_debug_printk(unsigned int request_level,
-                        const char *prefix,
+extern __printf(3, 4)
+void drm_ut_debug_printk(const char *prefix,
                         const char *function_name,
                         const char *format, ...);
 extern __printf(2, 3)
@@ -209,24 +208,28 @@ int drm_err(const char *func, const char *format, ...);
 #if DRM_DEBUG_CODE
 #define DRM_DEBUG(fmt, args...)                                                \
        do {                                                            \
-               drm_ut_debug_printk(DRM_UT_CORE, DRM_NAME,              \
-                                       __func__, fmt, ##args);         \
+               if (unlikely(drm_debug & DRM_UT_CORE))                  \
+                       drm_ut_debug_printk(DRM_NAME, __func__,         \
+                                           fmt, ##args);               \
        } while (0)
 
 #define DRM_DEBUG_DRIVER(fmt, args...)                                 \
        do {                                                            \
-               drm_ut_debug_printk(DRM_UT_DRIVER, DRM_NAME,            \
-                                       __func__, fmt, ##args);         \
+               if (unlikely(drm_debug & DRM_UT_DRIVER))                \
+                       drm_ut_debug_printk(DRM_NAME, __func__,         \
+                                           fmt, ##args);               \
        } while (0)
-#define DRM_DEBUG_KMS(fmt, args...)                            \
+#define DRM_DEBUG_KMS(fmt, args...)                                    \
        do {                                                            \
-               drm_ut_debug_printk(DRM_UT_KMS, DRM_NAME,               \
-                                        __func__, fmt, ##args);        \
+               if (unlikely(drm_debug & DRM_UT_KMS))                   \
+                       drm_ut_debug_printk(DRM_NAME, __func__,         \
+                                           fmt, ##args);               \
        } while (0)
 #define DRM_DEBUG_PRIME(fmt, args...)                                  \
        do {                                                            \
-               drm_ut_debug_printk(DRM_UT_PRIME, DRM_NAME,             \
-                                       __func__, fmt, ##args);         \
+               if (unlikely(drm_debug & DRM_UT_PRIME))                 \
+                       drm_ut_debug_printk(DRM_NAME, __func__,         \
+                                           fmt, ##args);               \
        } while (0)
 #else
 #define DRM_DEBUG_DRIVER(fmt, args...) do { } while (0)