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