On Tue, Apr 15, 2025 at 4:06 AM Louis Chauvet <louis.chau...@bootlin.com> wrote: > > > > Le 02/04/2025 à 19:41, Jim Cromie a écrit : > > The Xe driver's XE_IOCTL_DBG macro calls drm_dbg() from inside an if > > (expression). This breaks when CONFIG_DRM_USE_DYNAMIC_DEBUG=y because > > the invoked macro has a do-while-0 wrapper. > > > > if (cond && (drm_dbg("expr-form"),1)) { > > ... do some more stuff > > } > > > > Fix for this usage by changing __dynamic_func_call_cls{,_no_desc} > > macros into expressions, by replacing the do-while-0s with a ({ }) > > wrapper. In the common usage, the trailing ';' converts the > > expression into a statement. > > > > drm_dbg("statement form"); > > > > Signed-off-by: Jim Cromie <jim.cro...@gmail.com> > > --- > > --- > > include/linux/dynamic_debug.h | 12 ++++++------ > > 1 file changed, 6 insertions(+), 6 deletions(-) > > > > diff --git a/include/linux/dynamic_debug.h b/include/linux/dynamic_debug.h > > index ce221a702f84..2d87cca27544 100644 > > --- a/include/linux/dynamic_debug.h > > +++ b/include/linux/dynamic_debug.h > > @@ -337,20 +337,20 @@ void __dynamic_ibdev_dbg(struct _ddebug *descriptor, > > * (|_cls): adds in _DPRINT_CLASS_DFLT as needed > > * (|_no_desc): former gets callsite descriptor as 1st arg (for > > prdbgs) > > */ > > -#define __dynamic_func_call_cls(id, cls, fmt, func, ...) do { \ > > - DEFINE_DYNAMIC_DEBUG_METADATA_CLS((id), cls, fmt); \ > > +#define __dynamic_func_call_cls(id, cls, fmt, func, ...) ({ \ > > + DEFINE_DYNAMIC_DEBUG_METADATA_CLS(id, cls, fmt); \ > > You remove the protection around id here. > > > if (DYNAMIC_DEBUG_BRANCH(id)) \ > > - func(&id, ##__VA_ARGS__); \ > > -} while (0) > > + func(&(id), ##__VA_ARGS__); \ > > But you add the protection here. > > I think in macro it is better to be defensive, so I expect to have () > everywhere (except places where it breaks the compilation). >
yeah, Im a bit inconsistent. defensive parens are almost never a compilation err. I'll go thru the macros again > > +}) > > #define __dynamic_func_call(id, fmt, func, ...) > > \ > > __dynamic_func_call_cls(id, _DPRINTK_CLASS_DFLT, fmt, \ > > func, ##__VA_ARGS__) > > > > -#define __dynamic_func_call_cls_no_desc(id, cls, fmt, func, ...) do { > > \ > > +#define __dynamic_func_call_cls_no_desc(id, cls, fmt, func, ...) ({ \ > > DEFINE_DYNAMIC_DEBUG_METADATA_CLS(id, cls, fmt); \ > > if (DYNAMIC_DEBUG_BRANCH(id)) \ > > func(__VA_ARGS__); \ > > -} while (0) > > +}) > > #define __dynamic_func_call_no_desc(id, fmt, func, ...) > > \ > > __dynamic_func_call_cls_no_desc(id, _DPRINTK_CLASS_DFLT, \ > > fmt, func, ##__VA_ARGS__) > > -- > Louis Chauvet, Bootlin > Embedded Linux and Kernel engineering > https://bootlin.com > >