trace_dbg.h (2962B)
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>