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