From: Amir Vadai Date: Mon, 17 Aug 2009 10:37:18 +0000 (+0300) Subject: sdp: code cleanup X-Git-Tag: v4.1.12-92~264^2~5^2~252 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=967cd1b3001d31fb37e0dd151e31c9b86692b88e;p=users%2Fjedix%2Flinux-maple.git sdp: code cleanup Signed-off-by: Amir Vadai --- diff --git a/drivers/infiniband/ulp/sdp/sdp.h b/drivers/infiniband/ulp/sdp/sdp.h index 21577b4e73ec..595fb7c42272 100644 --- a/drivers/infiniband/ulp/sdp/sdp.h +++ b/drivers/infiniband/ulp/sdp/sdp.h @@ -7,227 +7,8 @@ #include /* For urgent data flags */ #include #include - -#define SDPSTATS_ON -#define SDP_PROFILING - -#define _sdp_printk(func, line, level, sk, format, arg...) do { \ - preempt_disable(); \ - printk(level "%s:%d sdp_sock(%5d:%d %d:%d): " format, \ - func, line, \ - current->pid, smp_processor_id(), \ - (sk) ? inet_sk(sk)->num : -1, \ - (sk) ? ntohs(inet_sk(sk)->dport) : -1, ## arg); \ - preempt_enable(); \ -} while (0) -#define sdp_printk(level, sk, format, arg...) \ - _sdp_printk(__func__, __LINE__, level, sk, format, ## arg) -#define sdp_warn(sk, format, arg...) \ - sdp_printk(KERN_WARNING, sk, format , ## arg) - -#define SDP_MODPARAM_SINT(var, def_val, msg) \ - static int var = def_val; \ - module_param_named(var, var, int, 0644); \ - MODULE_PARM_DESC(var, msg " [" #def_val "]"); \ - -#define SDP_MODPARAM_INT(var, def_val, msg) \ - int var = def_val; \ - module_param_named(var, var, int, 0644); \ - MODULE_PARM_DESC(var, msg " [" #def_val "]"); \ - -#ifdef SDP_PROFILING -struct sk_buff; -struct sdpprf_log { - int idx; - int pid; - int cpu; - int sk_num; - int sk_dport; - struct sk_buff *skb; - char msg[256]; - - unsigned long long time; - - const char *func; - int line; -}; - -#define SDPPRF_LOG_SIZE 0x20000 /* must be a power of 2 */ - -extern struct sdpprf_log sdpprf_log[SDPPRF_LOG_SIZE]; -extern int sdpprf_log_count; - -#define sdp_prf1(sk, s, format, arg...) ({ \ - struct sdpprf_log *l = \ - &sdpprf_log[sdpprf_log_count++ & (SDPPRF_LOG_SIZE - 1)]; \ - preempt_disable(); \ - l->idx = sdpprf_log_count - 1; \ - l->pid = current->pid; \ - l->sk_num = (sk) ? inet_sk(sk)->num : -1; \ - l->sk_dport = (sk) ? ntohs(inet_sk(sk)->dport) : -1; \ - l->cpu = smp_processor_id(); \ - l->skb = s; \ - snprintf(l->msg, sizeof(l->msg) - 1, format, ## arg); \ - l->time = jiffies_to_usecs(jiffies); \ - l->func = __func__; \ - l->line = __LINE__; \ - preempt_enable(); \ - 1; \ -}) -//#define sdp_prf(sk, s, format, arg...) -#define sdp_prf(sk, s, format, arg...) sdp_prf1(sk, s, format, ## arg) - -#else -#define sdp_prf1(sk, s, format, arg...) -#define sdp_prf(sk, s, format, arg...) -#endif - -#ifdef CONFIG_INFINIBAND_SDP_DEBUG -extern int sdp_debug_level; - -#define sdp_dbg(sk, format, arg...) \ - do { \ - if (sdp_debug_level > 0) \ - sdp_printk(KERN_WARNING, sk, format , ## arg); \ - } while (0) - -#define sock_ref(sk, msg, sock_op) ({ \ - if (!atomic_read(&(sk)->sk_refcnt)) {\ - sdp_warn(sk, "%s:%d - %s (%s) ref = 0.\n", \ - __func__, __LINE__, #sock_op, msg); \ - WARN_ON(1); \ - } else { \ - sdp_dbg(sk, "%s:%d - %s (%s) ref = %d.\n", __func__, __LINE__, \ - #sock_op, msg, atomic_read(&(sk)->sk_refcnt)); \ - sock_op(sk); \ - }\ -}) - -#define sk_common_release(sk) do { \ - sdp_dbg(sk, "%s:%d - sock_put(" SOCK_REF_BORN \ - ") - refcount = %d from withing sk_common_release\n",\ - __func__, __LINE__, atomic_read(&(sk)->sk_refcnt));\ - sk_common_release(sk); \ -} while (0) - -#else /* CONFIG_INFINIBAND_SDP_DEBUG */ -#define sdp_dbg(priv, format, arg...) \ - do { (void) (priv); } while (0) -#define sock_ref(sk, msg, sock_op) sock_op(sk) -#endif /* CONFIG_INFINIBAND_SDP_DEBUG */ - -#ifdef CONFIG_INFINIBAND_SDP_DEBUG_DATA - -extern int sdp_data_debug_level; -#define sdp_dbg_data(sk, format, arg...) \ - do { \ - if (sdp_data_debug_level & 0x2) \ - sdp_printk(KERN_WARNING, sk, format , ## arg); \ - } while (0) -#define SDP_DUMP_PACKET(sk, str, skb, h) \ - do { \ - if (sdp_data_debug_level & 0x1) \ - dump_packet(sk, str, skb, h); \ - } while (0) -#else -#define sdp_dbg_data(priv, format, arg...) -#define SDP_DUMP_PACKET(sk, str, skb, h) -#endif - -#if 0 -#define lock_sock(sk) do { \ - sdp_dbg_data(sk, "lock_sock: before lock\n"); \ - lock_sock(sk); \ - sdp_dbg_data(sk, "lock_sock: locked\n"); \ -} while (0) - -#define release_sock(sk) do { \ - sdp_dbg_data(sk, "release_sock\n"); \ - release_sock(sk); \ -} while (0) - - -#undef sk_wait_event - -#define sk_wait_event(__sk, __timeo, __condition) \ -({ int rc; \ - release_sock(__sk); \ - rc = __condition; \ - if (!rc) { \ - *(__timeo) = schedule_timeout(*(__timeo)); \ - } \ - lock_sock(__sk); \ - rc = __condition; \ - rc; \ -}) - -#endif - -#ifdef SDPSTATS_ON - -struct sdpstats { - u32 post_send[256]; - u32 sendmsg_bcopy_segment; - u32 sendmsg_bzcopy_segment; - u32 sendmsg_zcopy_segment; - u32 sendmsg; - u32 post_send_credits; - u32 sendmsg_nagle_skip; - u32 sendmsg_seglen[25]; - u32 send_size[25]; - u32 post_recv; - u32 rx_int_count; - u32 tx_int_count; - u32 bzcopy_poll_miss; - u32 send_wait_for_mem; - u32 send_miss_no_credits; - u32 rx_poll_miss; - u32 tx_poll_miss; - u32 tx_poll_hit; - u32 tx_poll_busy; - u32 memcpy_count; - u32 credits_before_update[64]; - u32 send_interval[25]; -}; -extern struct sdpstats sdpstats; - -static inline void sdpstats_hist(u32 *h, u32 val, u32 maxidx, int is_log) -{ - int idx = is_log ? ilog2(val) : val; - if (idx > maxidx) - idx = maxidx; - - h[idx]++; -} - -#define SDPSTATS_COUNTER_INC(stat) do { sdpstats.stat++; } while (0) -#define SDPSTATS_COUNTER_ADD(stat, val) do { sdpstats.stat += val; } while (0) -#define SDPSTATS_COUNTER_MID_INC(stat, mid) do { sdpstats.stat[mid]++; } \ - while (0) -#define SDPSTATS_HIST(stat, size) \ - sdpstats_hist(sdpstats.stat, size, ARRAY_SIZE(sdpstats.stat) - 1, 1) - -#define SDPSTATS_HIST_LINEAR(stat, size) \ - sdpstats_hist(sdpstats.stat, size, ARRAY_SIZE(sdpstats.stat) - 1, 0) - -#else -#define SDPSTATS_COUNTER_INC(stat) -#define SDPSTATS_COUNTER_ADD(stat, val) -#define SDPSTATS_COUNTER_MID_INC(stat, mid) -#define SDPSTATS_HIST_LINEAR(stat, size) -#define SDPSTATS_HIST(stat, size) -#endif - -#define SOCK_REF_RESET "RESET" -#define SOCK_REF_BORN "BORN" /* sock_alloc -> destruct_sock */ -#define SOCK_REF_CLONE "CLONE" -#define SOCK_REF_CM_TW "CM_TW" /* TIMEWAIT_ENTER -> TIMEWAIT_EXIT */ -#define SOCK_REF_SEQ "SEQ" /* during proc read */ -#define SOCK_REF_DREQ_TO "DREQ_TO" /* dreq timeout is pending */ - -#define sock_hold(sk, msg) sock_ref(sk, msg, sock_hold) -#define sock_put(sk, msg) sock_ref(sk, msg, sock_put) -#define __sock_put(sk, msg) sock_ref(sk, msg, __sock_put) +#include +#include "sdp_dbg.h" /* Interval between sucessive polls in the Tx routine when polling is used instead of interrupts (in per-core Tx rings) - should be power of 2 */ @@ -277,9 +58,6 @@ static inline void sdpstats_hist(u32 *h, u32 val, u32 maxidx, int is_log) #define SDP_AUTO_CONF 0xffff #define AUTO_MOD_DELAY (HZ / 4) -struct bzcopy_state; -struct rx_srcavail_state; - struct sdp_skb_cb { __u32 seq; /* Starting sequence number */ __u32 end_seq; /* SEQ + FIN + SYN + datalen */ @@ -292,17 +70,37 @@ struct sdp_skb_cb { #define BZCOPY_STATE(skb) (((struct sdp_skb_cb *)(skb->cb))->bz) #define RX_SRCAVAIL_STATE(skb) (((struct sdp_skb_cb *)(skb->cb))->rx_sa) #define TX_SRCAVAIL_STATE(skb) (((struct sdp_skb_cb *)(skb->cb))->tx_sa) - #define SDP_SKB_CB(__skb) ((struct sdp_skb_cb *)&((__skb)->cb[0])) -#undef TCP_SKB_CB #ifndef MIN #define MIN(a, b) (a < b ? a : b) #endif +#define ring_head(ring) (atomic_read(&(ring).head)) +#define ring_tail(ring) (atomic_read(&(ring).tail)) +#define ring_posted(ring) (ring_head(ring) - ring_tail(ring)) + +#define rx_ring_posted(ssk) ring_posted(ssk->rx_ring) +#define tx_ring_posted(ssk) (ring_posted(ssk->tx_ring) + \ + (ssk->tx_ring.rdma_inflight ? ssk->tx_ring.rdma_inflight->busy : 0)) + +#define posts_handler(ssk) atomic_read(&ssk->somebody_is_doing_posts) +#define posts_handler_get(ssk) atomic_inc(&ssk->somebody_is_doing_posts) +#define posts_handler_put(ssk) do {\ + atomic_dec(&ssk->somebody_is_doing_posts); \ + sdp_do_posts(ssk); \ +} while (0) + extern struct workqueue_struct *sdp_wq; extern struct list_head sock_list; extern spinlock_t sock_list_lock; +extern int rcvbuf_initial_size; +extern struct proto sdp_proto; +extern struct workqueue_struct *rx_comp_wq; +extern atomic_t sdp_current_mem_usage; +extern spinlock_t sdp_large_sockets_lock; +extern struct ib_client sdp_client; +extern struct sdpstats sdpstats; enum sdp_mid { SDP_MID_HELLO = 0x0, @@ -335,9 +133,6 @@ enum { SDP_DO_WAIT_MEM = -1 }; -struct rdma_cm_id; -struct rdma_cm_event; - struct sdp_bsdh { u8 mid; u8 flags; @@ -394,6 +189,10 @@ struct sdp_buf { u64 mapping[SDP_MAX_SEND_SKB_FRAGS + 1]; }; +struct sdp_chrecvbuf { + u32 size; +}; + /* Context used for synchronous zero copy bcopy (BZCOPY) */ struct bzcopy_state { unsigned char __user *u_base; @@ -411,6 +210,14 @@ enum rx_sa_flag { RX_SA_ABORTED = 2, }; +enum tx_sa_flag { + TX_SA_SENDSM = 0x01, + TX_SA_CROSS_SEND = 0x02, + TX_SA_INTRRUPTED = 0x04, + TX_SA_TIMEDOUT = 0x08, + TX_SA_ERROR = 0x10, +}; + struct rx_srcavail_state { /* Advertised buffer stuff */ u32 mseq; @@ -430,14 +237,6 @@ struct rx_srcavail_state { enum rx_sa_flag flags; }; -enum tx_sa_flag { - TX_SA_SENDSM = 0x01, - TX_SA_CROSS_SEND = 0x02, - TX_SA_INTRRUPTED = 0x04, - TX_SA_TIMEDOUT = 0x08, - TX_SA_ERROR = 0x10, -}; - struct tx_srcavail_state { u32 page_cnt; struct page **pages; @@ -456,20 +255,6 @@ struct tx_srcavail_state { u32 mseq; }; -static inline void tx_sa_reset(struct tx_srcavail_state *tx_sa) -{ - memset((void *)&tx_sa->busy, 0, - sizeof(*tx_sa) - offsetof(typeof(*tx_sa), busy)); -} - -#define ring_head(ring) (atomic_read(&(ring).head)) -#define ring_tail(ring) (atomic_read(&(ring).tail)) -#define ring_posted(ring) (ring_head(ring) - ring_tail(ring)) - -#define rx_ring_posted(ssk) ring_posted(ssk->rx_ring) -#define tx_ring_posted(ssk) (ring_posted(ssk->tx_ring) + \ - (ssk->tx_ring.rdma_inflight ? ssk->tx_ring.rdma_inflight->busy : 0)) - struct sdp_tx_ring { struct rx_srcavail_state *rdma_inflight; struct sdp_buf *buffer; @@ -496,43 +281,12 @@ struct sdp_rx_ring { rwlock_t destroyed_lock; }; -static inline void rx_ring_unlock(struct sdp_rx_ring *rx_ring, - unsigned long *flags) -{ - read_unlock_irqrestore(&rx_ring->destroyed_lock, *flags); -} - -static inline int rx_ring_trylock(struct sdp_rx_ring *rx_ring, - unsigned long *flags) -{ - read_lock_irqsave(&rx_ring->destroyed_lock, *flags); - if (rx_ring->destroyed) { - rx_ring_unlock(rx_ring, flags); - return 0; - } - return 1; -} - -static inline void rx_ring_destroy_lock(struct sdp_rx_ring *rx_ring) -{ - unsigned long flags; - - write_lock_irqsave(&rx_ring->destroyed_lock, flags); - rx_ring->destroyed = 1; - write_unlock_irqrestore(&rx_ring->destroyed_lock, flags); -} - -struct sdp_chrecvbuf { - u32 size; +struct sdp_device { + struct ib_pd *pd; + struct ib_mr *mr; + struct ib_fmr_pool *fmr_pool; }; -#define posts_handler(ssk) atomic_read(&ssk->somebody_is_doing_posts) -#define posts_handler_get(ssk) atomic_inc(&ssk->somebody_is_doing_posts) -#define posts_handler_put(ssk) do {\ - atomic_dec(&ssk->somebody_is_doing_posts); \ - sdp_do_posts(ssk); \ -} while (0) - struct sdp_moderation { unsigned long last_moder_packets; unsigned long last_moder_tx_packets; @@ -554,14 +308,6 @@ struct sdp_moderation { int moder_time; }; -struct sdp_device { - struct ib_pd *pd; - struct ib_mr *mr; - struct ib_fmr_pool *fmr_pool; -}; - -extern struct ib_client sdp_client; - struct sdp_sock { /* sk has to be the first member of inet_sock */ struct inet_sock isk; @@ -659,39 +405,41 @@ struct sdp_sock { int bzcopy_thresh; }; -extern int rcvbuf_initial_size; - -extern struct proto sdp_proto; -extern struct workqueue_struct *rx_comp_wq; +static inline void tx_sa_reset(struct tx_srcavail_state *tx_sa) +{ + memset((void *)&tx_sa->busy, 0, + sizeof(*tx_sa) - offsetof(typeof(*tx_sa), busy)); +} -extern atomic_t sdp_current_mem_usage; -extern spinlock_t sdp_large_sockets_lock; +static inline void rx_ring_unlock(struct sdp_rx_ring *rx_ring, + unsigned long *flags) +{ + read_unlock_irqrestore(&rx_ring->destroyed_lock, *flags); +} -static inline struct sdp_sock *sdp_sk(const struct sock *sk) +static inline int rx_ring_trylock(struct sdp_rx_ring *rx_ring, + unsigned long *flags) { - return (struct sdp_sock *)sk; + read_lock_irqsave(&rx_ring->destroyed_lock, *flags); + if (rx_ring->destroyed) { + rx_ring_unlock(rx_ring, flags); + return 0; + } + return 1; } -static inline char *sdp_state_str(int state) +static inline void rx_ring_destroy_lock(struct sdp_rx_ring *rx_ring) { - static char *state_str[] = { - [TCP_ESTABLISHED] = "TCP_ESTABLISHED", - [TCP_SYN_SENT] = "TCP_SYN_SENT", - [TCP_SYN_RECV] = "TCP_SYN_RECV", - [TCP_FIN_WAIT1] = "TCP_FIN_WAIT1", - [TCP_FIN_WAIT2] = "TCP_FIN_WAIT2", - [TCP_TIME_WAIT] = "TCP_TIME_WAIT", - [TCP_CLOSE] = "TCP_CLOSE", - [TCP_CLOSE_WAIT] = "TCP_CLOSE_WAIT", - [TCP_LAST_ACK] = "TCP_LAST_ACK", - [TCP_LISTEN] = "TCP_LISTEN", - [TCP_CLOSING] = "TCP_CLOSING", - }; + unsigned long flags; - if (state < 0 || state >= TCP_MAX_STATES) - return "unknown"; + write_lock_irqsave(&rx_ring->destroyed_lock, flags); + rx_ring->destroyed = 1; + write_unlock_irqrestore(&rx_ring->destroyed_lock, flags); +} - return state_str[state]; +static inline struct sdp_sock *sdp_sk(const struct sock *sk) +{ + return (struct sdp_sock *)sk; } static inline int _sdp_exch_state(const char *func, int line, struct sock *sk, @@ -739,77 +487,10 @@ static inline void sdp_set_error(struct sock *sk, int err) sk->sk_error_report(sk); } -#ifdef CONFIG_INFINIBAND_SDP_DEBUG_DATA -void _dump_packet(const char *func, int line, struct sock *sk, char *str, - struct sk_buff *skb, const struct sdp_bsdh *h); -#define dump_packet(sk, str, skb, h) \ - _dump_packet(__func__, __LINE__, sk, str, skb, h) -#endif - -/* sdp_main.c */ -void sdp_set_default_moderation(struct sdp_sock *ssk); -int sdp_init_sock(struct sock *sk); -void sdp_start_keepalive_timer(struct sock *sk); -void sdp_remove_sock(struct sdp_sock *ssk); -void sdp_add_sock(struct sdp_sock *ssk); -void sdp_urg(struct sdp_sock *ssk, struct sk_buff *skb); -void sdp_dreq_wait_timeout_work(struct work_struct *work); -void sdp_cancel_dreq_wait_timeout(struct sdp_sock *ssk); -void sdp_destroy_work(struct work_struct *work); -void sdp_reset_sk(struct sock *sk, int rc); -void sdp_reset(struct sock *sk); -int sdp_bzcopy_wait_memory(struct sdp_sock *ssk, long *timeo_p, - struct bzcopy_state *bz); -void skb_entail(struct sock *sk, struct sdp_sock *ssk, struct sk_buff *skb); - -/* sdp_proc.c */ -int __init sdp_proc_init(void); -void sdp_proc_unregister(void); - -/* sdp_cma.c */ -int sdp_cma_handler(struct rdma_cm_id *, struct rdma_cm_event *); - -/* sdp_tx.c */ -int sdp_tx_ring_create(struct sdp_sock *ssk, struct ib_device *device); -void sdp_tx_ring_destroy(struct sdp_sock *ssk); -int sdp_xmit_poll(struct sdp_sock *ssk, int force); -void sdp_post_send(struct sdp_sock *ssk, struct sk_buff *skb); -void sdp_post_sends(struct sdp_sock *ssk, int nonagle); -void sdp_nagle_timeout(unsigned long data); -void sdp_post_keepalive(struct sdp_sock *ssk); - -/* sdp_rx.c */ -void sdp_rx_ring_init(struct sdp_sock *ssk); -int sdp_rx_ring_create(struct sdp_sock *ssk, struct ib_device *device); -void sdp_rx_ring_destroy(struct sdp_sock *ssk); -int sdp_resize_buffers(struct sdp_sock *ssk, u32 new_size); -int sdp_init_buffers(struct sdp_sock *ssk, u32 new_size); -void sdp_do_posts(struct sdp_sock *ssk); -void sdp_rx_comp_full(struct sdp_sock *ssk); -void sdp_remove_large_sock(struct sdp_sock *ssk); -void sdp_handle_disconn(struct sock *sk); - -/* sdp_zcopy.c */ -int sdp_sendmsg_zcopy(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, - size_t size); -int sdp_handle_srcavail(struct sdp_sock *ssk, struct sdp_srcah *srcah); -void sdp_handle_sendsm(struct sdp_sock *ssk, u32 mseq_ack); -void sdp_handle_rdma_read_compl(struct sdp_sock *ssk, u32 mseq_ack, - u32 bytes_completed); -int sdp_handle_rdma_read_cqe(struct sdp_sock *ssk); -int sdp_rdma_to_iovec(struct sock *sk, struct iovec *iov, struct sk_buff *skb, - int len); -int sdp_get_pages(struct sock *sk, struct page **pages, int page_cnt, - unsigned long addr); -int sdp_post_rdma_rd_compl(struct sdp_sock *ssk, - struct rx_srcavail_state *rx_sa); -int sdp_post_sendsm(struct sock *sk); -void srcavail_cancel_timeout(struct work_struct *work); - static inline void sdp_arm_rx_cq(struct sock *sk) { sdp_prf(sk, NULL, "Arming RX cq"); -// sdp_dbg_data(sk, "Arming RX cq\n"); + sdp_dbg_data(sk, "Arming RX cq\n"); ib_req_notify_cq(sdp_sk(sk)->rx_ring.cq, IB_CQ_NEXT_COMP); } @@ -988,4 +669,117 @@ static inline int sdp_tx_ring_slots_left(struct sdp_sock *ssk) return SDP_TX_SIZE - tx_ring_posted(ssk); } +#ifdef SDPSTATS_ON + +struct sdpstats { + u32 post_send[256]; + u32 sendmsg_bcopy_segment; + u32 sendmsg_bzcopy_segment; + u32 sendmsg_zcopy_segment; + u32 sendmsg; + u32 post_send_credits; + u32 sendmsg_nagle_skip; + u32 sendmsg_seglen[25]; + u32 send_size[25]; + u32 post_recv; + u32 rx_int_count; + u32 tx_int_count; + u32 bzcopy_poll_miss; + u32 send_wait_for_mem; + u32 send_miss_no_credits; + u32 rx_poll_miss; + u32 tx_poll_miss; + u32 tx_poll_hit; + u32 tx_poll_busy; + u32 memcpy_count; + u32 credits_before_update[64]; +}; + +static inline void sdpstats_hist(u32 *h, u32 val, u32 maxidx, int is_log) +{ + int idx = is_log ? ilog2(val) : val; + if (idx > maxidx) + idx = maxidx; + + h[idx]++; +} + +#define SDPSTATS_COUNTER_INC(stat) do { sdpstats.stat++; } while (0) +#define SDPSTATS_COUNTER_ADD(stat, val) do { sdpstats.stat += val; } while (0) +#define SDPSTATS_COUNTER_MID_INC(stat, mid) do { sdpstats.stat[mid]++; } \ + while (0) +#define SDPSTATS_HIST(stat, size) \ + sdpstats_hist(sdpstats.stat, size, ARRAY_SIZE(sdpstats.stat) - 1, 1) + +#define SDPSTATS_HIST_LINEAR(stat, size) \ + sdpstats_hist(sdpstats.stat, size, ARRAY_SIZE(sdpstats.stat) - 1, 0) + +#else +#define SDPSTATS_COUNTER_INC(stat) +#define SDPSTATS_COUNTER_ADD(stat, val) +#define SDPSTATS_COUNTER_MID_INC(stat, mid) +#define SDPSTATS_HIST_LINEAR(stat, size) +#define SDPSTATS_HIST(stat, size) +#endif + +/* sdp_main.c */ +void sdp_set_default_moderation(struct sdp_sock *ssk); +int sdp_init_sock(struct sock *sk); +void sdp_start_keepalive_timer(struct sock *sk); +void sdp_remove_sock(struct sdp_sock *ssk); +void sdp_add_sock(struct sdp_sock *ssk); +void sdp_urg(struct sdp_sock *ssk, struct sk_buff *skb); +void sdp_dreq_wait_timeout_work(struct work_struct *work); +void sdp_cancel_dreq_wait_timeout(struct sdp_sock *ssk); +void sdp_destroy_work(struct work_struct *work); +void sdp_reset_sk(struct sock *sk, int rc); +void sdp_reset(struct sock *sk); +int sdp_bzcopy_wait_memory(struct sdp_sock *ssk, long *timeo_p, + struct bzcopy_state *bz); +void skb_entail(struct sock *sk, struct sdp_sock *ssk, struct sk_buff *skb); + +/* sdp_proc.c */ +int __init sdp_proc_init(void); +void sdp_proc_unregister(void); + +/* sdp_cma.c */ +int sdp_cma_handler(struct rdma_cm_id *, struct rdma_cm_event *); + +/* sdp_tx.c */ +int sdp_tx_ring_create(struct sdp_sock *ssk, struct ib_device *device); +void sdp_tx_ring_destroy(struct sdp_sock *ssk); +int sdp_xmit_poll(struct sdp_sock *ssk, int force); +void sdp_post_send(struct sdp_sock *ssk, struct sk_buff *skb); +void sdp_post_sends(struct sdp_sock *ssk, int nonagle); +void sdp_nagle_timeout(unsigned long data); +void sdp_post_keepalive(struct sdp_sock *ssk); + +/* sdp_rx.c */ +void sdp_rx_ring_init(struct sdp_sock *ssk); +int sdp_rx_ring_create(struct sdp_sock *ssk, struct ib_device *device); +void sdp_rx_ring_destroy(struct sdp_sock *ssk); +int sdp_resize_buffers(struct sdp_sock *ssk, u32 new_size); +int sdp_init_buffers(struct sdp_sock *ssk, u32 new_size); +void sdp_do_posts(struct sdp_sock *ssk); +void sdp_rx_comp_full(struct sdp_sock *ssk); +void sdp_remove_large_sock(struct sdp_sock *ssk); +void sdp_handle_disconn(struct sock *sk); + +/* sdp_zcopy.c */ +int sdp_sendmsg_zcopy(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, + size_t size); +int sdp_handle_srcavail(struct sdp_sock *ssk, struct sdp_srcah *srcah); +void sdp_handle_sendsm(struct sdp_sock *ssk, u32 mseq_ack); +void sdp_handle_rdma_read_compl(struct sdp_sock *ssk, u32 mseq_ack, + u32 bytes_completed); +int sdp_handle_rdma_read_cqe(struct sdp_sock *ssk); +int sdp_rdma_to_iovec(struct sock *sk, struct iovec *iov, struct sk_buff *skb, + int len); +int sdp_get_pages(struct sock *sk, struct page **pages, int page_cnt, + unsigned long addr); +int sdp_post_rdma_rd_compl(struct sdp_sock *ssk, + struct rx_srcavail_state *rx_sa); +int sdp_post_sendsm(struct sock *sk); +void srcavail_cancel_timeout(struct work_struct *work); + #endif diff --git a/drivers/infiniband/ulp/sdp/sdp_bcopy.c b/drivers/infiniband/ulp/sdp/sdp_bcopy.c index db8d6693d1cd..432ec6caff62 100644 --- a/drivers/infiniband/ulp/sdp/sdp_bcopy.c +++ b/drivers/infiniband/ulp/sdp/sdp_bcopy.c @@ -31,14 +31,8 @@ * * $Id$ */ -#include -#include -#include -#include #include "sdp.h" -#define SDP_RESIZE_WAIT 16 - #ifdef CONFIG_INFINIBAND_SDP_DEBUG_DATA void _dump_packet(const char *func, int line, struct sock *sk, char *str, struct sk_buff *skb, const struct sdp_bsdh *h) diff --git a/drivers/infiniband/ulp/sdp/sdp_cma.c b/drivers/infiniband/ulp/sdp/sdp_cma.c index 1f423cc78f88..d977d44d43e8 100644 --- a/drivers/infiniband/ulp/sdp/sdp_cma.c +++ b/drivers/infiniband/ulp/sdp/sdp_cma.c @@ -46,7 +46,7 @@ #include "sdp_socket.h" #include "sdp.h" -#define SDP_MAJV_MINV 0x11 +#define SDP_MAJV_MINV 0x22 enum { SDP_HH_SIZE = 76, @@ -62,7 +62,7 @@ static int sdp_init_qp(struct sock *sk, struct rdma_cm_id *id) struct ib_qp_init_attr qp_init_attr = { .event_handler = sdp_qp_event_handler, .cap.max_send_wr = SDP_TX_SIZE, - .cap.max_send_sge = SDP_MAX_SEND_SGES /*SDP_MAX_SEND_SKB_FRAGS*/, + .cap.max_send_sge = SDP_MAX_SEND_SGES, .cap.max_recv_wr = SDP_RX_SIZE, .cap.max_recv_sge = SDP_MAX_RECV_SKB_FRAGS + 1, .sq_sig_type = IB_SIGNAL_REQ_WR, @@ -95,19 +95,6 @@ static int sdp_init_qp(struct sock *sk, struct rdma_cm_id *id) sdp_sk(sk)->ib_device = device; sdp_sk(sk)->qp_active = 1; -{ - struct ib_qp_attr qp_attr; - struct ib_qp_init_attr qp_init_attr; - - rc = ib_query_qp(sdp_sk(sk)->qp, - &qp_attr, - 0, - &qp_init_attr); - - sdp_sk(sk)->max_send_sge = qp_attr.cap.max_send_sge; - sdp_dbg(sk, "max_send_sge = %d\n", sdp_sk(sk)->max_send_sge); -} - init_waitqueue_head(&sdp_sk(sk)->wq); sdp_dbg(sk, "%s done\n", __func__); @@ -330,7 +317,8 @@ int sdp_cma_handler(struct rdma_cm_id *id, struct rdma_cm_event *event) rx_ring_posted(sdp_sk(sk))); memset(&hh, 0, sizeof hh); hh.bsdh.mid = SDP_MID_HELLO; - hh.bsdh.len = htonl(sizeof(struct sdp_bsdh) + SDP_HH_SIZE); + hh.bsdh.len = htonl(sizeof(struct sdp_bsdh) + + sizeof(struct sdp_hh)); hh.max_adverts = 1; hh.majv_minv = SDP_MAJV_MINV; sdp_init_buffers(sdp_sk(sk), rcvbuf_initial_size); @@ -348,7 +336,6 @@ int sdp_cma_handler(struct rdma_cm_id *id, struct rdma_cm_event *event) conn_param.retry_count = SDP_RETRY_COUNT; SDP_DUMP_PACKET(NULL, "TX", NULL, &hh.bsdh); rc = rdma_connect(id, &conn_param); -// sdp_sk(sk)->qp_active = 1; break; case RDMA_CM_EVENT_ROUTE_ERROR: sdp_dbg(sk, "RDMA_CM_EVENT_ROUTE_ERROR : %p\n", id); @@ -368,7 +355,8 @@ int sdp_cma_handler(struct rdma_cm_id *id, struct rdma_cm_event *event) memset(&hah, 0, sizeof hah); hah.bsdh.mid = SDP_MID_HELLO_ACK; hah.bsdh.bufs = htons(rx_ring_posted(sdp_sk(child))); - hah.bsdh.len = htonl(sizeof(struct sdp_bsdh) + SDP_HAH_SIZE); + hah.bsdh.len = htonl(sizeof(struct sdp_bsdh) + + sizeof(struct sdp_hah)); hah.majv_minv = SDP_MAJV_MINV; hah.ext_max_adverts = 1; /* Doesn't seem to be mandated by spec, but just in case */ @@ -387,8 +375,6 @@ int sdp_cma_handler(struct rdma_cm_id *id, struct rdma_cm_event *event) id->qp = NULL; id->context = NULL; parent = sdp_sk(child)->parent; /* TODO: hold ? */ - } else { -// sdp_sk(child)->qp_active = 1; } break; case RDMA_CM_EVENT_CONNECT_RESPONSE: diff --git a/drivers/infiniband/ulp/sdp/sdp_dbg.h b/drivers/infiniband/ulp/sdp/sdp_dbg.h new file mode 100644 index 000000000000..d38ad29bafb3 --- /dev/null +++ b/drivers/infiniband/ulp/sdp/sdp_dbg.h @@ -0,0 +1,173 @@ +#ifndef _SDP_DBG_H_ +#define _SDP_DBG_H_ + +#define SDPSTATS_ON +#define SDP_PROFILING + +#define _sdp_printk(func, line, level, sk, format, arg...) do { \ + preempt_disable(); \ + printk(level "%s:%d sdp_sock(%5d:%d %d:%d): " format, \ + func, line, \ + current->pid, smp_processor_id(), \ + (sk) ? inet_sk(sk)->num : -1, \ + (sk) ? ntohs(inet_sk(sk)->dport) : -1, ## arg); \ + preempt_enable(); \ +} while (0) +#define sdp_printk(level, sk, format, arg...) \ + _sdp_printk(__func__, __LINE__, level, sk, format, ## arg) +#define sdp_warn(sk, format, arg...) \ + sdp_printk(KERN_WARNING, sk, format , ## arg) + +#define SDP_MODPARAM_SINT(var, def_val, msg) \ + static int var = def_val; \ + module_param_named(var, var, int, 0644); \ + MODULE_PARM_DESC(var, msg " [" #def_val "]"); \ + +#define SDP_MODPARAM_INT(var, def_val, msg) \ + int var = def_val; \ + module_param_named(var, var, int, 0644); \ + MODULE_PARM_DESC(var, msg " [" #def_val "]"); \ + +#ifdef SDP_PROFILING +struct sk_buff; +struct sdpprf_log { + int idx; + int pid; + int cpu; + int sk_num; + int sk_dport; + struct sk_buff *skb; + char msg[256]; + + unsigned long long time; + + const char *func; + int line; +}; + +#define SDPPRF_LOG_SIZE 0x20000 /* must be a power of 2 */ + +extern struct sdpprf_log sdpprf_log[SDPPRF_LOG_SIZE]; +extern int sdpprf_log_count; + +#define sdp_prf1(sk, s, format, arg...) ({ \ + struct sdpprf_log *l = \ + &sdpprf_log[sdpprf_log_count++ & (SDPPRF_LOG_SIZE - 1)]; \ + preempt_disable(); \ + l->idx = sdpprf_log_count - 1; \ + l->pid = current->pid; \ + l->sk_num = (sk) ? inet_sk(sk)->num : -1; \ + l->sk_dport = (sk) ? ntohs(inet_sk(sk)->dport) : -1; \ + l->cpu = smp_processor_id(); \ + l->skb = s; \ + snprintf(l->msg, sizeof(l->msg) - 1, format, ## arg); \ + l->time = jiffies_to_usecs(jiffies); \ + l->func = __func__; \ + l->line = __LINE__; \ + preempt_enable(); \ + 1; \ +}) +//#define sdp_prf(sk, s, format, arg...) +#define sdp_prf(sk, s, format, arg...) sdp_prf1(sk, s, format, ## arg) + +#else +#define sdp_prf1(sk, s, format, arg...) +#define sdp_prf(sk, s, format, arg...) +#endif + +#ifdef CONFIG_INFINIBAND_SDP_DEBUG +extern int sdp_debug_level; + +#define sdp_dbg(sk, format, arg...) \ + do { \ + if (sdp_debug_level > 0) \ + sdp_printk(KERN_WARNING, sk, format , ## arg); \ + } while (0) + +#define sock_ref(sk, msg, sock_op) ({ \ + if (!atomic_read(&(sk)->sk_refcnt)) {\ + sdp_warn(sk, "%s:%d - %s (%s) ref = 0.\n", \ + __func__, __LINE__, #sock_op, msg); \ + WARN_ON(1); \ + } else { \ + sdp_dbg(sk, "%s:%d - %s (%s) ref = %d.\n", __func__, __LINE__, \ + #sock_op, msg, atomic_read(&(sk)->sk_refcnt)); \ + sock_op(sk); \ + }\ +}) + +#define sk_common_release(sk) do { \ + sdp_dbg(sk, "%s:%d - sock_put(" SOCK_REF_BORN \ + ") - refcount = %d from withing sk_common_release\n",\ + __func__, __LINE__, atomic_read(&(sk)->sk_refcnt));\ + sk_common_release(sk); \ +} while (0) + +#else /* CONFIG_INFINIBAND_SDP_DEBUG */ +#define sdp_dbg(priv, format, arg...) \ + do { (void) (priv); } while (0) +#define sock_ref(sk, msg, sock_op) sock_op(sk) +#endif /* CONFIG_INFINIBAND_SDP_DEBUG */ + +#ifdef CONFIG_INFINIBAND_SDP_DEBUG_DATA + +extern int sdp_data_debug_level; +#define sdp_dbg_data(sk, format, arg...) \ + do { \ + if (sdp_data_debug_level & 0x2) \ + sdp_printk(KERN_WARNING, sk, format , ## arg); \ + } while (0) +#define SDP_DUMP_PACKET(sk, str, skb, h) \ + do { \ + if (sdp_data_debug_level & 0x1) \ + dump_packet(sk, str, skb, h); \ + } while (0) +#else +#define sdp_dbg_data(priv, format, arg...) +#define SDP_DUMP_PACKET(sk, str, skb, h) +#endif + +#define SOCK_REF_RESET "RESET" +#define SOCK_REF_BORN "BORN" /* sock_alloc -> destruct_sock */ +#define SOCK_REF_CLONE "CLONE" +#define SOCK_REF_CM_TW "CM_TW" /* TIMEWAIT_ENTER -> TIMEWAIT_EXIT */ +#define SOCK_REF_SEQ "SEQ" /* during proc read */ +#define SOCK_REF_DREQ_TO "DREQ_TO" /* dreq timeout is pending */ + +#define sock_hold(sk, msg) sock_ref(sk, msg, sock_hold) +#define sock_put(sk, msg) sock_ref(sk, msg, sock_put) +#define __sock_put(sk, msg) sock_ref(sk, msg, __sock_put) + +#define ENUM2STR(e) [e] = #e + +static inline char *sdp_state_str(int state) +{ + static char *state2str[] = { + ENUM2STR(TCP_ESTABLISHED), + ENUM2STR(TCP_SYN_SENT), + ENUM2STR(TCP_SYN_RECV), + ENUM2STR(TCP_FIN_WAIT1), + ENUM2STR(TCP_FIN_WAIT2), + ENUM2STR(TCP_TIME_WAIT), + ENUM2STR(TCP_CLOSE), + ENUM2STR(TCP_CLOSE_WAIT), + ENUM2STR(TCP_LAST_ACK), + ENUM2STR(TCP_LISTEN), + ENUM2STR(TCP_CLOSING), + }; + + if (state < 0 || state >= ARRAY_SIZE(state2str)) + return "unknown"; + + return state2str[state]; +} + +struct sdp_bsdh; +#ifdef CONFIG_INFINIBAND_SDP_DEBUG_DATA +void _dump_packet(const char *func, int line, struct sock *sk, char *str, + struct sk_buff *skb, const struct sdp_bsdh *h); +#define dump_packet(sk, str, skb, h) \ + _dump_packet(__func__, __LINE__, sk, str, skb, h) +#endif + +#endif diff --git a/drivers/infiniband/ulp/sdp/sdp_main.c b/drivers/infiniband/ulp/sdp/sdp_main.c index 84b0830981a4..006baaf4f31c 100644 --- a/drivers/infiniband/ulp/sdp/sdp_main.c +++ b/drivers/infiniband/ulp/sdp/sdp_main.c @@ -1400,7 +1400,7 @@ static inline struct bzcopy_state *sdp_bz_cleanup(struct bzcopy_state *bz) static struct bzcopy_state *sdp_bz_setup(struct sdp_sock *ssk, - unsigned char __user *base, + char __user *base, int len, int size_goal) { @@ -1466,7 +1466,7 @@ err: #define TCP_PAGE(sk) (sk->sk_sndmsg_page) #define TCP_OFF(sk) (sk->sk_sndmsg_off) static inline int sdp_bcopy_get(struct sock *sk, struct sk_buff *skb, - unsigned char __user *from, int copy) + char __user *from, int copy) { int err; struct sdp_sock *ssk = sdp_sk(sk); @@ -1553,7 +1553,7 @@ static inline int sdp_bcopy_get(struct sock *sk, struct sk_buff *skb, } static inline int sdp_bzcopy_get(struct sock *sk, struct sk_buff *skb, - unsigned char __user *from, int copy, + char __user *from, int copy, struct bzcopy_state *bz) { int this_page, left; @@ -1736,7 +1736,7 @@ static int sdp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, while (--iovlen >= 0) { int seglen = iov->iov_len; - unsigned char __user *from = iov->iov_base; + char __user *from = iov->iov_base; iov++; diff --git a/drivers/infiniband/ulp/sdp/sdp_rx.c b/drivers/infiniband/ulp/sdp/sdp_rx.c index 08e8e3d9f804..4292303cc0bb 100644 --- a/drivers/infiniband/ulp/sdp/sdp_rx.c +++ b/drivers/infiniband/ulp/sdp/sdp_rx.c @@ -702,12 +702,8 @@ static int sdp_poll_rx_cq(struct sdp_sock *ssk) do { n = ib_poll_cq(cq, SDP_NUM_WC, ibwc); -// sdp_warn(&ssk->isk.sk, "polling: %d\n", n); for (i = 0; i < n; ++i) { struct ib_wc *wc = &ibwc[i]; -/* sdp_warn(&ssk->isk.sk, "wr_id=0x%lx len %d opcode: 0x%x status: 0x%x\n", - wc->wr_id, wc->byte_len, - wc->opcode, wc->status);*/ BUG_ON(!(wc->wr_id & SDP_OP_RECV)); skb = sdp_process_rx_wc(ssk, wc); @@ -801,9 +797,6 @@ static void sdp_rx_irq(struct ib_cq *cq, void *cq_context) int wc_processed = 0; int credits_before; -// sdp_dbg_data(&ssk->isk.sk, "rx irq called\n"); -// sdp_warn(&ssk->isk.sk, "rx irq called\n"); - if (cq != ssk->rx_ring.cq) { sdp_warn(sk, "cq = %p, ssk->cq = %p\n", cq, ssk->rx_ring.cq); return; diff --git a/drivers/infiniband/ulp/sdp/sdp_tx.c b/drivers/infiniband/ulp/sdp/sdp_tx.c index 26c5e56ab1c6..bf0a290c99f6 100644 --- a/drivers/infiniband/ulp/sdp/sdp_tx.c +++ b/drivers/infiniband/ulp/sdp/sdp_tx.c @@ -60,8 +60,6 @@ int sdp_xmit_poll(struct sdp_sock *ssk, int force) return wc_processed; } -static unsigned long last_send; - void sdp_post_send(struct sdp_sock *ssk, struct sk_buff *skb) { struct sdp_buf *tx_req; @@ -71,7 +69,6 @@ void sdp_post_send(struct sdp_sock *ssk, struct sk_buff *skb) u64 addr; struct ib_device *dev; struct ib_send_wr *bad_wr; - int delta; struct ib_sge ibsge[SDP_MAX_SEND_SKB_FRAGS + 1]; struct ib_sge *sge = ibsge; @@ -147,11 +144,6 @@ void sdp_post_send(struct sdp_sock *ssk, struct sk_buff *skb) if (unlikely(SDP_SKB_CB(skb)->flags & TCPCB_FLAG_URG)) tx_wr.send_flags |= IB_SEND_SOLICITED; - delta = jiffies - last_send; - if (likely(last_send)) - SDPSTATS_HIST(send_interval, delta); - last_send = jiffies; - rc = ib_post_send(ssk->qp, &tx_wr, &bad_wr); atomic_inc(&ssk->tx_ring.head); atomic_dec(&ssk->tx_ring.credits); @@ -256,8 +248,9 @@ static inline void sdp_process_tx_wc(struct sdp_sock *ssk, struct ib_wc *wc) return; } - /* Only last RDMA read WR is signalled. Order is guaranteed - therefore - * if Last RDMA read WR is completed - all other have, too */ + /* Only last RDMA read WR is signalled. Order is guaranteed - + * therefore if Last RDMA read WR is completed - all other + * have, too */ ssk->tx_ring.rdma_inflight->busy = 0; if (!ssk->tx_ring.rdma_inflight->busy) { wake_up(ssk->isk.sk.sk_sleep); @@ -301,8 +294,6 @@ static int sdp_process_tx_cq(struct sdp_sock *ssk) } } while (n == SDP_NUM_WC); -// sdp_dbg_data(&ssk->isk.sk, "processed %d wc's\n", wc_processed); - if (wc_processed) { struct sock *sk = &ssk->isk.sk; sdp_post_sends(ssk, 0); @@ -320,9 +311,6 @@ static void sdp_poll_tx_timeout(unsigned long data) struct sock *sk = &ssk->isk.sk; u32 inflight, wc_processed; -// sdp_dbg_data(&ssk->isk.sk, "Polling tx cq. inflight=%d\n", -// (u32) tx_ring_posted(ssk)); - sdp_prf1(&ssk->isk.sk, NULL, "TX timeout: inflight=%d", (u32) tx_ring_posted(ssk)); @@ -330,7 +318,6 @@ static void sdp_poll_tx_timeout(unsigned long data) bh_lock_sock(sk); if (sock_owned_by_user(sk)) { mod_timer(&ssk->tx_ring.timer, jiffies + SDP_TX_POLL_TIMEOUT); -// sdp_dbg_data(&ssk->isk.sk, "socket is busy - trying later\n"); sdp_prf(&ssk->isk.sk, NULL, "TX comp: socket is busy\n"); SDPSTATS_COUNTER_INC(tx_poll_busy); goto out; @@ -351,7 +338,6 @@ static void sdp_poll_tx_timeout(unsigned long data) * been scheduled by the Tx routine then schedule it here to guarantee * completion processing of these packets */ if (inflight) { /* TODO: make sure socket is not closed */ -// sdp_dbg_data(sk, "arming timer for more polling\n"); mod_timer(&ssk->tx_ring.timer, jiffies + SDP_TX_POLL_TIMEOUT); } @@ -417,10 +403,6 @@ void sdp_post_keepalive(struct sdp_sock *ssk) static void sdp_tx_cq_event_handler(struct ib_event *event, void *data) { - printk("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n"); - printk("xx event called !!!!!!!!!! xxxxxx\n"); - printk("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n"); - printk("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n"); } int sdp_tx_ring_create(struct sdp_sock *ssk, struct ib_device *device)