1219820Sjeff#ifndef _SDP_DBG_H_
2219820Sjeff#define _SDP_DBG_H_
3219820Sjeff
4219820Sjeff#define SDPSTATS_ON
5219820Sjeff
6219820Sjeff//#define GETNSTIMEODAY_SUPPORTED
7219820Sjeff
8219820Sjeff#define _sdp_printk(func, line, level, sk, format, arg...)	\
9219820Sjeffdo {								\
10219820Sjeff	printk(level "%s:%d %p sdp_sock(%d:%d %d:%d): " format "\n",	\
11219820Sjeff	       func, line, sk ? sdp_sk(sk) : NULL,		\
12219820Sjeff	       curproc->p_pid, PCPU_GET(cpuid),			\
13219820Sjeff	       (sk) && sdp_sk(sk) ? ntohs(sdp_sk(sk)->lport) : -1,	\
14219820Sjeff	       (sk) && sdp_sk(sk) ? ntohs(sdp_sk(sk)->fport) : -1, ## arg);	\
15219820Sjeff} while (0)
16219820Sjeff#define sdp_printk(level, sk, format, arg...)                \
17219820Sjeff	_sdp_printk(__func__, __LINE__, level, sk, format, ## arg)
18219820Sjeff#define sdp_warn(sk, format, arg...)                         \
19219820Sjeff	sdp_printk(KERN_WARNING, sk, format , ## arg)
20219820Sjeff
21219820Sjeff#define SDP_MODPARAM_SINT(var, def_val, msg) \
22219820Sjeff	static int var = def_val; \
23219820Sjeff	module_param_named(var, var, int, 0644); \
24219820Sjeff	MODULE_PARM_DESC(var, msg " [" #def_val "]"); \
25219820Sjeff
26219820Sjeff#define SDP_MODPARAM_INT(var, def_val, msg) \
27219820Sjeff	int var = def_val; \
28219820Sjeff	module_param_named(var, var, int, 0644); \
29219820Sjeff	MODULE_PARM_DESC(var, msg " [" #def_val "]"); \
30219820Sjeff
31219820Sjeff#ifdef SDP_PROFILING
32219820Sjeffstruct mbuf;
33219820Sjeffstruct sdpprf_log {
34219820Sjeff	int 		idx;
35219820Sjeff	int 		pid;
36219820Sjeff	int 		cpu;
37219820Sjeff	int 		sk_num;
38219820Sjeff	int 		sk_dport;
39219820Sjeff	struct mbuf 	*mb;
40219820Sjeff	char		msg[256];
41219820Sjeff
42219820Sjeff	unsigned long long time;
43219820Sjeff
44219820Sjeff	const char 	*func;
45219820Sjeff	int 		line;
46219820Sjeff};
47219820Sjeff
48219820Sjeff#define SDPPRF_LOG_SIZE 0x20000 /* must be a power of 2 */
49219820Sjeff
50219820Sjeffextern struct sdpprf_log sdpprf_log[SDPPRF_LOG_SIZE];
51219820Sjeffextern int sdpprf_log_count;
52219820Sjeff
53219820Sjeff#ifdef GETNSTIMEODAY_SUPPORTED
54219820Sjeffstatic inline unsigned long long current_nsec(void)
55219820Sjeff{
56219820Sjeff	struct timespec tv;
57219820Sjeff	getnstimeofday(&tv);
58219820Sjeff	return tv.tv_sec * NSEC_PER_SEC + tv.tv_nsec;
59219820Sjeff}
60219820Sjeff#else
61219820Sjeff#define current_nsec() jiffies_to_usecs(jiffies)
62219820Sjeff#endif
63219820Sjeff
64219820Sjeff#define sdp_prf1(sk, s, format, arg...) ({ \
65219820Sjeff	struct sdpprf_log *l = \
66219820Sjeff		&sdpprf_log[sdpprf_log_count++ & (SDPPRF_LOG_SIZE - 1)]; \
67219820Sjeff	preempt_disable(); \
68219820Sjeff	l->idx = sdpprf_log_count - 1; \
69219820Sjeff	l->pid = current->pid; \
70219820Sjeff	l->sk_num = (sk) ? inet_sk(sk)->num : -1;                 \
71219820Sjeff	l->sk_dport = (sk) ? ntohs(inet_sk(sk)->dport) : -1; \
72219820Sjeff	l->cpu = smp_processor_id(); \
73219820Sjeff	l->mb = s; \
74219820Sjeff	snprintf(l->msg, sizeof(l->msg) - 1, format, ## arg); \
75219820Sjeff	l->time = current_nsec(); \
76219820Sjeff	l->func = __func__; \
77219820Sjeff	l->line = __LINE__; \
78219820Sjeff	preempt_enable(); \
79219820Sjeff	1; \
80219820Sjeff})
81219820Sjeff//#define sdp_prf(sk, s, format, arg...)
82219820Sjeff#define sdp_prf(sk, s, format, arg...) sdp_prf1(sk, s, format, ## arg)
83219820Sjeff
84219820Sjeff#else
85219820Sjeff#define sdp_prf1(sk, s, format, arg...)
86219820Sjeff#define sdp_prf(sk, s, format, arg...)
87219820Sjeff#endif
88219820Sjeff
89219820Sjeff#ifdef CONFIG_INFINIBAND_SDP_DEBUG
90219820Sjeffextern int sdp_debug_level;
91219820Sjeff
92219820Sjeff#define sdp_dbg(sk, format, arg...)                          \
93219820Sjeff	do {                                                 \
94219820Sjeff		if (sdp_debug_level > 0)                     \
95219820Sjeff		sdp_printk(KERN_WARNING, sk, format , ## arg); \
96219820Sjeff	} while (0)
97219820Sjeff
98219820Sjeff#else /* CONFIG_INFINIBAND_SDP_DEBUG */
99219820Sjeff#define sdp_dbg(priv, format, arg...)                        \
100219820Sjeff	do { (void) (priv); } while (0)
101219820Sjeff#define sock_ref(sk, msg, sock_op) sock_op(sk)
102219820Sjeff#endif /* CONFIG_INFINIBAND_SDP_DEBUG */
103219820Sjeff
104219820Sjeff#ifdef CONFIG_INFINIBAND_SDP_DEBUG_DATA
105219820Sjeff
106219820Sjeffextern int sdp_data_debug_level;
107219820Sjeff#define sdp_dbg_data(sk, format, arg...)                     		\
108219820Sjeff	do {                                                 		\
109219820Sjeff		if (sdp_data_debug_level & 0x2)                		\
110219820Sjeff			sdp_printk(KERN_WARNING, sk, format , ## arg); 	\
111219820Sjeff	} while (0)
112219820Sjeff#define SDP_DUMP_PACKET(sk, str, mb, h)                     		\
113219820Sjeff	do {                                                 		\
114219820Sjeff		if (sdp_data_debug_level & 0x1)                		\
115219820Sjeff			dump_packet(sk, str, mb, h); 			\
116219820Sjeff	} while (0)
117219820Sjeff#else
118219820Sjeff#define sdp_dbg_data(priv, format, arg...)
119219820Sjeff#define SDP_DUMP_PACKET(sk, str, mb, h)
120219820Sjeff#endif
121219820Sjeff
122219820Sjeff#define SOCK_REF_RESET "RESET"
123219820Sjeff#define SOCK_REF_ALIVE "ALIVE" /* sock_alloc -> destruct_sock */
124219820Sjeff#define SOCK_REF_CLONE "CLONE"
125219820Sjeff#define SOCK_REF_CMA "CMA" /* sdp_cma_handler() is expected to be invoked */
126219820Sjeff#define SOCK_REF_SEQ "SEQ" /* during proc read */
127219820Sjeff#define SOCK_REF_DREQ_TO "DREQ_TO" /* dreq timeout is pending */
128219820Sjeff#define SOCK_REF_ZCOPY "ZCOPY" /* zcopy send in process */
129219820Sjeff#define SOCK_REF_RDMA_RD "RDMA_RD" /* RDMA read in process */
130219820Sjeff
131219820Sjeff#define sock_hold(sk, msg)  sock_ref(sk, msg, sock_hold)
132219820Sjeff#define sock_put(sk, msg)  sock_ref(sk, msg, sock_put)
133219820Sjeff#define __sock_put(sk, msg)  sock_ref(sk, msg, __sock_put)
134219820Sjeff
135219820Sjeff#define ENUM2STR(e) [e] = #e
136219820Sjeff
137219820Sjeffstatic inline char *sdp_state_str(int state)
138219820Sjeff{
139219820Sjeff	static char *state2str[] = {
140219820Sjeff		ENUM2STR(TCPS_ESTABLISHED),
141219820Sjeff		ENUM2STR(TCPS_SYN_SENT),
142219820Sjeff		ENUM2STR(TCPS_SYN_RECEIVED),
143219820Sjeff		ENUM2STR(TCPS_FIN_WAIT_1),
144219820Sjeff		ENUM2STR(TCPS_FIN_WAIT_2),
145219820Sjeff		ENUM2STR(TCPS_TIME_WAIT),
146219820Sjeff		ENUM2STR(TCPS_CLOSED),
147219820Sjeff		ENUM2STR(TCPS_CLOSE_WAIT),
148219820Sjeff		ENUM2STR(TCPS_LAST_ACK),
149219820Sjeff		ENUM2STR(TCPS_LISTEN),
150219820Sjeff		ENUM2STR(TCPS_CLOSING),
151219820Sjeff	};
152219820Sjeff
153219820Sjeff	if (state < 0 || state >= ARRAY_SIZE(state2str))
154219820Sjeff		return "unknown";
155219820Sjeff
156219820Sjeff	return state2str[state];
157219820Sjeff}
158219820Sjeff
159219820Sjeffstruct sdp_bsdh;
160219820Sjeff#ifdef CONFIG_INFINIBAND_SDP_DEBUG_DATA
161219820Sjeffvoid _dump_packet(const char *func, int line, struct socket *sk, char *str,
162219820Sjeff		struct mbuf *mb, const struct sdp_bsdh *h);
163219820Sjeff#define dump_packet(sk, str, mb, h) \
164219820Sjeff	_dump_packet(__func__, __LINE__, sk, str, mb, h)
165219820Sjeff#endif
166219820Sjeff
167219820Sjeff#endif
168