All of lore.kernel.org
 help / color / mirror / Atom feed
From: Eric Dumazet <dada1@cosmosbay.com>
To: Willy Tarreau <w@1wt.eu>
Cc: David Miller <davem@davemloft.net>,
	ben@zeus.com, jarkao2@gmail.com, mingo@elte.hu,
	linux-kernel@vger.kernel.org, netdev@vger.kernel.org,
	jens.axboe@oracle.com
Subject: Re: [PATCH] tcp: splice as many packets as possible at once
Date: Fri, 09 Jan 2009 23:12:09 +0100	[thread overview]
Message-ID: <4967CBB9.1060403@cosmosbay.com> (raw)
In-Reply-To: <20090109220737.GA4111@1wt.eu>

Willy Tarreau a écrit :
> On Fri, Jan 09, 2009 at 10:24:00PM +0100, Willy Tarreau wrote:
>> On Fri, Jan 09, 2009 at 09:51:17PM +0100, Eric Dumazet wrote:
>> (...)
>>>> Also, in your second mail, you're saying that your change
>>>> might return more data than requested by the user. I can't
>>>> find why, could you please explain to me, as I'm still quite
>>>> ignorant in this area ?
>>> Well, I just tested various user programs and indeed got this
>>> strange result :
>>>
>>> Here I call splice() with len=1000 (0x3e8), and you can see
>>> it gives a result of 1460 at the second call.
> 
> OK finally I could reproduce it and found why we have this. It's
> expected in fact.
> 
> The problem when we loop in tcp_read_sock() is that tss->len is
> not decremented by the amount of bytes read, this one is done
> only in tcp_splice_read() which is outer.
> 
> The solution I found was to do just like other callers, which means
> use desc->count to keep the remaining number of bytes we want to
> read. In fact, tcp_read_sock() is designed to use that one as a stop
> condition, which explains why you first had to hide it.
> 
> Now with the attached patch as a replacement for my previous one,
> both issues are solved :
>   - I splice 1000 bytes if I ask to do so
>   - I splice as much as possible if available (typically 23 kB).
> 
> My observed performances are still at the top of earlier results
> and IMHO that way of counting bytes makes sense for an actor called
> from tcp_read_sock().
> 
> diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c
> index 35bcddf..51ff3aa 100644
> --- a/net/ipv4/tcp.c
> +++ b/net/ipv4/tcp.c
> @@ -522,8 +522,12 @@ static int tcp_splice_data_recv(read_descriptor_t *rd_desc, struct sk_buff *skb,
>  				unsigned int offset, size_t len)
>  {
>  	struct tcp_splice_state *tss = rd_desc->arg.data;
> +	int ret;
>  
> -	return skb_splice_bits(skb, offset, tss->pipe, tss->len, tss->flags);
> +	ret = skb_splice_bits(skb, offset, tss->pipe, rd_desc->count, tss->flags);
> +	if (ret > 0)
> +		rd_desc->count -= ret;
> +	return ret;
>  }
>  
>  static int __tcp_splice_read(struct sock *sk, struct tcp_splice_state *tss)
> @@ -531,6 +535,7 @@ static int __tcp_splice_read(struct sock *sk, struct tcp_splice_state *tss)
>  	/* Store TCP splice context information in read_descriptor_t. */
>  	read_descriptor_t rd_desc = {
>  		.arg.data = tss,
> +		.count = tss->len,
>  	};
>  
>  	return tcp_read_sock(sk, &rd_desc, tcp_splice_data_recv);
> 

OK, I came to a different patch. Please check other tcp_read_sock() callers in tree :)

diff --git a/drivers/scsi/iscsi_tcp.c b/drivers/scsi/iscsi_tcp.c
index 23808df..96b49e1 100644
--- a/drivers/scsi/iscsi_tcp.c
+++ b/drivers/scsi/iscsi_tcp.c
@@ -100,13 +100,11 @@ static void iscsi_sw_tcp_data_ready(struct sock *sk, int flag)
 
 	/*
 	 * Use rd_desc to pass 'conn' to iscsi_tcp_recv.
-	 * We set count to 1 because we want the network layer to
-	 * hand us all the skbs that are available. iscsi_tcp_recv
-	 * handled pdus that cross buffers or pdus that still need data.
+	 * iscsi_tcp_recv handled pdus that cross buffers or pdus that
+	 * still need data.
 	 */
 	rd_desc.arg.data = conn;
-	rd_desc.count = 1;
-	tcp_read_sock(sk, &rd_desc, iscsi_sw_tcp_recv);
+	tcp_read_sock(sk, &rd_desc, iscsi_sw_tcp_recv, 65536);
 
 	read_unlock(&sk->sk_callback_lock);
 
diff --git a/include/net/tcp.h b/include/net/tcp.h
index 218235d..b1facd1 100644
--- a/include/net/tcp.h
+++ b/include/net/tcp.h
@@ -490,7 +490,7 @@ extern void tcp_get_info(struct sock *, struct tcp_info *);
 typedef int (*sk_read_actor_t)(read_descriptor_t *, struct sk_buff *,
 				unsigned int, size_t);
 extern int tcp_read_sock(struct sock *sk, read_descriptor_t *desc,
-			 sk_read_actor_t recv_actor);
+			 sk_read_actor_t recv_actor, size_t tlen);
 
 extern void tcp_initialize_rcv_mss(struct sock *sk);
 
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c
index bd6ff90..fbbddf4 100644
--- a/net/ipv4/tcp.c
+++ b/net/ipv4/tcp.c
@@ -523,7 +523,7 @@ static int tcp_splice_data_recv(read_descriptor_t *rd_desc, struct sk_buff *skb,
 {
 	struct tcp_splice_state *tss = rd_desc->arg.data;
 
-	return skb_splice_bits(skb, offset, tss->pipe, tss->len, tss->flags);
+	return skb_splice_bits(skb, offset, tss->pipe, len, tss->flags);
 }
 
 static int __tcp_splice_read(struct sock *sk, struct tcp_splice_state *tss)
@@ -533,7 +533,7 @@ static int __tcp_splice_read(struct sock *sk, struct tcp_splice_state *tss)
 		.arg.data = tss,
 	};
 
-	return tcp_read_sock(sk, &rd_desc, tcp_splice_data_recv);
+	return tcp_read_sock(sk, &rd_desc, tcp_splice_data_recv, tss->len);
 }
 
 /**
@@ -611,11 +611,13 @@ ssize_t tcp_splice_read(struct socket *sock, loff_t *ppos,
 		tss.len -= ret;
 		spliced += ret;
 
+		if (!timeo)
+			break;
 		release_sock(sk);
 		lock_sock(sk);
 
 		if (sk->sk_err || sk->sk_state == TCP_CLOSE ||
-		    (sk->sk_shutdown & RCV_SHUTDOWN) || !timeo ||
+		    (sk->sk_shutdown & RCV_SHUTDOWN) ||
 		    signal_pending(current))
 			break;
 	}
@@ -1193,7 +1195,7 @@ static inline struct sk_buff *tcp_recv_skb(struct sock *sk, u32 seq, u32 *off)
  *	  (although both would be easy to implement).
  */
 int tcp_read_sock(struct sock *sk, read_descriptor_t *desc,
-		  sk_read_actor_t recv_actor)
+		  sk_read_actor_t recv_actor, size_t tlen)
 {
 	struct sk_buff *skb;
 	struct tcp_sock *tp = tcp_sk(sk);
@@ -1209,6 +1211,8 @@ int tcp_read_sock(struct sock *sk, read_descriptor_t *desc,
 			size_t len;
 
 			len = skb->len - offset;
+			if (len > tlen)
+				len = tlen;
 			/* Stop reading if we hit a patch of urgent data */
 			if (tp->urg_data) {
 				u32 urg_offset = tp->urg_seq - seq;
@@ -1226,6 +1230,7 @@ int tcp_read_sock(struct sock *sk, read_descriptor_t *desc,
 				seq += used;
 				copied += used;
 				offset += used;
+				tlen -= used;
 			}
 			/*
 			 * If recv_actor drops the lock (e.g. TCP splice
@@ -1243,7 +1248,7 @@ int tcp_read_sock(struct sock *sk, read_descriptor_t *desc,
 			break;
 		}
 		sk_eat_skb(sk, skb, 0);
-		if (!desc->count)
+		if (!tlen)
 			break;
 	}
 	tp->copied_seq = seq;
diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c
index 5cbb404..75f8e83 100644
--- a/net/sunrpc/xprtsock.c
+++ b/net/sunrpc/xprtsock.c
@@ -1109,8 +1109,7 @@ static void xs_tcp_data_ready(struct sock *sk, int bytes)
 	/* We use rd_desc to pass struct xprt to xs_tcp_data_recv */
 	rd_desc.arg.data = xprt;
 	do {
-		rd_desc.count = 65536;
-		read = tcp_read_sock(sk, &rd_desc, xs_tcp_data_recv);
+		read = tcp_read_sock(sk, &rd_desc, xs_tcp_data_recv, 65536);
 	} while (read > 0);
 out:
 	read_unlock(&sk->sk_callback_lock);



  reply	other threads:[~2009-01-09 22:16 UTC|newest]

Thread overview: 190+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-01-08 17:30 [PATCH] tcp: splice as many packets as possible at once Willy Tarreau
2009-01-08 19:44 ` Jens Axboe
2009-01-08 22:03   ` Willy Tarreau
2009-01-08 21:50 ` Ben Mansell
2009-01-08 21:55   ` David Miller
2009-01-08 22:20     ` Willy Tarreau
2009-01-13 23:08       ` David Miller
2009-01-09  6:47     ` Eric Dumazet
2009-01-09  7:04       ` Willy Tarreau
2009-01-09  7:28         ` Eric Dumazet
2009-01-09  7:42           ` Willy Tarreau
2009-01-13 23:27           ` David Miller
2009-01-13 23:35             ` Eric Dumazet
2009-01-09 15:42       ` Eric Dumazet
2009-01-09 17:57         ` Eric Dumazet
2009-01-09 18:54         ` Willy Tarreau
2009-01-09 20:51           ` Eric Dumazet
2009-01-09 21:24             ` Willy Tarreau
2009-01-09 22:02               ` Eric Dumazet
2009-01-09 22:09                 ` Willy Tarreau
2009-01-09 22:07               ` Willy Tarreau
2009-01-09 22:12                 ` Eric Dumazet [this message]
2009-01-09 22:17                   ` Willy Tarreau
2009-01-09 22:42                     ` Evgeniy Polyakov
2009-01-09 22:50                       ` Willy Tarreau
2009-01-09 23:01                         ` Evgeniy Polyakov
2009-01-09 23:06                           ` Willy Tarreau
2009-01-10  7:40                       ` Eric Dumazet
2009-01-11 12:58                         ` Evgeniy Polyakov
2009-01-11 13:14                           ` Eric Dumazet
2009-01-11 13:35                             ` Evgeniy Polyakov
2009-01-11 16:00                               ` Eric Dumazet
2009-01-11 16:05                                 ` Evgeniy Polyakov
2009-01-14  0:07                                   ` David Miller
2009-01-14  0:13                                     ` Evgeniy Polyakov
2009-01-14  0:16                                       ` David Miller
2009-01-14  0:22                                         ` Evgeniy Polyakov
2009-01-14  0:37                                           ` David Miller
2009-01-14  3:51                                             ` Herbert Xu
2009-01-14  4:25                                               ` David Miller
2009-01-14  7:27                                               ` David Miller
2009-01-14  8:26                                                 ` Herbert Xu
2009-01-14  8:53                                                   ` Jarek Poplawski
2009-01-14  9:29                                                     ` David Miller
2009-01-14  9:42                                                       ` Jarek Poplawski
2009-01-14 10:06                                                         ` David Miller
2009-01-14 10:47                                                           ` Jarek Poplawski
2009-01-14 11:29                                                             ` Herbert Xu
2009-01-14 11:40                                                               ` Jarek Poplawski
2009-01-14 11:45                                                                 ` Jarek Poplawski
2009-01-14  9:54                                                       ` Jarek Poplawski
2009-01-14 10:01                                                         ` Willy Tarreau
2009-01-14 12:06                                                         ` Jarek Poplawski
2009-01-14 12:15                                                         ` Jarek Poplawski
2009-01-14 11:28                                                       ` Herbert Xu
2009-01-15 23:03                                                       ` Willy Tarreau
2009-01-15 23:19                                                         ` David Miller
2009-01-15 23:19                                                         ` Herbert Xu
2009-01-15 23:26                                                           ` David Miller
2009-01-15 23:32                                                             ` Herbert Xu
2009-01-15 23:34                                                               ` David Miller
2009-01-15 23:42                                                                 ` Willy Tarreau
2009-01-15 23:44                                                                   ` Willy Tarreau
2009-01-15 23:54                                                                     ` David Miller
2009-01-19  0:42                                                                       ` Willy Tarreau
2009-01-19  3:08                                                                         ` Herbert Xu
2009-01-19  3:27                                                                           ` David Miller
2009-01-19  6:14                                                                             ` Willy Tarreau
2009-01-19  6:19                                                                               ` David Miller
2009-01-19  6:45                                                                                 ` Willy Tarreau
2009-01-19 10:19                                                                                 ` Herbert Xu
2009-01-19 20:59                                                                                   ` David Miller
2009-01-19 21:24                                                                                     ` Herbert Xu
2009-01-25 21:03                                                                                     ` Willy Tarreau
2009-01-26  7:59                                                                                       ` Jarek Poplawski
2009-01-26  8:12                                                                                         ` Willy Tarreau
2009-01-19  8:40                                                                               ` Jarek Poplawski
2009-01-19  3:28                                                                         ` David Miller
2009-01-19  6:11                                                                           ` Willy Tarreau
2009-01-24 21:23                                                                           ` Willy Tarreau
2009-01-20 12:01                                                                         ` Ben Mansell
2009-01-20 12:11                                                                           ` Evgeniy Polyakov
2009-01-20 13:43                                                                             ` Ben Mansell
2009-01-20 14:06                                                                               ` Jarek Poplawski
2009-01-16  6:51                                                                     ` Jarek Poplawski
2009-01-19  6:08                                                                       ` David Miller
2009-01-19  6:16                                                                 ` David Miller
2009-01-19 10:20                                                                   ` Herbert Xu
2009-01-20  8:37                                                             ` Jarek Poplawski
2009-01-20  9:33                                                               ` [PATCH v2] " Jarek Poplawski
2009-01-20 10:00                                                                 ` Evgeniy Polyakov
2009-01-20 10:20                                                                   ` Jarek Poplawski
2009-01-20 10:31                                                                     ` Evgeniy Polyakov
2009-01-20 11:01                                                                       ` Jarek Poplawski
2009-01-20 17:16                                                                         ` David Miller
2009-01-21  9:54                                                                           ` Jarek Poplawski
2009-01-22  9:04                                                                           ` [PATCH v3] " Jarek Poplawski
2009-01-26  5:22                                                                             ` David Miller
2009-01-27  7:11                                                                               ` Herbert Xu
2009-01-27  7:54                                                                                 ` Jarek Poplawski
2009-01-27 10:09                                                                                   ` Herbert Xu
2009-01-27 10:35                                                                                     ` Jarek Poplawski
2009-01-27 10:57                                                                                       ` Jarek Poplawski
2009-01-27 11:48                                                                                       ` Herbert Xu
2009-01-27 12:16                                                                                         ` Jarek Poplawski
2009-01-27 12:31                                                                                           ` Jarek Poplawski
2009-01-27 17:06                                                                                             ` David Miller
2009-01-28  8:10                                                                                               ` Jarek Poplawski
2009-02-01  8:41                                                                                 ` David Miller
2009-01-26  8:20                                                                       ` [PATCH v2] " Jarek Poplawski
2009-01-26 21:21                                                                         ` Evgeniy Polyakov
2009-01-27  6:10                                                                           ` David Miller
2009-01-27  7:40                                                                             ` Jarek Poplawski
2009-01-30 21:42                                                                               ` David Miller
2009-01-30 21:59                                                                                 ` Willy Tarreau
2009-01-30 22:03                                                                                   ` David Miller
2009-01-30 22:13                                                                                     ` Willy Tarreau
2009-01-30 22:15                                                                                       ` David Miller
2009-01-30 22:16                                                                                 ` Herbert Xu
2009-02-02  8:08                                                                                   ` Jarek Poplawski
2009-02-02  8:18                                                                                     ` David Miller
2009-02-02  8:43                                                                                       ` Jarek Poplawski
2009-02-03  7:50                                                                                         ` David Miller
2009-02-03  9:41                                                                                           ` Jarek Poplawski
2009-02-03 11:10                                                                                             ` Evgeniy Polyakov
2009-02-03 11:24                                                                                               ` Herbert Xu
2009-02-03 11:49                                                                                                 ` Evgeniy Polyakov
2009-02-03 11:53                                                                                                   ` Herbert Xu
2009-02-03 12:07                                                                                                     ` Evgeniy Polyakov
2009-02-03 12:12                                                                                                       ` Herbert Xu
2009-02-03 12:18                                                                                                         ` Evgeniy Polyakov
2009-02-03 12:25                                                                                                           ` Willy Tarreau
2009-02-03 12:28                                                                                                             ` Herbert Xu
2009-02-04  0:47                                                                                                             ` David Miller
2009-02-04  6:19                                                                                                               ` Willy Tarreau
2009-02-04  8:12                                                                                                                 ` Evgeniy Polyakov
2009-02-04  8:54                                                                                                                   ` Willy Tarreau
2009-02-04  8:59                                                                                                                     ` Herbert Xu
2009-02-04  9:01                                                                                                                       ` David Miller
2009-02-04  9:12                                                                                                                         ` Willy Tarreau
2009-02-04  9:15                                                                                                                           ` David Miller
2009-02-04 19:19                                                                                                                           ` Roland Dreier
2009-02-04 19:28                                                                                                                             ` Willy Tarreau
2009-02-04 19:48                                                                                                                               ` Jarek Poplawski
2009-02-05  8:32                                                                                                                           ` Bill Fink
2009-02-04  9:12                                                                                                                 ` David Miller
2009-02-03 12:27                                                                                                           ` Herbert Xu
2009-02-03 13:05                                                                                                   ` david
2009-02-03 12:12                                                                                                     ` Evgeniy Polyakov
2009-02-03 12:18                                                                                                       ` Herbert Xu
2009-02-03 12:30                                                                                                         ` Evgeniy Polyakov
2009-02-03 12:33                                                                                                           ` Herbert Xu
2009-02-03 12:33                                                                                                         ` Nick Piggin
2009-02-04  0:46                                                                                                 ` David Miller
2009-02-04  9:41                                                                                                   ` Benny Amorsen
2009-02-04 12:01                                                                                                     ` Herbert Xu
2009-02-03 12:36                                                                                               ` Jarek Poplawski
2009-02-03 13:06                                                                                                 ` Evgeniy Polyakov
2009-02-03 13:25                                                                                                   ` Jarek Poplawski
2009-02-03 14:20                                                                                                     ` Evgeniy Polyakov
2009-02-04  0:46                                                                                               ` David Miller
2009-02-04  8:08                                                                                                 ` Evgeniy Polyakov
2009-02-04  9:23                                                                                                   ` Nick Piggin
2009-02-04  7:56                                                                                             ` Jarek Poplawski
2009-02-06  7:52                                                                                             ` David Miller
2009-02-06  8:09                                                                                               ` Herbert Xu
2009-02-06  9:10                                                                                               ` Jarek Poplawski
2009-02-06  9:17                                                                                                 ` David Miller
2009-02-06  9:42                                                                                                   ` Jarek Poplawski
2009-02-06  9:49                                                                                                     ` David Miller
2009-02-06  9:23                                                                                                 ` Herbert Xu
2009-02-06  9:51                                                                                                   ` Jarek Poplawski
2009-02-06 10:28                                                                                                     ` Herbert Xu
2009-02-06 10:58                                                                                                       ` Jarek Poplawski
2009-02-06 11:10                                                                                                         ` Willy Tarreau
2009-02-06 11:47                                                                                                           ` Jarek Poplawski
2009-02-06 18:59                                                                                               ` Jarek Poplawski
2009-02-03 11:38                                                                                 ` Nick Piggin
2009-01-27 18:42                                                                             ` David Miller
2009-01-15 23:32                                                           ` [PATCH] " Willy Tarreau
2009-01-15 23:35                                                             ` David Miller
2009-01-14  0:51                                         ` Herbert Xu
2009-01-14  1:24                                           ` David Miller
2009-01-09 22:45                     ` Eric Dumazet
2009-01-09 22:53                       ` Willy Tarreau
2009-01-09 23:34                         ` Eric Dumazet
2009-01-13  5:45                           ` David Miller
2009-01-14  0:05                           ` David Miller
2009-01-13 23:31         ` David Miller
2009-01-13 23:26       ` David Miller

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4967CBB9.1060403@cosmosbay.com \
    --to=dada1@cosmosbay.com \
    --cc=ben@zeus.com \
    --cc=davem@davemloft.net \
    --cc=jarkao2@gmail.com \
    --cc=jens.axboe@oracle.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@elte.hu \
    --cc=netdev@vger.kernel.org \
    --cc=w@1wt.eu \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.