diff options
author | Lespiau, Damien <damien.lespiau@intel.com> | 2014-03-24 11:53:15 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2014-03-27 22:57:36 -0400 |
commit | a73d4e91fbb5ed6821ec5b906028e0e94868ef79 (patch) | |
tree | 23c53972b71fc5dae0ed7e28a45b23ff3d928c19 | |
parent | 8fa6a9e7e23ff163235d86b4d6f30692092dd1b5 (diff) |
drm: Pull the test on drm_debug in the logging macros
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>
-rw-r--r-- | drivers/gpu/drm/drm_stub.c | 26 | ||||
-rw-r--r-- | include/drm/drmP.h | 27 |
2 files changed, 27 insertions, 26 deletions
diff --git a/drivers/gpu/drm/drm_stub.c b/drivers/gpu/drm/drm_stub.c index dc2c6095d850..81ed83288557 100644 --- a/drivers/gpu/drm/drm_stub.c +++ b/drivers/gpu/drm/drm_stub.c | |||
@@ -97,26 +97,24 @@ int drm_err(const char *func, const char *format, ...) | |||
97 | } | 97 | } |
98 | EXPORT_SYMBOL(drm_err); | 98 | EXPORT_SYMBOL(drm_err); |
99 | 99 | ||
100 | void drm_ut_debug_printk(unsigned int request_level, | 100 | void drm_ut_debug_printk(const char *prefix, |
101 | const char *prefix, | ||
102 | const char *function_name, | 101 | const char *function_name, |
103 | const char *format, ...) | 102 | const char *format, ...) |
104 | { | 103 | { |
105 | struct va_format vaf; | 104 | struct va_format vaf; |
106 | va_list args; | 105 | va_list args; |
107 | 106 | ||
108 | if (drm_debug & request_level) { | 107 | va_start(args, format); |
109 | va_start(args, format); | 108 | vaf.fmt = format; |
110 | vaf.fmt = format; | 109 | vaf.va = &args; |
111 | vaf.va = &args; | 110 | |
112 | 111 | if (function_name) | |
113 | if (function_name) | 112 | printk(KERN_DEBUG "[%s:%s], %pV", prefix, |
114 | printk(KERN_DEBUG "[%s:%s], %pV", prefix, | 113 | function_name, &vaf); |
115 | function_name, &vaf); | 114 | else |
116 | else | 115 | printk(KERN_DEBUG "%pV", &vaf); |
117 | printk(KERN_DEBUG "%pV", &vaf); | 116 | |
118 | va_end(args); | 117 | va_end(args); |
119 | } | ||
120 | } | 118 | } |
121 | EXPORT_SYMBOL(drm_ut_debug_printk); | 119 | EXPORT_SYMBOL(drm_ut_debug_printk); |
122 | 120 | ||
diff --git a/include/drm/drmP.h b/include/drm/drmP.h index 665176e68b48..cde156293d9d 100644 --- a/include/drm/drmP.h +++ b/include/drm/drmP.h | |||
@@ -121,9 +121,8 @@ struct videomode; | |||
121 | #define DRM_UT_KMS 0x04 | 121 | #define DRM_UT_KMS 0x04 |
122 | #define DRM_UT_PRIME 0x08 | 122 | #define DRM_UT_PRIME 0x08 |
123 | 123 | ||
124 | extern __printf(4, 5) | 124 | extern __printf(3, 4) |
125 | void drm_ut_debug_printk(unsigned int request_level, | 125 | void drm_ut_debug_printk(const char *prefix, |
126 | const char *prefix, | ||
127 | const char *function_name, | 126 | const char *function_name, |
128 | const char *format, ...); | 127 | const char *format, ...); |
129 | extern __printf(2, 3) | 128 | extern __printf(2, 3) |
@@ -209,24 +208,28 @@ int drm_err(const char *func, const char *format, ...); | |||
209 | #if DRM_DEBUG_CODE | 208 | #if DRM_DEBUG_CODE |
210 | #define DRM_DEBUG(fmt, args...) \ | 209 | #define DRM_DEBUG(fmt, args...) \ |
211 | do { \ | 210 | do { \ |
212 | drm_ut_debug_printk(DRM_UT_CORE, DRM_NAME, \ | 211 | if (unlikely(drm_debug & DRM_UT_CORE)) \ |
213 | __func__, fmt, ##args); \ | 212 | drm_ut_debug_printk(DRM_NAME, __func__, \ |
213 | fmt, ##args); \ | ||
214 | } while (0) | 214 | } while (0) |
215 | 215 | ||
216 | #define DRM_DEBUG_DRIVER(fmt, args...) \ | 216 | #define DRM_DEBUG_DRIVER(fmt, args...) \ |
217 | do { \ | 217 | do { \ |
218 | drm_ut_debug_printk(DRM_UT_DRIVER, DRM_NAME, \ | 218 | if (unlikely(drm_debug & DRM_UT_DRIVER)) \ |
219 | __func__, fmt, ##args); \ | 219 | drm_ut_debug_printk(DRM_NAME, __func__, \ |
220 | fmt, ##args); \ | ||
220 | } while (0) | 221 | } while (0) |
221 | #define DRM_DEBUG_KMS(fmt, args...) \ | 222 | #define DRM_DEBUG_KMS(fmt, args...) \ |
222 | do { \ | 223 | do { \ |
223 | drm_ut_debug_printk(DRM_UT_KMS, DRM_NAME, \ | 224 | if (unlikely(drm_debug & DRM_UT_KMS)) \ |
224 | __func__, fmt, ##args); \ | 225 | drm_ut_debug_printk(DRM_NAME, __func__, \ |
226 | fmt, ##args); \ | ||
225 | } while (0) | 227 | } while (0) |
226 | #define DRM_DEBUG_PRIME(fmt, args...) \ | 228 | #define DRM_DEBUG_PRIME(fmt, args...) \ |
227 | do { \ | 229 | do { \ |
228 | drm_ut_debug_printk(DRM_UT_PRIME, DRM_NAME, \ | 230 | if (unlikely(drm_debug & DRM_UT_PRIME)) \ |
229 | __func__, fmt, ##args); \ | 231 | drm_ut_debug_printk(DRM_NAME, __func__, \ |
232 | fmt, ##args); \ | ||
230 | } while (0) | 233 | } while (0) |
231 | #else | 234 | #else |
232 | #define DRM_DEBUG_DRIVER(fmt, args...) do { } while (0) | 235 | #define DRM_DEBUG_DRIVER(fmt, args...) do { } while (0) |