lkml.org 
[lkml]   [2019]   [Feb]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v4 10/14] dynamic_debug: refactor dynamic_pr_debug and friends
    Date
    For the upcoming 'define the _ddebug descriptor in assembly', we need
    all the descriptors in a translation unit to have distinct
    names (because asm does not understand C scope). The easiest way to
    achieve that is as usual with an extra level of macros, passing the
    identifier to use to the innermost macro, generating it via __UNIQUE_ID
    or something.

    However, instead of repeating that exercise for dynamic_pr_debug,
    dynamic_dev_dbg, dynamic_netdev_dbg and dynamic_hex_dump separately, we
    can use the similarity between their bodies to implement them via a
    common macro, _dynamic_func_call - though the hex_dump case requires
    a slight variant, since print_hex_dump does not take the _ddebug
    descriptor. We'll also get to use that variant elsewhere (btrfs).

    Acked-by: Jason Baron <jbaron@akamai.com>
    Signed-off-by: Rasmus Villemoes <linux@rasmusvillemoes.dk>
    ---
    include/linux/dynamic_debug.h | 72 +++++++++++++++++++++--------------
    1 file changed, 43 insertions(+), 29 deletions(-)

    diff --git a/include/linux/dynamic_debug.h b/include/linux/dynamic_debug.h
    index 3f8977cfa479..c2be029b9b53 100644
    --- a/include/linux/dynamic_debug.h
    +++ b/include/linux/dynamic_debug.h
    @@ -112,40 +112,54 @@ void __dynamic_netdev_dbg(struct _ddebug *descriptor,

    #endif

    -#define dynamic_pr_debug(fmt, ...) \
    -do { \
    - DEFINE_DYNAMIC_DEBUG_METADATA(descriptor, fmt); \
    - if (DYNAMIC_DEBUG_BRANCH(descriptor)) \
    - __dynamic_pr_debug(&descriptor, pr_fmt(fmt), \
    - ##__VA_ARGS__); \
    +#define __dynamic_func_call(id, fmt, func, ...) do { \
    + DEFINE_DYNAMIC_DEBUG_METADATA(id, fmt); \
    + if (DYNAMIC_DEBUG_BRANCH(id)) \
    + func(&id, ##__VA_ARGS__); \
    } while (0)

    -#define dynamic_dev_dbg(dev, fmt, ...) \
    -do { \
    - DEFINE_DYNAMIC_DEBUG_METADATA(descriptor, fmt); \
    - if (DYNAMIC_DEBUG_BRANCH(descriptor)) \
    - __dynamic_dev_dbg(&descriptor, dev, fmt, \
    - ##__VA_ARGS__); \
    +#define __dynamic_func_call_no_desc(id, fmt, func, ...) do { \
    + DEFINE_DYNAMIC_DEBUG_METADATA(id, fmt); \
    + if (DYNAMIC_DEBUG_BRANCH(id)) \
    + func(__VA_ARGS__); \
    } while (0)

    -#define dynamic_netdev_dbg(dev, fmt, ...) \
    -do { \
    - DEFINE_DYNAMIC_DEBUG_METADATA(descriptor, fmt); \
    - if (DYNAMIC_DEBUG_BRANCH(descriptor)) \
    - __dynamic_netdev_dbg(&descriptor, dev, fmt, \
    - ##__VA_ARGS__); \
    -} while (0)
    +/*
    + * "Factory macro" for generating a call to func, guarded by a
    + * DYNAMIC_DEBUG_BRANCH. The dynamic debug decriptor will be
    + * initialized using the fmt argument. The function will be called with
    + * the address of the descriptor as first argument, followed by all
    + * the varargs. Note that fmt is repeated in invocations of this
    + * macro.
    + */
    +#define _dynamic_func_call(fmt, func, ...) \
    + __dynamic_func_call(__UNIQUE_ID(ddebug), fmt, func, ##__VA_ARGS__)
    +/*
    + * A variant that does the same, except that the descriptor is not
    + * passed as the first argument to the function; it is only called
    + * with precisely the macro's varargs.
    + */
    +#define _dynamic_func_call_no_desc(fmt, func, ...) \
    + __dynamic_func_call_no_desc(__UNIQUE_ID(ddebug), fmt, func, ##__VA_ARGS__)

    -#define dynamic_hex_dump(prefix_str, prefix_type, rowsize, \
    - groupsize, buf, len, ascii) \
    -do { \
    - DEFINE_DYNAMIC_DEBUG_METADATA(descriptor, \
    - __builtin_constant_p(prefix_str) ? prefix_str : "hexdump");\
    - if (DYNAMIC_DEBUG_BRANCH(descriptor)) \
    - print_hex_dump(KERN_DEBUG, prefix_str, \
    - prefix_type, rowsize, groupsize, \
    - buf, len, ascii); \
    -} while (0)
    +#define dynamic_pr_debug(fmt, ...) \
    + _dynamic_func_call(fmt, __dynamic_pr_debug, \
    + pr_fmt(fmt), ##__VA_ARGS__)
    +
    +#define dynamic_dev_dbg(dev, fmt, ...) \
    + _dynamic_func_call(fmt,__dynamic_dev_dbg, \
    + dev, fmt, ##__VA_ARGS__)
    +
    +#define dynamic_netdev_dbg(dev, fmt, ...) \
    + _dynamic_func_call(fmt, __dynamic_netdev_dbg, \
    + dev, fmt, ##__VA_ARGS__)
    +
    +#define dynamic_hex_dump(prefix_str, prefix_type, rowsize, \
    + groupsize, buf, len, ascii) \
    + _dynamic_func_call_no_desc(__builtin_constant_p(prefix_str) ? prefix_str : "hexdump", \
    + print_hex_dump, \
    + KERN_DEBUG, prefix_str, prefix_type, \
    + rowsize, groupsize, buf, len, ascii)

    #else

    --
    2.20.1
    \
     
     \ /
      Last update: 2019-02-12 22:43    [W:4.061 / U:0.476 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site