Re: [PATCH rdma-next v4 01/12] RDMA/core: Introduce RDMA subsystem ibdev_* print functions

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, Mar 28, 2019 at 02:39:21PM +0200, Gal Pressman wrote:
> Similarly to dev/netdev/etc printk helpers, add standard printk helpers
> for the RDMA subsystem.
>
> Example output:
> efa 0000:00:06.0 efa_0: Hello World!
> efa_0: Hello World! (no parent device set)
> (NULL ib_device): Hello World! (ibdev is NULL)
>
> Cc: Jason Baron <jbaron@xxxxxxxxxx>
> Signed-off-by: Gal Pressman <galpress@xxxxxxxxxx>

Thanks Gal,

Overall looks very good.

> ---
>  drivers/infiniband/core/device.c | 60 ++++++++++++++++++++++++++++++++++++++++
>  include/linux/dynamic_debug.h    | 11 ++++++++
>  include/rdma/ib_verbs.h          | 34 +++++++++++++++++++++++
>  lib/dynamic_debug.c              | 40 +++++++++++++++++++++++++++
>  4 files changed, 145 insertions(+)
>
> diff --git a/drivers/infiniband/core/device.c b/drivers/infiniband/core/device.c
> index 7421ec4883fb..a300218d3f99 100644
> --- a/drivers/infiniband/core/device.c
> +++ b/drivers/infiniband/core/device.c
> @@ -147,6 +147,66 @@ static int ib_security_change(struct notifier_block *nb, unsigned long event,
>  static void ib_policy_change_task(struct work_struct *work);
>  static DECLARE_WORK(ib_policy_change_work, ib_policy_change_task);
>
> +static void __ibdev_printk(const char *level, const struct ib_device *ibdev,
> +			   struct va_format *vaf)
> +{
> +	if (ibdev && ibdev->dev.parent)
> +		dev_printk_emit(level[1] - '0',
> +				ibdev->dev.parent,
> +				"%s %s %s: %pV",
> +				dev_driver_string(ibdev->dev.parent),
> +				dev_name(ibdev->dev.parent),
> +				dev_name(&ibdev->dev),
> +				vaf);
> +	else if (ibdev)
> +		printk("%s%s: %pV",
> +		       level, dev_name(&ibdev->dev), vaf);
> +	else
> +		printk("%s(NULL ib_device): %pV", level, vaf);
> +}
> +
> +void ibdev_printk(const char *level, const struct ib_device *ibdev,
> +		  const char *format, ...)
> +{
> +	struct va_format vaf;
> +	va_list args;
> +
> +	va_start(args, format);
> +
> +	vaf.fmt = format;
> +	vaf.va = &args;
> +
> +	__ibdev_printk(level, ibdev, &vaf);
> +
> +	va_end(args);
> +}
> +EXPORT_SYMBOL(ibdev_printk);
> +
> +#define define_ibdev_printk_level(func, level)                  \
> +void func(const struct ib_device *ibdev, const char *fmt, ...)  \
> +{                                                               \
> +	struct va_format vaf;                                   \
> +	va_list args;                                           \
> +								\
> +	va_start(args, fmt);                                    \
> +								\
> +	vaf.fmt = fmt;                                          \
> +	vaf.va = &args;                                         \
> +								\
> +	__ibdev_printk(level, ibdev, &vaf);                     \
> +								\
> +	va_end(args);                                           \
> +}                                                               \
> +EXPORT_SYMBOL(func);
> +
> +define_ibdev_printk_level(ibdev_emerg, KERN_EMERG);
> +define_ibdev_printk_level(ibdev_alert, KERN_ALERT);
> +define_ibdev_printk_level(ibdev_crit, KERN_CRIT);
> +define_ibdev_printk_level(ibdev_err, KERN_ERR);
> +define_ibdev_printk_level(ibdev_warn, KERN_WARNING);
> +define_ibdev_printk_level(ibdev_notice, KERN_NOTICE);
> +define_ibdev_printk_level(ibdev_info, KERN_INFO);
> +
>  static struct notifier_block ibdev_lsm_nb = {
>  	.notifier_call = ib_security_change,
>  };
> diff --git a/include/linux/dynamic_debug.h b/include/linux/dynamic_debug.h
> index c2be029b9b53..6c809440f319 100644
> --- a/include/linux/dynamic_debug.h
> +++ b/include/linux/dynamic_debug.h
> @@ -71,6 +71,13 @@ void __dynamic_netdev_dbg(struct _ddebug *descriptor,
>  			  const struct net_device *dev,
>  			  const char *fmt, ...);
>
> +struct ib_device;
> +
> +extern __printf(3, 4)
> +void __dynamic_ibdev_dbg(struct _ddebug *descriptor,
> +			 const struct ib_device *ibdev,
> +			 const char *fmt, ...);

You guarded the implementation of this function with
"CONFIG_INFINIBAND", isn't the empty declaration produced
compilation warnings about missing implementation?

> +
>  #define DEFINE_DYNAMIC_DEBUG_METADATA(name, fmt)		\
>  	static struct _ddebug  __aligned(8)			\
>  	__attribute__((section("__verbose"))) name = {		\
> @@ -154,6 +161,10 @@ void __dynamic_netdev_dbg(struct _ddebug *descriptor,
>  	_dynamic_func_call(fmt, __dynamic_netdev_dbg,		\
>  			   dev, fmt, ##__VA_ARGS__)
>
> +#define dynamic_ibdev_dbg(dev, fmt, ...)			\
> +	_dynamic_func_call(fmt, __dynamic_ibdev_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", \
> diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h
> index 9b9e17bcc201..f796e2d44425 100644
> --- a/include/rdma/ib_verbs.h
> +++ b/include/rdma/ib_verbs.h
> @@ -72,6 +72,40 @@ extern struct workqueue_struct *ib_wq;
>  extern struct workqueue_struct *ib_comp_wq;
>  extern struct workqueue_struct *ib_comp_unbound_wq;
>
> +__printf(3, 4) __cold
> +void ibdev_printk(const char *level, const struct ib_device *ibdev,
> +		  const char *format, ...);
> +__printf(2, 3) __cold
> +void ibdev_emerg(const struct ib_device *ibdev, const char *format, ...);
> +__printf(2, 3) __cold
> +void ibdev_alert(const struct ib_device *ibdev, const char *format, ...);
> +__printf(2, 3) __cold
> +void ibdev_crit(const struct ib_device *ibdev, const char *format, ...);
> +__printf(2, 3) __cold
> +void ibdev_err(const struct ib_device *ibdev, const char *format, ...);
> +__printf(2, 3) __cold
> +void ibdev_warn(const struct ib_device *ibdev, const char *format, ...);
> +__printf(2, 3) __cold
> +void ibdev_notice(const struct ib_device *ibdev, const char *format, ...);
> +__printf(2, 3) __cold
> +void ibdev_info(const struct ib_device *ibdev, const char *format, ...);
> +
> +#if defined(CONFIG_DYNAMIC_DEBUG)
> +#define ibdev_dbg(__dev, format, args...)                       \
> +do {                                                            \
> +	dynamic_ibdev_dbg(__dev, format, ##args);               \
> +} while (0)
> +#elif defined(DEBUG)
> +#define ibdev_dbg(__dev, format, args...)                       \
> +	ibdev_printk(KERN_DEBUG, __dev, format, ##args)
> +#else
> +#define ibdev_dbg(__dev, format, args...)                       \
> +({                                                              \
> +	if (0)                                                  \

Why isn't "empty macro" enough here and we need "if (0)"?

> +		ibdev_printk(KERN_DEBUG, __dev, format, ##args); \
> +})
> +#endif
> +
>  union ib_gid {
>  	u8	raw[16];
>  	struct {
> diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c
> index 7bdf98c37e91..dfcf6cfa1c70 100644
> --- a/lib/dynamic_debug.c
> +++ b/lib/dynamic_debug.c
> @@ -37,6 +37,8 @@
>  #include <linux/device.h>
>  #include <linux/netdevice.h>
>
> +#include <rdma/ib_verbs.h>
> +
>  extern struct _ddebug __start___verbose[];
>  extern struct _ddebug __stop___verbose[];
>
> @@ -636,6 +638,44 @@ EXPORT_SYMBOL(__dynamic_netdev_dbg);
>
>  #endif
>
> +#if IS_ENABLED(CONFIG_INFINIBAND)
> +
> +void __dynamic_ibdev_dbg(struct _ddebug *descriptor,
> +			 const struct ib_device *ibdev, const char *fmt, ...)
> +{
> +	struct va_format vaf;
> +	va_list args;
> +
> +	BUG_ON(!descriptor);
> +	BUG_ON(!fmt);
> +
> +	va_start(args, fmt);
> +
> +	vaf.fmt = fmt;
> +	vaf.va = &args;
> +
> +	if (ibdev && ibdev->dev.parent) {
> +		char buf[PREFIX_SIZE];
> +
> +		dev_printk_emit(LOGLEVEL_DEBUG, ibdev->dev.parent,
> +				"%s%s %s %s: %pV",
> +				dynamic_emit_prefix(descriptor, buf),
> +				dev_driver_string(ibdev->dev.parent),
> +				dev_name(ibdev->dev.parent),
> +				dev_name(&ibdev->dev),
> +				&vaf);
> +	} else if (ibdev) {
> +		printk(KERN_DEBUG "%s: %pV", dev_name(&ibdev->dev), &vaf);
> +	} else {
> +		printk(KERN_DEBUG "(NULL ib_device): %pV", &vaf);
> +	}
> +
> +	va_end(args);
> +}
> +EXPORT_SYMBOL(__dynamic_ibdev_dbg);
> +
> +#endif
> +
>  #define DDEBUG_STRING_SIZE 1024
>  static __initdata char ddebug_setup_string[DDEBUG_STRING_SIZE];
>
> --
> 2.7.4
>

Attachment: signature.asc
Description: PGP signature


[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Photo]     [Yosemite News]     [Yosemite Photos]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux