[Intel-gfx] [PATCH v3 3/5] drm/print: RFC add choice to use dynamic debug in drm-debug
Sean Paul
sean at poorly.run
Tue Jul 27 14:02:35 UTC 2021
On Thu, Jul 22, 2021 at 11:20 AM Sean Paul <sean at poorly.run> wrote:
>
Reply-all fail. Adding everyone else back to my response.
> On Tue, Jul 20, 2021 at 03:29:34PM +0200, Daniel Vetter wrote:
> > On Wed, Jul 14, 2021 at 11:51:36AM -0600, Jim Cromie wrote:
> > > drm's debug system uses distinct categories of debug messages, encoded
> > > in an enum (DRM_UT_<CATEGORY>), which are mapped to bits in drm.debug.
> > > drm_debug_enabled() does a lot of unlikely bit-mask checks on
> > > drm.debug; we can use dynamic debug instead, and get all that
> > > static_key/jump_label goodness.
>
> Hi Jim,
> Thanks for your patches! Daniel pointed me at them in response to my drm_trace
> patchset (https://patchwork.freedesktop.org/series/78133/). I'd love to get your
> input on it. I think the 2 sets are mostly compatible, we'd just need to keep
> drm_dev_dbg and do the CONFIG check in the function beside the trace_enabled
> checks.
>
> > >
> > > Dynamic debug has no concept of category, but we can map the DRM_UT_*
> > > to a set of distinct prefixes; "drm:core:", "drm:kms:" etc, and
> > > prepend them to the given formats.
> > >
> > > Then we can use:
> > > `echo module drm format ^drm:core: +p > control`
> > >
> > > to enable every such "prefixed" pr_debug with one query. This new
> > > prefix changes pr_debug's output, so is user visible, but it seems
> > > unlikely to cause trouble for log watchers; they're not relying on the
> > > absence of class prefix strings.
> > >
> > > This conversion yields ~2100 new callsites on my i7/i915 laptop:
> > >
> > > dyndbg: 195 debug prints in module drm_kms_helper
> > > dyndbg: 298 debug prints in module drm
> > > dyndbg: 1630 debug prints in module i915
> > >
> > > CONFIG_DRM_USE_DYNAMIC_DEBUG enables this, and is available if
> > > CONFIG_DYNAMIC_DEBUG or CONFIG_DYNAMIC_DEBUG_CORE is chosen, and if
> > > CONFIG_JUMP_LABEL is enabled; this because its required to get the
> > > promised optimizations.
> > >
> > > The indirection/switchover is layered into the macro scheme:
> > >
> > > 0. A new callback on drm.debug which calls dynamic_debug_exec_queries
> > > to map those bits to specific query/commands
> > > dynamic_debug_exec_queries("format ^drm:kms: +p", "drm*");
> > > here for POC, this should be in dynamic_debug.c
> > > with a MODULE_PARAM_DEBUG_BITMAP(__drm_debug, { "prefix-1", "desc-1" }+)
> >
> > This is really awesome.
>
>
> Agreed, this is a very clever way of merging the 2 worlds!
>
>
> > For merging I think we need to discuss with dyn
> > debug folks whether they're all ok with this, but it's exported already
> > should should be fine.
>
> I wonder if this is a good time to reconsider our drm categories. IMO they're
> overly broad and it's hard to get the right information without subscribing to
> the firehose. It seems like dyndbg might be a good opportunity to unlock
> subcategories of log messages.
>
> More concretely, on CrOS we can't subscribe to atomic or state categories since
> they're too noisy. However if there was a "fail" subcategory which dumped
> state/atomic logs on check failures, that would be really compelling. Something
> like:
>
> drm:atomic:fail vs. drm:atomic
>
> Both would be picked up if (drm.debug & DRM_DBG_ATOMIC), however it would allow
> dyndbg-aware clients to get better logs without having a huge table of
> individual log signatures.
>
> I'm not sure how tightly we'd want to control the subcategories. It could be
> strict like the categories spelled out in drm_print.h, or an open prefix arg to
> drm_dev_dbg. I suspect we'd want the former, but would want to be careful to
> provide enough flexibility to properly
>
> Of course, none of this needs to be decided to land this initial support, it can
> be bolted on later easily enough (I think).
>
>
> >
> > >
> > > 1. A "converted" or "classy" DRM_UT_* map
> > >
> > > based on: DRM_UT_* ( symbol => bit-mask )
> > > named it: cDRM_UT_* ( symbol => format-class-prefix-string )
> > >
> > > So cDRM_UT_* is either:
> > > legacy: cDRM_UT_* <-- DRM_UT_* ( !CONFIG_DRM_USE_DYNAMIC_DEBUG )
> > > enabled:
> > > #define cDRM_UT_KMS "drm:kms: "
> > > #define cDRM_UT_PRIME "drm:prime: "
> > > #define cDRM_UT_ATOMIC "drm:atomic: "
> >
> > the cDRM looks a bit funny, plus I don't eve have an idea what _UT_ means
> > (and git history isn't helpful either). What about just using
> > DRM_DBG_CLASS_ as the prefix here for these indirection macros, i.e.
> > DRM_DBG_CLASS_KMS.
> >
> > Also would be really nice if we could make these a table or something, but
> > I guess with the macro magic that's not possible.
> >
> > >
> > > DRM_UT_* are unchanged, since theyre used in drm_debug_enabled()
> > > and elsewhere.
> >
> > I think for the production version of these we need to retire/deprecate
> > them, at least for drm core. Otherwise you have an annoying mismatch
> > between drm.debug module option and dyn debug.
> >
> > >
> > > 2. drm_dev_dbg & drm_debug are renamed (prefixed with '_')
> > >
> > > old names are now macros, calling either:
> > > legacy: -> to renamed fn
> > > enabled: -> dev_dbg & pr_debug, with cDRM-prefix # format.
> > >
> > > these names are used in a fat layer of macros (3) which supply the
> > > category; those macros are used throughout drm code, yielding the
> > > ~2100 new prdbgs reported above.
> > >
> > > 3. names in (2) are invoked by DRM_DEBUG_<Category>, drm_dbg_<Category>.
> > >
> > > all these macros get "converted" to use cDRM_UT_*
> > > to get right token type for both !/!! DRM_USE_DYNAMIC_DEBUG
> > >
> > > 4. simplification of __DRM_DEFINE_DBG_RATELIMITED macro
> > >
> > > remove DRM_UT_ ## KMS as extra indirection
> > > pass both DRM_UT & cDRM_UT, for drm_debug_enabled & drm_dev_dbg
> >
> > For merging, can we pull out the renames and reorgs from this patch, and
> > then maybe also the reorder the next patch in your series here to be
> > before the dyn debug stuff?
> >
> > > Signed-off-by: Jim Cromie <jim.cromie at gmail.com>
> > > ---
> > > drivers/gpu/drm/Kconfig | 13 +++++
> > > drivers/gpu/drm/drm_print.c | 75 ++++++++++++++++++++++++--
> > > include/drm/drm_print.h | 102 ++++++++++++++++++++++++++----------
> > > 3 files changed, 158 insertions(+), 32 deletions(-)
> >
> > I really like this, I think you can drop the RFC. A few more things that I
> > think we need:
> >
> > - An overview kerneldoc section which explains the interfaces and how it
> > all works together. Essentially your commit message with some light
> > markup to make it look good.
> >
> > - I think it would be really good to review the driver docs for all this
> > and make sure it's complete. Some of the interface functions aren't
> > documented yet (or maybe the ones that drivers shouldn't used need more
> > __ prefixes to denote them as internal, dunno).
> >
> > - I guess deprecation notice for drm_debug_enabled() and all that, so that
> > we have a consistent interface. Doing the conversion will probably
> > highlight the need for a bit more infrastructure and tooling, e.g. the
> > bigger dump functions (like edid hex dump, or also the various decode
> > helpers we have for dp, hdmi infoframes and all that) ideally have a
> > single dyn_debug label to enable all of them instead of line-by-line.
> > Tbh no idea how this should work, might need dyndbg work too.
>
> Yeah, this is going to be tricky.
>
> We'll probably need to enumerate these fully and if the process of gathering
> the data is simple or already done in the course of the function, just avoid the
> drm_debug_enabled() call with a CONFIG_DRM_DYNDBG check.
>
> If the debug_enabled call gates a HW access, we probably need to query dyndbg
> for the prefix the logs are associated with before gathering the log contents.
>
> Sean
> >
> > - For the driver side of this we probably want a
> > Documentation/gpu/TODO.rst entry if it's not all easy to convert
> > directly.
> >
> > >
> > > diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig
> > > index 7ff89690a976..e4524ccba040 100644
> > > --- a/drivers/gpu/drm/Kconfig
> > > +++ b/drivers/gpu/drm/Kconfig
> > > @@ -57,6 +57,19 @@ config DRM_DEBUG_MM
> > >
> > > If in doubt, say "N".
> > >
> > > +config DRM_USE_DYNAMIC_DEBUG
> > > + bool "use dynamic debug to implement drm.debug"
> > > + default n
> > > + depends on DRM
> > > + depends on DYNAMIC_DEBUG || DYNAMIC_DEBUG_CORE
> > > + depends on JUMP_LABEL
> > > + help
> > > + The drm debug category facility does a lot of unlikely bit-field
> > > + tests at runtime; while cheap individually, the cost accumulates.
> > > + This option uses dynamic debug facility (if configured and
> > > + using jump_label) to avoid those runtime checks, patching
> > > + the kernel when those debugs are desired.
> >
> > Can't we just make this an internal option that's enabled automatically
> > when dyndbg is around? Plus a comment somewhere that we really recommend
> > enabling dyndbg for drm. Or would this mean that in certain dyndbg
> > configurations we'd loose all the debug lines, which would suck?
> >
> > Anyway there's a pile of details, but the big picture I really like.
> > Especially that we can make dyndbg seamlessly support drm.debug is really
> > nice.
> >
> > Cheers, Daniel
> >
> > > +
> > > config DRM_DEBUG_SELFTEST
> > > tristate "kselftests for DRM"
> > > depends on DRM
> > > diff --git a/drivers/gpu/drm/drm_print.c b/drivers/gpu/drm/drm_print.c
> > > index 111b932cf2a9..e2acdfc7088b 100644
> > > --- a/drivers/gpu/drm/drm_print.c
> > > +++ b/drivers/gpu/drm/drm_print.c
> > > @@ -52,8 +52,75 @@ MODULE_PARM_DESC(debug, "Enable debug output, where each bit enables a debug cat
> > > "\t\tBit 5 (0x20) will enable VBL messages (vblank code)\n"
> > > "\t\tBit 7 (0x80) will enable LEASE messages (leasing code)\n"
> > > "\t\tBit 8 (0x100) will enable DP messages (displayport code)");
> > > +
> > > +#ifndef CONFIG_DRM_USE_DYNAMIC_DEBUG
> > > module_param_named(debug, __drm_debug, int, 0600);
> > >
> > > +#else
> > > +static char *format_class_prefixes[] = {
> > > + cDRM_UT_CORE,
> > > + cDRM_UT_DRIVER,
> > > + cDRM_UT_KMS,
> > > + cDRM_UT_PRIME,
> > > + cDRM_UT_ATOMIC,
> > > + cDRM_UT_VBL,
> > > + cDRM_UT_STATE,
> > > + cDRM_UT_LEASE,
> > > + cDRM_UT_DP,
> > > + cDRM_UT_DRMRES
> > > +};
> > > +
> > > +#define OUR_QUERY_SIZE 64 /* > strlen "format '^%s' %cp" + longest prefix */
> > > +
> > > +static int param_set_dyndbg(const char *instr, const struct kernel_param *kp)
> > > +{
> > > + unsigned int val;
> > > + unsigned long changes, result;
> > > + int rc, chgct = 0, totct = 0, bitpos;
> > > + char query[OUR_QUERY_SIZE];
> > > +
> > > + rc = kstrtouint(instr, 0, &val);
> > > + if (rc) {
> > > + pr_err("%s: failed\n", __func__);
> > > + return -EINVAL;
> > > + }
> > > + result = val;
> > > + changes = result ^ __drm_debug;
> > > +
> > > + pr_debug("changes:0x%lx from result:0x%lx\n", changes, result);
> > > +
> > > + for_each_set_bit(bitpos, &changes, ARRAY_SIZE(format_class_prefixes)) {
> > > +
> > > + sprintf(query, "format '^%s' %cp", format_class_prefixes[bitpos],
> > > + test_bit(bitpos, &result) ? '+' : '-');
> > > +
> > > + chgct = dynamic_debug_exec_queries(query, "drm*");
> > > + if (chgct < 0) {
> > > + pr_err("%s: exec err:%d on: %s\n", __func__, chgct, query);
> > > + continue;
> > > + }
> > > + pr_debug("change ct:%d on %s\n", chgct, query);
> > > + totct += chgct;
> > > + }
> > > + pr_debug("total changes: %d\n", totct);
> > > + __drm_debug = result;
> > > + return 0;
> > > +}
> > > +
> > > +static int param_get_dyndbg(char *buffer, const struct kernel_param *kp)
> > > +{
> > > + pr_debug("debug-val:0x%x %u\n", __drm_debug, *((unsigned int *)kp->arg));
> > > + return scnprintf(buffer, PAGE_SIZE, "%u\n",
> > > + *((unsigned int *)kp->arg));
> > > +}
> > > +static const struct kernel_param_ops param_ops_debug = {
> > > + .set = param_set_dyndbg,
> > > + .get = param_get_dyndbg,
> > > +};
> > > +module_param_cb(debug, ¶m_ops_debug, &__drm_debug, 0644);
> > > +
> > > +#endif /* CONFIG_DRM_USE_DYNAMIC_DEBUG */
> > > +
> > > void __drm_puts_coredump(struct drm_printer *p, const char *str)
> > > {
> > > struct drm_print_iterator *iterator = p->arg;
> > > @@ -256,7 +323,7 @@ void drm_dev_printk(const struct device *dev, const char *level,
> > > }
> > > EXPORT_SYMBOL(drm_dev_printk);
> > >
> > > -void drm_dev_dbg(const struct device *dev, enum drm_debug_category category,
> > > +void _drm_dev_dbg(const struct device *dev, enum drm_debug_category category,
> > > const char *format, ...)
> > > {
> > > struct va_format vaf;
> > > @@ -278,9 +345,9 @@ void drm_dev_dbg(const struct device *dev, enum drm_debug_category category,
> > >
> > > va_end(args);
> > > }
> > > -EXPORT_SYMBOL(drm_dev_dbg);
> > > +EXPORT_SYMBOL(_drm_dev_dbg);
> > >
> > > -void __drm_dbg(enum drm_debug_category category, const char *format, ...)
> > > +void ___drm_dbg(enum drm_debug_category category, const char *format, ...)
> > > {
> > > struct va_format vaf;
> > > va_list args;
> > > @@ -297,7 +364,7 @@ void __drm_dbg(enum drm_debug_category category, const char *format, ...)
> > >
> > > va_end(args);
> > > }
> > > -EXPORT_SYMBOL(__drm_dbg);
> > > +EXPORT_SYMBOL(___drm_dbg);
> > >
> > > void __drm_err(const char *format, ...)
> > > {
> > > diff --git a/include/drm/drm_print.h b/include/drm/drm_print.h
> > > index ff5ac0e88321..499fa0b35200 100644
> > > --- a/include/drm/drm_print.h
> > > +++ b/include/drm/drm_print.h
> > > @@ -319,6 +319,51 @@ enum drm_debug_category {
> > > DRM_UT_DRMRES = 0x200,
> > > };
> > >
> > > +#if !defined(CONFIG_DRM_USE_DYNAMIC_DEBUG)
> > > +
> > > +/* Use legacy drm-debug functions, and drm_debug_enabled().
> > > + * For cDRM_UT_* (converted category), identity map to DRM_UT_*
> > > + */
> > > +#define __drm_dbg(cls, fmt, ...) \
> > > + ___drm_dbg(cls, fmt, ##__VA_ARGS__)
> > > +#define drm_dev_dbg(dev, cls, fmt, ...) \
> > > + _drm_dev_dbg(dev, cls, fmt, ##__VA_ARGS__)
> > > +
> > > +#define cDRM_UT_CORE DRM_UT_CORE
> > > +#define cDRM_UT_DRIVER DRM_UT_DRIVER
> > > +#define cDRM_UT_KMS DRM_UT_KMS
> > > +#define cDRM_UT_PRIME DRM_UT_PRIME
> > > +#define cDRM_UT_ATOMIC DRM_UT_ATOMIC
> > > +#define cDRM_UT_VBL DRM_UT_VBL
> > > +#define cDRM_UT_STATE DRM_UT_STATE
> > > +#define cDRM_UT_LEASE DRM_UT_LEASE
> > > +#define cDRM_UT_DP DRM_UT_DP
> > > +#define cDRM_UT_DRMRES DRM_UT_DRMRES
> > > +
> > > +#else /* !CONFIG_DRM_USE_DYNAMIC_DEBUG */
> > > +
> > > +/* use dynamic_debug to avoid drm_debug_enabled().
> > > + * dyndbg has no category, so we prefix the format with a "class"
> > > + * string; cDRM_UT_* maps to those class strings
> > > + */
> > > +#define __drm_dbg(cls, fmt, ...) \
> > > + pr_debug(cls # fmt, ##__VA_ARGS__)
> > > +#define drm_dev_dbg(dev, cls, fmt, ...) \
> > > + dev_dbg(dev, cls # fmt, ##__VA_ARGS__)
> > > +
> > > +#define cDRM_UT_CORE "drm:core: "
> > > +#define cDRM_UT_DRIVER "drm:drvr: "
> > > +#define cDRM_UT_KMS "drm:kms: "
> > > +#define cDRM_UT_PRIME "drm:prime: "
> > > +#define cDRM_UT_ATOMIC "drm:atomic: "
> > > +#define cDRM_UT_VBL "drm:vbl: "
> > > +#define cDRM_UT_STATE "drm:state: "
> > > +#define cDRM_UT_LEASE "drm:lease: "
> > > +#define cDRM_UT_DP "drm:dp: "
> > > +#define cDRM_UT_DRMRES "drm:res "
> > > +
> > > +#endif /* !CONFIG_DRM_USE_DYNAMIC_DEBUG */
> > > +
> > > static inline bool drm_debug_enabled(enum drm_debug_category category)
> > > {
> > > return unlikely(__drm_debug & category);
> > > @@ -334,7 +379,7 @@ __printf(3, 4)
> > > void drm_dev_printk(const struct device *dev, const char *level,
> > > const char *format, ...);
> > > __printf(3, 4)
> > > -void drm_dev_dbg(const struct device *dev, enum drm_debug_category category,
> > > +void _drm_dev_dbg(const struct device *dev, enum drm_debug_category category,
> > > const char *format, ...);
> > >
> > > /**
> > > @@ -383,7 +428,7 @@ void drm_dev_dbg(const struct device *dev, enum drm_debug_category category,
> > > * @fmt: printf() like format string.
> > > */
> > > #define DRM_DEV_DEBUG(dev, fmt, ...) \
> > > - drm_dev_dbg(dev, DRM_UT_CORE, fmt, ##__VA_ARGS__)
> > > + drm_dev_dbg(dev, cDRM_UT_CORE, fmt, ##__VA_ARGS__)
> > > /**
> > > * DRM_DEV_DEBUG_DRIVER() - Debug output for vendor specific part of the driver
> > > *
> > > @@ -391,7 +436,7 @@ void drm_dev_dbg(const struct device *dev, enum drm_debug_category category,
> > > * @fmt: printf() like format string.
> > > */
> > > #define DRM_DEV_DEBUG_DRIVER(dev, fmt, ...) \
> > > - drm_dev_dbg(dev, DRM_UT_DRIVER, fmt, ##__VA_ARGS__)
> > > + drm_dev_dbg(dev, cDRM_UT_DRIVER, fmt, ##__VA_ARGS__)
> > > /**
> > > * DRM_DEV_DEBUG_KMS() - Debug output for modesetting code
> > > *
> > > @@ -399,7 +444,7 @@ void drm_dev_dbg(const struct device *dev, enum drm_debug_category category,
> > > * @fmt: printf() like format string.
> > > */
> > > #define DRM_DEV_DEBUG_KMS(dev, fmt, ...) \
> > > - drm_dev_dbg(dev, DRM_UT_KMS, fmt, ##__VA_ARGS__)
> > > + drm_dev_dbg(dev, cDRM_UT_KMS, fmt, ##__VA_ARGS__)
> > >
> > > /*
> > > * struct drm_device based logging
> > > @@ -443,25 +488,25 @@ void drm_dev_dbg(const struct device *dev, enum drm_debug_category category,
> > >
> > >
> > > #define drm_dbg_core(drm, fmt, ...) \
> > > - drm_dev_dbg((drm) ? (drm)->dev : NULL, DRM_UT_CORE, fmt, ##__VA_ARGS__)
> > > + drm_dev_dbg((drm) ? (drm)->dev : NULL, cDRM_UT_CORE, fmt, ##__VA_ARGS__)
> > > #define drm_dbg(drm, fmt, ...) \
> > > - drm_dev_dbg((drm) ? (drm)->dev : NULL, DRM_UT_DRIVER, fmt, ##__VA_ARGS__)
> > > + drm_dev_dbg((drm) ? (drm)->dev : NULL, cDRM_UT_DRIVER, fmt, ##__VA_ARGS__)
> > > #define drm_dbg_kms(drm, fmt, ...) \
> > > - drm_dev_dbg((drm) ? (drm)->dev : NULL, DRM_UT_KMS, fmt, ##__VA_ARGS__)
> > > + drm_dev_dbg((drm) ? (drm)->dev : NULL, cDRM_UT_KMS, fmt, ##__VA_ARGS__)
> > > #define drm_dbg_prime(drm, fmt, ...) \
> > > - drm_dev_dbg((drm) ? (drm)->dev : NULL, DRM_UT_PRIME, fmt, ##__VA_ARGS__)
> > > + drm_dev_dbg((drm) ? (drm)->dev : NULL, cDRM_UT_PRIME, fmt, ##__VA_ARGS__)
> > > #define drm_dbg_atomic(drm, fmt, ...) \
> > > - drm_dev_dbg((drm) ? (drm)->dev : NULL, DRM_UT_ATOMIC, fmt, ##__VA_ARGS__)
> > > + drm_dev_dbg((drm) ? (drm)->dev : NULL, cDRM_UT_ATOMIC, fmt, ##__VA_ARGS__)
> > > #define drm_dbg_vbl(drm, fmt, ...) \
> > > - drm_dev_dbg((drm) ? (drm)->dev : NULL, DRM_UT_VBL, fmt, ##__VA_ARGS__)
> > > + drm_dev_dbg((drm) ? (drm)->dev : NULL, cDRM_UT_VBL, fmt, ##__VA_ARGS__)
> > > #define drm_dbg_state(drm, fmt, ...) \
> > > - drm_dev_dbg((drm) ? (drm)->dev : NULL, DRM_UT_STATE, fmt, ##__VA_ARGS__)
> > > + drm_dev_dbg((drm) ? (drm)->dev : NULL, cDRM_UT_STATE, fmt, ##__VA_ARGS__)
> > > #define drm_dbg_lease(drm, fmt, ...) \
> > > - drm_dev_dbg((drm) ? (drm)->dev : NULL, DRM_UT_LEASE, fmt, ##__VA_ARGS__)
> > > + drm_dev_dbg((drm) ? (drm)->dev : NULL, cDRM_UT_LEASE, fmt, ##__VA_ARGS__)
> > > #define drm_dbg_dp(drm, fmt, ...) \
> > > - drm_dev_dbg((drm) ? (drm)->dev : NULL, DRM_UT_DP, fmt, ##__VA_ARGS__)
> > > + drm_dev_dbg((drm) ? (drm)->dev : NULL, cDRM_UT_DP, fmt, ##__VA_ARGS__)
> > > #define drm_dbg_drmres(drm, fmt, ...) \
> > > - drm_dev_dbg((drm) ? (drm)->dev : NULL, DRM_UT_DRMRES, fmt, ##__VA_ARGS__)
> > > + drm_dev_dbg((drm) ? (drm)->dev : NULL, cDRM_UT_DRMRES, fmt, ##__VA_ARGS__)
> > >
> > >
> > > /*
> > > @@ -471,7 +516,7 @@ void drm_dev_dbg(const struct device *dev, enum drm_debug_category category,
> > > */
> > >
> > > __printf(2, 3)
> > > -void __drm_dbg(enum drm_debug_category category, const char *format, ...);
> > > +void ___drm_dbg(enum drm_debug_category category, const char *format, ...);
> > > __printf(1, 2)
> > > void __drm_err(const char *format, ...);
> > >
> > > @@ -500,44 +545,45 @@ void __drm_err(const char *format, ...);
> > > #define DRM_ERROR_RATELIMITED(fmt, ...) \
> > > DRM_DEV_ERROR_RATELIMITED(NULL, fmt, ##__VA_ARGS__)
> > >
> > > +
> > > #define DRM_DEBUG(fmt, ...) \
> > > - __drm_dbg(DRM_UT_CORE, fmt, ##__VA_ARGS__)
> > > + __drm_dbg(cDRM_UT_CORE, fmt, ##__VA_ARGS__)
> > >
> > > #define DRM_DEBUG_DRIVER(fmt, ...) \
> > > - __drm_dbg(DRM_UT_DRIVER, fmt, ##__VA_ARGS__)
> > > + __drm_dbg(cDRM_UT_DRIVER, fmt, ##__VA_ARGS__)
> > >
> > > #define DRM_DEBUG_KMS(fmt, ...) \
> > > - __drm_dbg(DRM_UT_KMS, fmt, ##__VA_ARGS__)
> > > + __drm_dbg(cDRM_UT_KMS, fmt, ##__VA_ARGS__)
> > >
> > > #define DRM_DEBUG_PRIME(fmt, ...) \
> > > - __drm_dbg(DRM_UT_PRIME, fmt, ##__VA_ARGS__)
> > > + __drm_dbg(cDRM_UT_PRIME, fmt, ##__VA_ARGS__)
> > >
> > > #define DRM_DEBUG_ATOMIC(fmt, ...) \
> > > - __drm_dbg(DRM_UT_ATOMIC, fmt, ##__VA_ARGS__)
> > > + __drm_dbg(cDRM_UT_ATOMIC, fmt, ##__VA_ARGS__)
> > >
> > > #define DRM_DEBUG_VBL(fmt, ...) \
> > > - __drm_dbg(DRM_UT_VBL, fmt, ##__VA_ARGS__)
> > > + __drm_dbg(cDRM_UT_VBL, fmt, ##__VA_ARGS__)
> > >
> > > #define DRM_DEBUG_LEASE(fmt, ...) \
> > > - __drm_dbg(DRM_UT_LEASE, fmt, ##__VA_ARGS__)
> > > + __drm_dbg(cDRM_UT_LEASE, fmt, ##__VA_ARGS__)
> > >
> > > #define DRM_DEBUG_DP(fmt, ...) \
> > > - __drm_dbg(DRM_UT_DP, fmt, ## __VA_ARGS__)
> > > + __drm_dbg(cDRM_UT_DP, fmt, ## __VA_ARGS__)
> > >
> > > -#define __DRM_DEFINE_DBG_RATELIMITED(category, drm, fmt, ...) \
> > > +#define __DRM_DEFINE_DBG_RATELIMITED(DRM_UT, cDRM_UT, drm, fmt, ...) \
> > > ({ \
> > > static DEFINE_RATELIMIT_STATE(rs_, \
> > > DEFAULT_RATELIMIT_INTERVAL, \
> > > DEFAULT_RATELIMIT_BURST); \
> > > const struct drm_device *drm_ = (drm); \
> > > \
> > > - if (drm_debug_enabled(DRM_UT_ ## category) && __ratelimit(&rs_))\
> > > - drm_dev_printk(drm_ ? drm_->dev : NULL, \
> > > - KERN_DEBUG, fmt, ## __VA_ARGS__); \
> > > + if (drm_debug_enabled(DRM_UT) && __ratelimit(&rs_)) \
> > > + drm_dev_dbg((drm_) ? (drm_)->dev : NULL, \
> > > + cDRM_UT, fmt, ##__VA_ARGS__); \
> > > })
> > >
> > > #define drm_dbg_kms_ratelimited(drm, fmt, ...) \
> > > - __DRM_DEFINE_DBG_RATELIMITED(KMS, drm, fmt, ## __VA_ARGS__)
> > > + __DRM_DEFINE_DBG_RATELIMITED(DRM_UT_KMS, cDRM_UT_KMS, drm, fmt, ## __VA_ARGS__)
> > >
> > > #define DRM_DEBUG_KMS_RATELIMITED(fmt, ...) \
> > > drm_dbg_kms_ratelimited(NULL, fmt, ## __VA_ARGS__)
> > > --
> > > 2.31.1
> > >
> >
> > --
> > Daniel Vetter
> > Software Engineer, Intel Corporation
> > http://blog.ffwll.ch
> > _______________________________________________
> > Intel-gfx mailing list
> > Intel-gfx at lists.freedesktop.org
> > https://lists.freedesktop.org/mailman/listinfo/intel-gfx
>
> --
> Sean Paul, Software Engineer, Google / Chromium OS
More information about the Intel-gfx
mailing list