Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a73d4e91 authored by Lespiau, Damien's avatar Lespiau, Damien Committed by Dave Airlie
Browse files

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: default avatarDamien Lespiau <damien.lespiau@intel.com>
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
parent 8fa6a9e7
Loading
Loading
Loading
Loading
+12 −14
Original line number Diff line number Diff line
@@ -97,15 +97,13 @@ 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;
@@ -115,9 +113,9 @@ void drm_ut_debug_printk(unsigned int request_level,
		       function_name, &vaf);
	else
		printk(KERN_DEBUG "%pV", &vaf);

	va_end(args);
}
}
EXPORT_SYMBOL(drm_ut_debug_printk);

struct drm_master *drm_master_create(struct drm_minor *minor)
+15 −12
Original line number Diff line number Diff line
@@ -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...)					\
	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)