--- a/net/ipv4/tcp.c 2014-10-31 14:27:58.000000000 +0200 +++ b/net/ipv4/tcp.c 2015-05-19 15:34:22.078802741 +0300 @@ -763,8 +763,8 @@ static int tcp_send_mss(struct sock *sk, return mss_now; } -static ssize_t do_tcp_sendpages(struct sock *sk, struct page **pages, int poffset, - size_t psize, int flags) +static ssize_t do_tcp_sendpages(struct sock *sk, struct page *page, int offset, + size_t size, int flags) { struct tcp_sock *tp = tcp_sk(sk); int mss_now, size_goal; @@ -786,12 +786,9 @@ static ssize_t do_tcp_sendpages(struct s if (sk->sk_err || (sk->sk_shutdown & SEND_SHUTDOWN)) goto out_err; - while (psize > 0) { + while (size > 0) { struct sk_buff *skb = tcp_write_queue_tail(sk); - struct page *page = pages[poffset / PAGE_SIZE]; int copy, i, can_coalesce; - int offset = poffset % PAGE_SIZE; - int size = min_t(size_t, psize, PAGE_SIZE - offset); if (!tcp_send_head(sk) || (copy = size_goal - skb->len) <= 0) { new_segment: @@ -840,8 +837,8 @@ new_segment: TCP_SKB_CB(skb)->flags &= ~TCPCB_FLAG_PSH; copied += copy; - poffset += copy; - if (!(psize -= copy)) + offset += copy; + if (!(size -= copy)) goto out; if (skb->len < size_goal || (flags & MSG_OOB)) @@ -890,7 +887,7 @@ ssize_t tcp_sendpage(struct socket *sock lock_sock(sk); TCP_CHECK_TIMER(sk); - res = do_tcp_sendpages(sk, &page, offset, size, flags); + res = do_tcp_sendpages(sk, page, offset, size, flags); TCP_CHECK_TIMER(sk); release_sock(sk); return res;