linux/drivers/infiniband/hw/hfi1/trace_dbg.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 or BSD-3-Clause */
   2/*
   3* Copyright(c) 2015 - 2018 Intel Corporation.
   4*/
   5
   6#if !defined(__HFI1_TRACE_EXTRA_H) || defined(TRACE_HEADER_MULTI_READ)
   7#define __HFI1_TRACE_EXTRA_H
   8
   9#include <linux/tracepoint.h>
  10#include <linux/trace_seq.h>
  11
  12#include "hfi.h"
  13
  14/*
  15 * Note:
  16 * This produces a REALLY ugly trace in the console output when the string is
  17 * too long.
  18 */
  19
  20#undef TRACE_SYSTEM
  21#define TRACE_SYSTEM hfi1_dbg
  22
  23#define MAX_MSG_LEN 512
  24
  25DECLARE_EVENT_CLASS(hfi1_trace_template,
  26                    TP_PROTO(const char *function, struct va_format *vaf),
  27                    TP_ARGS(function, vaf),
  28                    TP_STRUCT__entry(__string(function, function)
  29                                     __dynamic_array(char, msg, MAX_MSG_LEN)
  30                                     ),
  31                    TP_fast_assign(__assign_str(function, function);
  32                                   WARN_ON_ONCE(vsnprintf
  33                                                (__get_dynamic_array(msg),
  34                                                 MAX_MSG_LEN, vaf->fmt,
  35                                                 *vaf->va) >=
  36                                                MAX_MSG_LEN);
  37                                   ),
  38                    TP_printk("(%s) %s",
  39                              __get_str(function),
  40                              __get_str(msg))
  41);
  42
  43/*
  44 * It may be nice to macroize the __hfi1_trace but the va_* stuff requires an
  45 * actual function to work and can not be in a macro.
  46 */
  47#define __hfi1_trace_def(lvl) \
  48void __printf(2, 3) __hfi1_trace_##lvl(const char *funct, char *fmt, ...); \
  49                                                                        \
  50DEFINE_EVENT(hfi1_trace_template, hfi1_ ##lvl,                          \
  51        TP_PROTO(const char *function, struct va_format *vaf),          \
  52        TP_ARGS(function, vaf))
  53
  54#define __hfi1_trace_fn(lvl) \
  55void __printf(2, 3) __hfi1_trace_##lvl(const char *func, char *fmt, ...)\
  56{                                                                       \
  57        struct va_format vaf = {                                        \
  58                .fmt = fmt,                                             \
  59        };                                                              \
  60        va_list args;                                                   \
  61                                                                        \
  62        va_start(args, fmt);                                            \
  63        vaf.va = &args;                                                 \
  64        trace_hfi1_ ##lvl(func, &vaf);                                  \
  65        va_end(args);                                                   \
  66        return;                                                         \
  67}
  68
  69/*
  70 * To create a new trace level simply define it below and as a __hfi1_trace_fn
  71 * in trace.c. This will create all the hooks for calling
  72 * hfi1_cdbg(LVL, fmt, ...); as well as take care of all
  73 * the debugfs stuff.
  74 */
  75__hfi1_trace_def(AFFINITY);
  76__hfi1_trace_def(PKT);
  77__hfi1_trace_def(PROC);
  78__hfi1_trace_def(SDMA);
  79__hfi1_trace_def(LINKVERB);
  80__hfi1_trace_def(DEBUG);
  81__hfi1_trace_def(SNOOP);
  82__hfi1_trace_def(CNTR);
  83__hfi1_trace_def(PIO);
  84__hfi1_trace_def(DC8051);
  85__hfi1_trace_def(FIRMWARE);
  86__hfi1_trace_def(RCVCTRL);
  87__hfi1_trace_def(TID);
  88__hfi1_trace_def(MMU);
  89__hfi1_trace_def(IOCTL);
  90
  91#define hfi1_cdbg(which, fmt, ...) \
  92        __hfi1_trace_##which(__func__, fmt, ##__VA_ARGS__)
  93
  94#define hfi1_dbg(fmt, ...) \
  95        hfi1_cdbg(DEBUG, fmt, ##__VA_ARGS__)
  96
  97/*
  98 * Define HFI1_EARLY_DBG at compile time or here to enable early trace
  99 * messages. Do not check in an enablement for this.
 100 */
 101
 102#ifdef HFI1_EARLY_DBG
 103#define hfi1_dbg_early(fmt, ...) \
 104        trace_printk(fmt, ##__VA_ARGS__)
 105#else
 106#define hfi1_dbg_early(fmt, ...)
 107#endif
 108
 109#endif /* __HFI1_TRACE_EXTRA_H */
 110
 111#undef TRACE_INCLUDE_PATH
 112#undef TRACE_INCLUDE_FILE
 113#define TRACE_INCLUDE_PATH .
 114#define TRACE_INCLUDE_FILE trace_dbg
 115#include <trace/define_trace.h>
 116