From: Dave Gordon <david.s.gordon@intel.com>
To: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>,
"Goel, Akash" <akash.goel@intel.com>,
Daniel Vetter <daniel@ffwll.ch>
Cc: "intel-gfx@lists.freedesktop.org" <intel-gfx@lists.freedesktop.org>
Subject: Re: [PATCH] drm/i915: Introduce i915_dbg macro
Date: Wed, 27 Jan 2016 17:32:55 +0000 [thread overview]
Message-ID: <56A8FF47.4050001@intel.com> (raw)
In-Reply-To: <1453801476.5393.6.camel@linux.intel.com>
On 26/01/16 09:44, Joonas Lahtinen wrote:
> On ma, 2016-01-25 at 18:57 +0000, Dave Gordon wrote:
>> On 25/01/16 18:17, Daniel Vetter wrote:
>>> On Fri, Jan 22, 2016 at 05:54:15PM +0530, akash.goel@intel.com
>>> wrote:
>>>> From: Akash Goel <akash.goel@intel.com>
>>>>
>>>> Added a new macro i915_dbg, which is a wrapper over dev_dbg
>>>> macro.
>>>> dev_dbg allows use of dynamic debug framework, so offers a number
>>>> of advantages over DRM_DEBUG to debug user space startup issues.
>>>> Like provides more fine grain control by allowing to
>>>> enable/disable
>>>> certain debug messages of interest on the fly, also allows
>>>> filtering
>>>> of debug messages based on pid.
>>>>
>>>> Suggested-by: Chris Wilson <chris@chris-wilson.co.uk>
>>>> Signed-off-by: Akash Goel <akash.goel@intel.com>
>>>> ---
>>>> drivers/gpu/drm/i915/i915_drv.h | 1 +
>>>> 1 file changed, 1 insertion(+)
>>>>
>>>> diff --git a/drivers/gpu/drm/i915/i915_drv.h
>>>> b/drivers/gpu/drm/i915/i915_drv.h
>>>> index bc7164f..749513f 100644
>>>> --- a/drivers/gpu/drm/i915/i915_drv.h
>>>> +++ b/drivers/gpu/drm/i915/i915_drv.h
>>>> @@ -2456,6 +2456,7 @@ struct drm_i915_cmd_table {
>>>> BUILD_BUG(); \
>>>> __p; \
>>>> })
>>>> +#define i915_dbg(DEV, args...) dev_dbg(__I915__(DEV)-
>>>>> dev->dev, ##args)
>>
>> I915_DBG(...) ?
>>
>> It's conventional that macros should be UPPERCASE.
>>
>> Especially when some config options may mean that the code
>> disappears
>> entirely, so you have to be sure not to use arguments with side-
>> effects!
>
> Slight correction here (for future), from Kernel Coding Style
> documentation;
>
> "CAPITALIZED macro names are appreciated but macros resembling
> functions may be named in lower case."
>
> And looking at "include/linux/device.h", dev_dbg definition is a macro
> too, like almost all the printing functions. I'd rather see it as
> i915_dbg. Arguments with side effects can be handled nicely as can be
> seen.
>
> We really should increase the priority of modernizing the debugging
> infrastructure for i915 (and as a dependency for DRM as Daniel hoped).
>
> Regards, Joonas
>
>> .Dave.
The fact that the upstream definitions are not great doesn't mean we
should copy the flaws:
#if defined(CONFIG_DYNAMIC_DEBUG)
#define dev_dbg(dev, format, ...) \
do { \
dynamic_dev_dbg(dev, format, ##__VA_ARGS__); \
} while (0)
#elif defined(DEBUG)
#define dev_dbg(dev, format, arg...) \
dev_printk(KERN_DEBUG, dev, format, ##arg)
#else
#define dev_dbg(dev, format, arg...) \
({ \
if (0) \
dev_printk(KERN_DEBUG, dev, format, ##arg); \
})
#endif
So what's wrong with the above?
Firstly, the CONFIG_DYNAMIC_DEBUG version is wrapped in a do-while(0)
but the others aren't; this makes them different syntactically - it's a
statement body, whereas the others are (void) expressions. In either
case, writing
x = dev_dbg(...);
will give an error (different errors, though!). But the following:
x = 1, dev_dbg(...);
compiles if not CONFIG_DYNAMIC_DEBUG. You probably wouldn't write the
above, but it could itself be the result of a macro expansion, and it
would work (x is assigned 1, dev_dbg() is called) ... until you try to
enable dynamic debug.
(IMHO they should all be wrapped, which ensures you can't get away with
using it in any other way than as a statement.)
Secondly, the CONFIG_DYNAMIC_DEBUG version uses the C99 __VA_ARGS__
syntax, whereas the others use the GCC-specific "arg..." method. This
*probably* won't matter but it's an unnecessary inconsistency.
Thirdly, the non-DEBUG version doesn't evaluate its arguments, whereas
the other two obviously do. So code that includes a side-effect inside
the parameters to the call will behave differently; and there'll be no
clue at all that something that looks like a regular function call:
dev_dbg(mydev, "Been here %d times now", ++i);
... may or may not increment i, depending on the compile-time definition
above. This is just laying traps for the developer; calling it DEV_DBG()
might at least make people *notice* that it's a macro not a function!
.Dave.
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
next prev parent reply other threads:[~2016-01-27 17:32 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-01-22 12:24 [PATCH] drm/i915: Introduce i915_dbg macro akash.goel
2016-01-22 12:43 ` ✗ Fi.CI.BAT: warning for " Patchwork
2016-01-22 12:49 ` [PATCH] " Arun Siluvery
2016-01-22 13:14 ` Chris Wilson
2016-01-25 18:17 ` Daniel Vetter
2016-01-25 18:57 ` Dave Gordon
2016-01-26 9:44 ` Joonas Lahtinen
2016-01-27 17:32 ` Dave Gordon [this message]
2016-01-27 17:50 ` Daniel Vetter
2016-01-28 8:42 ` Joonas Lahtinen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=56A8FF47.4050001@intel.com \
--to=david.s.gordon@intel.com \
--cc=akash.goel@intel.com \
--cc=daniel@ffwll.ch \
--cc=intel-gfx@lists.freedesktop.org \
--cc=joonas.lahtinen@linux.intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.