xref: /freebsd/sys/ofed/drivers/infiniband/ulp/sdp/sdp_dbg.h (revision aa0a1e58f0189b0fde359a8bda032887e72057fa)
1*aa0a1e58SJeff Roberson #ifndef _SDP_DBG_H_
2*aa0a1e58SJeff Roberson #define _SDP_DBG_H_
3*aa0a1e58SJeff Roberson 
4*aa0a1e58SJeff Roberson #define SDPSTATS_ON
5*aa0a1e58SJeff Roberson 
6*aa0a1e58SJeff Roberson //#define GETNSTIMEODAY_SUPPORTED
7*aa0a1e58SJeff Roberson 
8*aa0a1e58SJeff Roberson #define _sdp_printk(func, line, level, sk, format, arg...)	\
9*aa0a1e58SJeff Roberson do {								\
10*aa0a1e58SJeff Roberson 	printk(level "%s:%d %p sdp_sock(%d:%d %d:%d): " format "\n",	\
11*aa0a1e58SJeff Roberson 	       func, line, sk ? sdp_sk(sk) : NULL,		\
12*aa0a1e58SJeff Roberson 	       curproc->p_pid, PCPU_GET(cpuid),			\
13*aa0a1e58SJeff Roberson 	       (sk) && sdp_sk(sk) ? ntohs(sdp_sk(sk)->lport) : -1,	\
14*aa0a1e58SJeff Roberson 	       (sk) && sdp_sk(sk) ? ntohs(sdp_sk(sk)->fport) : -1, ## arg);	\
15*aa0a1e58SJeff Roberson } while (0)
16*aa0a1e58SJeff Roberson #define sdp_printk(level, sk, format, arg...)                \
17*aa0a1e58SJeff Roberson 	_sdp_printk(__func__, __LINE__, level, sk, format, ## arg)
18*aa0a1e58SJeff Roberson #define sdp_warn(sk, format, arg...)                         \
19*aa0a1e58SJeff Roberson 	sdp_printk(KERN_WARNING, sk, format , ## arg)
20*aa0a1e58SJeff Roberson 
21*aa0a1e58SJeff Roberson #define SDP_MODPARAM_SINT(var, def_val, msg) \
22*aa0a1e58SJeff Roberson 	static int var = def_val; \
23*aa0a1e58SJeff Roberson 	module_param_named(var, var, int, 0644); \
24*aa0a1e58SJeff Roberson 	MODULE_PARM_DESC(var, msg " [" #def_val "]"); \
25*aa0a1e58SJeff Roberson 
26*aa0a1e58SJeff Roberson #define SDP_MODPARAM_INT(var, def_val, msg) \
27*aa0a1e58SJeff Roberson 	int var = def_val; \
28*aa0a1e58SJeff Roberson 	module_param_named(var, var, int, 0644); \
29*aa0a1e58SJeff Roberson 	MODULE_PARM_DESC(var, msg " [" #def_val "]"); \
30*aa0a1e58SJeff Roberson 
31*aa0a1e58SJeff Roberson #ifdef SDP_PROFILING
32*aa0a1e58SJeff Roberson struct mbuf;
33*aa0a1e58SJeff Roberson struct sdpprf_log {
34*aa0a1e58SJeff Roberson 	int 		idx;
35*aa0a1e58SJeff Roberson 	int 		pid;
36*aa0a1e58SJeff Roberson 	int 		cpu;
37*aa0a1e58SJeff Roberson 	int 		sk_num;
38*aa0a1e58SJeff Roberson 	int 		sk_dport;
39*aa0a1e58SJeff Roberson 	struct mbuf 	*mb;
40*aa0a1e58SJeff Roberson 	char		msg[256];
41*aa0a1e58SJeff Roberson 
42*aa0a1e58SJeff Roberson 	unsigned long long time;
43*aa0a1e58SJeff Roberson 
44*aa0a1e58SJeff Roberson 	const char 	*func;
45*aa0a1e58SJeff Roberson 	int 		line;
46*aa0a1e58SJeff Roberson };
47*aa0a1e58SJeff Roberson 
48*aa0a1e58SJeff Roberson #define SDPPRF_LOG_SIZE 0x20000 /* must be a power of 2 */
49*aa0a1e58SJeff Roberson 
50*aa0a1e58SJeff Roberson extern struct sdpprf_log sdpprf_log[SDPPRF_LOG_SIZE];
51*aa0a1e58SJeff Roberson extern int sdpprf_log_count;
52*aa0a1e58SJeff Roberson 
53*aa0a1e58SJeff Roberson #ifdef GETNSTIMEODAY_SUPPORTED
current_nsec(void)54*aa0a1e58SJeff Roberson static inline unsigned long long current_nsec(void)
55*aa0a1e58SJeff Roberson {
56*aa0a1e58SJeff Roberson 	struct timespec tv;
57*aa0a1e58SJeff Roberson 	getnstimeofday(&tv);
58*aa0a1e58SJeff Roberson 	return tv.tv_sec * NSEC_PER_SEC + tv.tv_nsec;
59*aa0a1e58SJeff Roberson }
60*aa0a1e58SJeff Roberson #else
61*aa0a1e58SJeff Roberson #define current_nsec() jiffies_to_usecs(jiffies)
62*aa0a1e58SJeff Roberson #endif
63*aa0a1e58SJeff Roberson 
64*aa0a1e58SJeff Roberson #define sdp_prf1(sk, s, format, arg...) ({ \
65*aa0a1e58SJeff Roberson 	struct sdpprf_log *l = \
66*aa0a1e58SJeff Roberson 		&sdpprf_log[sdpprf_log_count++ & (SDPPRF_LOG_SIZE - 1)]; \
67*aa0a1e58SJeff Roberson 	preempt_disable(); \
68*aa0a1e58SJeff Roberson 	l->idx = sdpprf_log_count - 1; \
69*aa0a1e58SJeff Roberson 	l->pid = current->pid; \
70*aa0a1e58SJeff Roberson 	l->sk_num = (sk) ? inet_sk(sk)->num : -1;                 \
71*aa0a1e58SJeff Roberson 	l->sk_dport = (sk) ? ntohs(inet_sk(sk)->dport) : -1; \
72*aa0a1e58SJeff Roberson 	l->cpu = smp_processor_id(); \
73*aa0a1e58SJeff Roberson 	l->mb = s; \
74*aa0a1e58SJeff Roberson 	snprintf(l->msg, sizeof(l->msg) - 1, format, ## arg); \
75*aa0a1e58SJeff Roberson 	l->time = current_nsec(); \
76*aa0a1e58SJeff Roberson 	l->func = __func__; \
77*aa0a1e58SJeff Roberson 	l->line = __LINE__; \
78*aa0a1e58SJeff Roberson 	preempt_enable(); \
79*aa0a1e58SJeff Roberson 	1; \
80*aa0a1e58SJeff Roberson })
81*aa0a1e58SJeff Roberson //#define sdp_prf(sk, s, format, arg...)
82*aa0a1e58SJeff Roberson #define sdp_prf(sk, s, format, arg...) sdp_prf1(sk, s, format, ## arg)
83*aa0a1e58SJeff Roberson 
84*aa0a1e58SJeff Roberson #else
85*aa0a1e58SJeff Roberson #define sdp_prf1(sk, s, format, arg...)
86*aa0a1e58SJeff Roberson #define sdp_prf(sk, s, format, arg...)
87*aa0a1e58SJeff Roberson #endif
88*aa0a1e58SJeff Roberson 
89*aa0a1e58SJeff Roberson #ifdef CONFIG_INFINIBAND_SDP_DEBUG
90*aa0a1e58SJeff Roberson extern int sdp_debug_level;
91*aa0a1e58SJeff Roberson 
92*aa0a1e58SJeff Roberson #define sdp_dbg(sk, format, arg...)                          \
93*aa0a1e58SJeff Roberson 	do {                                                 \
94*aa0a1e58SJeff Roberson 		if (sdp_debug_level > 0)                     \
95*aa0a1e58SJeff Roberson 		sdp_printk(KERN_WARNING, sk, format , ## arg); \
96*aa0a1e58SJeff Roberson 	} while (0)
97*aa0a1e58SJeff Roberson 
98*aa0a1e58SJeff Roberson #else /* CONFIG_INFINIBAND_SDP_DEBUG */
99*aa0a1e58SJeff Roberson #define sdp_dbg(priv, format, arg...)                        \
100*aa0a1e58SJeff Roberson 	do { (void) (priv); } while (0)
101*aa0a1e58SJeff Roberson #define sock_ref(sk, msg, sock_op) sock_op(sk)
102*aa0a1e58SJeff Roberson #endif /* CONFIG_INFINIBAND_SDP_DEBUG */
103*aa0a1e58SJeff Roberson 
104*aa0a1e58SJeff Roberson #ifdef CONFIG_INFINIBAND_SDP_DEBUG_DATA
105*aa0a1e58SJeff Roberson 
106*aa0a1e58SJeff Roberson extern int sdp_data_debug_level;
107*aa0a1e58SJeff Roberson #define sdp_dbg_data(sk, format, arg...)                     		\
108*aa0a1e58SJeff Roberson 	do {                                                 		\
109*aa0a1e58SJeff Roberson 		if (sdp_data_debug_level & 0x2)                		\
110*aa0a1e58SJeff Roberson 			sdp_printk(KERN_WARNING, sk, format , ## arg); 	\
111*aa0a1e58SJeff Roberson 	} while (0)
112*aa0a1e58SJeff Roberson #define SDP_DUMP_PACKET(sk, str, mb, h)                     		\
113*aa0a1e58SJeff Roberson 	do {                                                 		\
114*aa0a1e58SJeff Roberson 		if (sdp_data_debug_level & 0x1)                		\
115*aa0a1e58SJeff Roberson 			dump_packet(sk, str, mb, h); 			\
116*aa0a1e58SJeff Roberson 	} while (0)
117*aa0a1e58SJeff Roberson #else
118*aa0a1e58SJeff Roberson #define sdp_dbg_data(priv, format, arg...)
119*aa0a1e58SJeff Roberson #define SDP_DUMP_PACKET(sk, str, mb, h)
120*aa0a1e58SJeff Roberson #endif
121*aa0a1e58SJeff Roberson 
122*aa0a1e58SJeff Roberson #define SOCK_REF_RESET "RESET"
123*aa0a1e58SJeff Roberson #define SOCK_REF_ALIVE "ALIVE" /* sock_alloc -> destruct_sock */
124*aa0a1e58SJeff Roberson #define SOCK_REF_CLONE "CLONE"
125*aa0a1e58SJeff Roberson #define SOCK_REF_CMA "CMA" /* sdp_cma_handler() is expected to be invoked */
126*aa0a1e58SJeff Roberson #define SOCK_REF_SEQ "SEQ" /* during proc read */
127*aa0a1e58SJeff Roberson #define SOCK_REF_DREQ_TO "DREQ_TO" /* dreq timeout is pending */
128*aa0a1e58SJeff Roberson #define SOCK_REF_ZCOPY "ZCOPY" /* zcopy send in process */
129*aa0a1e58SJeff Roberson #define SOCK_REF_RDMA_RD "RDMA_RD" /* RDMA read in process */
130*aa0a1e58SJeff Roberson 
131*aa0a1e58SJeff Roberson #define sock_hold(sk, msg)  sock_ref(sk, msg, sock_hold)
132*aa0a1e58SJeff Roberson #define sock_put(sk, msg)  sock_ref(sk, msg, sock_put)
133*aa0a1e58SJeff Roberson #define __sock_put(sk, msg)  sock_ref(sk, msg, __sock_put)
134*aa0a1e58SJeff Roberson 
135*aa0a1e58SJeff Roberson #define ENUM2STR(e) [e] = #e
136*aa0a1e58SJeff Roberson 
sdp_state_str(int state)137*aa0a1e58SJeff Roberson static inline char *sdp_state_str(int state)
138*aa0a1e58SJeff Roberson {
139*aa0a1e58SJeff Roberson 	static char *state2str[] = {
140*aa0a1e58SJeff Roberson 		ENUM2STR(TCPS_ESTABLISHED),
141*aa0a1e58SJeff Roberson 		ENUM2STR(TCPS_SYN_SENT),
142*aa0a1e58SJeff Roberson 		ENUM2STR(TCPS_SYN_RECEIVED),
143*aa0a1e58SJeff Roberson 		ENUM2STR(TCPS_FIN_WAIT_1),
144*aa0a1e58SJeff Roberson 		ENUM2STR(TCPS_FIN_WAIT_2),
145*aa0a1e58SJeff Roberson 		ENUM2STR(TCPS_TIME_WAIT),
146*aa0a1e58SJeff Roberson 		ENUM2STR(TCPS_CLOSED),
147*aa0a1e58SJeff Roberson 		ENUM2STR(TCPS_CLOSE_WAIT),
148*aa0a1e58SJeff Roberson 		ENUM2STR(TCPS_LAST_ACK),
149*aa0a1e58SJeff Roberson 		ENUM2STR(TCPS_LISTEN),
150*aa0a1e58SJeff Roberson 		ENUM2STR(TCPS_CLOSING),
151*aa0a1e58SJeff Roberson 	};
152*aa0a1e58SJeff Roberson 
153*aa0a1e58SJeff Roberson 	if (state < 0 || state >= ARRAY_SIZE(state2str))
154*aa0a1e58SJeff Roberson 		return "unknown";
155*aa0a1e58SJeff Roberson 
156*aa0a1e58SJeff Roberson 	return state2str[state];
157*aa0a1e58SJeff Roberson }
158*aa0a1e58SJeff Roberson 
159*aa0a1e58SJeff Roberson struct sdp_bsdh;
160*aa0a1e58SJeff Roberson #ifdef CONFIG_INFINIBAND_SDP_DEBUG_DATA
161*aa0a1e58SJeff Roberson void _dump_packet(const char *func, int line, struct socket *sk, char *str,
162*aa0a1e58SJeff Roberson 		struct mbuf *mb, const struct sdp_bsdh *h);
163*aa0a1e58SJeff Roberson #define dump_packet(sk, str, mb, h) \
164*aa0a1e58SJeff Roberson 	_dump_packet(__func__, __LINE__, sk, str, mb, h)
165*aa0a1e58SJeff Roberson #endif
166*aa0a1e58SJeff Roberson 
167*aa0a1e58SJeff Roberson #endif
168