From: Michael S. Tsirkin Date: Wed, 19 Jul 2006 08:46:11 +0000 (+0300) Subject: IB/sdp: Implement Nagle algorithm. X-Git-Tag: v4.1.12-92~264^2~5^2~402 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=16e83f4d56556f0e663c18ae7ceda2517ed5f354;p=users%2Fjedix%2Flinux-maple.git IB/sdp: Implement Nagle algorithm. --- diff --git a/drivers/infiniband/ulp/sdp/sdp_bcopy.c b/drivers/infiniband/ulp/sdp/sdp_bcopy.c index 90007b6d9ffc4..da595a5665bcd 100644 --- a/drivers/infiniband/ulp/sdp/sdp_bcopy.c +++ b/drivers/infiniband/ulp/sdp/sdp_bcopy.c @@ -297,6 +297,16 @@ static inline void update_send_head(struct sock *sk, struct sk_buff *skb) } } +static inline int sdp_nagle_off(struct sdp_sock *ssk, struct sk_buff *skb) +{ + return (ssk->nonagle & TCP_NAGLE_OFF) || + skb->next != (struct sk_buff *)&ssk->isk.sk.sk_write_queue || + skb->len + sizeof(struct sdp_bsdh) >= ssk->xmit_size_goal || + (ssk->tx_tail == ssk->tx_head && + !(ssk->nonagle & TCP_NAGLE_CORK)) || + (TCP_SKB_CB(skb)->flags & TCPCB_FLAG_PSH); +} + void sdp_post_sends(struct sdp_sock *ssk, int nonagle) { /* TODO: nonagle? */ @@ -308,7 +318,8 @@ void sdp_post_sends(struct sdp_sock *ssk, int nonagle) while (ssk->bufs > SDP_MIN_BUFS && ssk->tx_head - ssk->tx_tail < SDP_TX_SIZE && - (skb = ssk->isk.sk.sk_send_head)) { + (skb = ssk->isk.sk.sk_send_head) && + sdp_nagle_off(ssk, skb)) { update_send_head(&ssk->isk.sk, skb); __skb_dequeue(&ssk->isk.sk.sk_write_queue); sdp_post_send(ssk, skb, SDP_MID_DATA); diff --git a/drivers/infiniband/ulp/sdp/sdp_main.c b/drivers/infiniband/ulp/sdp/sdp_main.c index 7b6dc3c04aee9..e61b4af327f58 100644 --- a/drivers/infiniband/ulp/sdp/sdp_main.c +++ b/drivers/infiniband/ulp/sdp/sdp_main.c @@ -597,8 +597,19 @@ static void sdp_shutdown(struct sock *sk, int how) sdp_post_sends(ssk, 0); } +static void sdp_mark_push(struct sdp_sock *ssk, struct sk_buff *skb) +{ + TCP_SKB_CB(skb)->flags |= TCPCB_FLAG_PSH; + ssk->pushed_seq = ssk->write_seq; +} + static inline void sdp_push_pending_frames(struct sock *sk) { + struct sk_buff *skb = sk->sk_write_queue.prev; + if (skb) { + sdp_mark_push(sdp_sk(sk), skb); + sdp_post_sends(sdp_sk(sk), 0); + } } /* SOL_SOCKET level options are handled by sock_setsockopt */ @@ -783,12 +794,6 @@ static int forced_push(struct sdp_sock *sk) return 0; } -static void sdp_mark_push(struct sdp_sock *ssk, struct sk_buff *skb) -{ - TCP_SKB_CB(skb)->flags |= TCPCB_FLAG_PSH; - ssk->pushed_seq = ssk->write_seq; -} - static inline int select_size(struct sock *sk, struct sdp_sock *ssk) { return 0;