From: Eldad Zinger Date: Wed, 31 Mar 2010 13:02:03 +0000 (+0300) Subject: sdp: BUG1992 - enable transmission of credits update when tx_credits == 1 X-Git-Tag: v4.1.12-92~264^2~5^2~204 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=1610ab9333b1c0425e144ca91a8df7aeb953a528;p=users%2Fjedix%2Flinux-maple.git sdp: BUG1992 - enable transmission of credits update when tx_credits == 1 According to spec, if one credit is available, we can only send messages that provide additional credits and also do not contain data payload. Signed-off-by: Eldad Zinger --- diff --git a/drivers/infiniband/ulp/sdp/sdp.h b/drivers/infiniband/ulp/sdp/sdp.h index ac52d2010904..bb9bcaff4858 100644 --- a/drivers/infiniband/ulp/sdp/sdp.h +++ b/drivers/infiniband/ulp/sdp/sdp.h @@ -677,6 +677,19 @@ static inline int sdp_tx_ring_slots_left(struct sdp_sock *ssk) return SDP_TX_SIZE - tx_ring_posted(ssk); } +static inline int credit_update_needed(struct sdp_sock *ssk) +{ + int c; + + c = remote_credits(ssk); + if (likely(c > SDP_MIN_TX_CREDITS)) + c += c/2; + return unlikely(c < rx_ring_posted(ssk)) && + likely(tx_credits(ssk) > 0) && + likely(sdp_tx_ring_slots_left(ssk)); +} + + #ifdef SDPSTATS_ON #define SDPSTATS_MAX_HIST_SIZE 256 diff --git a/drivers/infiniband/ulp/sdp/sdp_bcopy.c b/drivers/infiniband/ulp/sdp/sdp_bcopy.c index e230b771a7c1..d7a8733b0793 100644 --- a/drivers/infiniband/ulp/sdp/sdp_bcopy.c +++ b/drivers/infiniband/ulp/sdp/sdp_bcopy.c @@ -179,7 +179,6 @@ void sdp_post_sends(struct sdp_sock *ssk, gfp_t gfp) { /* TODO: nonagle? */ struct sk_buff *skb; - int c; int post_count = 0; struct sock *sk = &ssk->isk.sk; @@ -228,13 +227,7 @@ void sdp_post_sends(struct sdp_sock *ssk, gfp_t gfp) post_count++; } - c = remote_credits(ssk); - if (likely(c > SDP_MIN_TX_CREDITS)) - c *= 2; - - if (unlikely(c < rx_ring_posted(ssk)) && - likely(tx_credits(ssk) > 1) && - likely(sdp_tx_ring_slots_left(ssk)) && + if (credit_update_needed(ssk) && likely((1 << ssk->isk.sk.sk_state) & (TCPF_ESTABLISHED | TCPF_FIN_WAIT1))) { diff --git a/drivers/infiniband/ulp/sdp/sdp_rx.c b/drivers/infiniband/ulp/sdp/sdp_rx.c index 56ccc1a6f121..1e02a6d0928b 100644 --- a/drivers/infiniband/ulp/sdp/sdp_rx.c +++ b/drivers/infiniband/ulp/sdp/sdp_rx.c @@ -395,20 +395,6 @@ static void sdp_handle_resize_ack(struct sdp_sock *ssk, ssk->sent_request = 0; } -static inline int credit_update_needed(struct sdp_sock *ssk) -{ - int c; - - c = remote_credits(ssk); - if (likely(c > SDP_MIN_TX_CREDITS)) - c += c/2; - - return unlikely(c < rx_ring_posted(ssk)) && - likely(tx_credits(ssk) > 1) && - likely(sdp_tx_ring_slots_left(ssk)); -} - - static struct sk_buff *sdp_recv_completion(struct sdp_sock *ssk, int id) { struct sdp_buf *rx_req;