* [PATCH net-next] tcp: tcp_sendmsg() page recycling
@ 2011-12-04 17:05 Eric Dumazet
2011-12-04 17:20 ` Joe Perches
` (2 more replies)
0 siblings, 3 replies; 9+ messages in thread
From: Eric Dumazet @ 2011-12-04 17:05 UTC (permalink / raw)
To: David Miller; +Cc: netdev
If our TCP_PAGE(sk) is not shared (page_count() == 1), we can set page
offset to 0.
This permits better filling of the pages on small to medium tcp writes.
"tbench 16" results on my dev server (2x4x2 machine) :
Before : 3072 MB/s
After : 3146 MB/s (2.4 % gain)
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
---
net/ipv4/tcp.c | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c
index 45156be..a09fe25 100644
--- a/net/ipv4/tcp.c
+++ b/net/ipv4/tcp.c
@@ -1009,7 +1009,12 @@ new_segment:
int merge = 0;
int i = skb_shinfo(skb)->nr_frags;
struct page *page = TCP_PAGE(sk);
- int off = TCP_OFF(sk);
+ int off;
+
+ if (page && page_count(page) == 1)
+ TCP_OFF(sk) = 0;
+
+ off = TCP_OFF(sk);
if (skb_can_coalesce(skb, i, page, off) &&
off != PAGE_SIZE) {
^ permalink raw reply related [flat|nested] 9+ messages in thread* Re: [PATCH net-next] tcp: tcp_sendmsg() page recycling 2011-12-04 17:05 [PATCH net-next] tcp: tcp_sendmsg() page recycling Eric Dumazet @ 2011-12-04 17:20 ` Joe Perches 2011-12-04 18:27 ` Nicolas de Pesloüan 2011-12-05 11:07 ` [PATCH net-next] tcp: remove TCP_OFF and TCP_PAGE macros Eric Dumazet 2011-12-04 17:36 ` [PATCH net-next] tcp: tcp_sendmsg() page recycling Eric Dumazet 2011-12-04 18:21 ` David Miller 2 siblings, 2 replies; 9+ messages in thread From: Joe Perches @ 2011-12-04 17:20 UTC (permalink / raw) To: Eric Dumazet; +Cc: David Miller, netdev On Sun, 2011-12-04 at 18:05 +0100, Eric Dumazet wrote: > If our TCP_PAGE(sk) is not shared (page_count() == 1), we can set page > offset to 0. [] > diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c [] > @@ -1009,7 +1009,12 @@ new_segment: > int merge = 0; > int i = skb_shinfo(skb)->nr_frags; > struct page *page = TCP_PAGE(sk); > - int off = TCP_OFF(sk); > + int off; > + > + if (page && page_count(page) == 1) > + TCP_OFF(sk) = 0; > + > + off = TCP_OFF(sk); This might be clearer and take one less indirection as if (page && page_count(page) == 1) { TCP_OFF(sk) = 0; off = 0; } else { off = 0; } or maybe if (page && page_count(page) == 1) off = TCP_OFF(sk) = 0; else off = 0; And maybe the TCP_OFF and TCP_PAGE macros should be removed. ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH net-next] tcp: tcp_sendmsg() page recycling 2011-12-04 17:20 ` Joe Perches @ 2011-12-04 18:27 ` Nicolas de Pesloüan 2011-12-04 18:54 ` Joe Perches 2011-12-05 11:07 ` [PATCH net-next] tcp: remove TCP_OFF and TCP_PAGE macros Eric Dumazet 1 sibling, 1 reply; 9+ messages in thread From: Nicolas de Pesloüan @ 2011-12-04 18:27 UTC (permalink / raw) To: Joe Perches; +Cc: Eric Dumazet, David Miller, netdev Le 04/12/2011 18:20, Joe Perches a écrit : > On Sun, 2011-12-04 at 18:05 +0100, Eric Dumazet wrote: >> If our TCP_PAGE(sk) is not shared (page_count() == 1), we can set page >> offset to 0. > [] >> diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c > [] >> @@ -1009,7 +1009,12 @@ new_segment: >> int merge = 0; >> int i = skb_shinfo(skb)->nr_frags; >> struct page *page = TCP_PAGE(sk); >> - int off = TCP_OFF(sk); >> + int off; >> + >> + if (page&& page_count(page) == 1) >> + TCP_OFF(sk) = 0; >> + >> + off = TCP_OFF(sk); > > This might be clearer and take one less indirection as > > if (page&& page_count(page) == 1) { > TCP_OFF(sk) = 0; > off = 0; > } else { > off = 0; > } > > or maybe > > if (page&& page_count(page) == 1) > off = TCP_OFF(sk) = 0; > else > off = 0; Well, those two fragments don't look equivalent to the original one, unless TCP_OFF(sk) happens to be 0 before the test. But if this is true, then the whole thing seems useless. Do I miss something? For as far as I understand, the following should be equivalent to Eric's original, but I don't consider it better than the original. if (page&& page_count(page) == 1) off = TCP_OFF(sk) = 0; else off = TCP_OFF(sk); Nicolas. ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH net-next] tcp: tcp_sendmsg() page recycling 2011-12-04 18:27 ` Nicolas de Pesloüan @ 2011-12-04 18:54 ` Joe Perches 0 siblings, 0 replies; 9+ messages in thread From: Joe Perches @ 2011-12-04 18:54 UTC (permalink / raw) To: Nicolas de Pesloüan; +Cc: Eric Dumazet, netdev, David Miller On Sun, 2011-12-04 at 19:27 +0100, Nicolas de Pesloüan wrote: > Well, those two fragments don't look equivalent to the original one, unless TCP_OFF(sk) happens to > be 0 before the test. But if this is true, then the whole thing seems useless. Do I miss something? Nope, you're completely correct. It's just me not typing correctly. ^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH net-next] tcp: remove TCP_OFF and TCP_PAGE macros 2011-12-04 17:20 ` Joe Perches 2011-12-04 18:27 ` Nicolas de Pesloüan @ 2011-12-05 11:07 ` Eric Dumazet 2011-12-05 23:47 ` David Miller 1 sibling, 1 reply; 9+ messages in thread From: Eric Dumazet @ 2011-12-05 11:07 UTC (permalink / raw) To: Joe Perches; +Cc: David Miller, netdev Le dimanche 04 décembre 2011 à 09:20 -0800, Joe Perches a écrit : > And maybe the TCP_OFF and TCP_PAGE macros should be removed. > Agreed, thanks. [PATCH net-next] tcp: remove TCP_OFF and TCP_PAGE macros As mentioned by Joe Perches, TCP_OFF() and TCP_PAGE() macros are useless. Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com> --- net/ipv4/tcp.c | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index a09fe25..43dfccc 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c @@ -888,9 +888,6 @@ int tcp_sendpage(struct sock *sk, struct page *page, int offset, } EXPORT_SYMBOL(tcp_sendpage); -#define TCP_PAGE(sk) (sk->sk_sndmsg_page) -#define TCP_OFF(sk) (sk->sk_sndmsg_off) - static inline int select_size(const struct sock *sk, bool sg) { const struct tcp_sock *tp = tcp_sk(sk); @@ -1008,13 +1005,13 @@ new_segment: } else { int merge = 0; int i = skb_shinfo(skb)->nr_frags; - struct page *page = TCP_PAGE(sk); + struct page *page = sk->sk_sndmsg_page; int off; if (page && page_count(page) == 1) - TCP_OFF(sk) = 0; + sk->sk_sndmsg_off = 0; - off = TCP_OFF(sk); + off = sk->sk_sndmsg_off; if (skb_can_coalesce(skb, i, page, off) && off != PAGE_SIZE) { @@ -1031,7 +1028,7 @@ new_segment: } else if (page) { if (off == PAGE_SIZE) { put_page(page); - TCP_PAGE(sk) = page = NULL; + sk->sk_sndmsg_page = page = NULL; off = 0; } } else @@ -1057,9 +1054,9 @@ new_segment: /* If this page was new, give it to the * socket so it does not get leaked. */ - if (!TCP_PAGE(sk)) { - TCP_PAGE(sk) = page; - TCP_OFF(sk) = 0; + if (!sk->sk_sndmsg_page) { + sk->sk_sndmsg_page = page; + sk->sk_sndmsg_off = 0; } goto do_error; } @@ -1069,15 +1066,15 @@ new_segment: skb_frag_size_add(&skb_shinfo(skb)->frags[i - 1], copy); } else { skb_fill_page_desc(skb, i, page, off, copy); - if (TCP_PAGE(sk)) { + if (sk->sk_sndmsg_page) { get_page(page); } else if (off + copy < PAGE_SIZE) { get_page(page); - TCP_PAGE(sk) = page; + sk->sk_sndmsg_page = page; } } - TCP_OFF(sk) = off + copy; + sk->sk_sndmsg_off = off + copy; } if (!copied) ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH net-next] tcp: remove TCP_OFF and TCP_PAGE macros 2011-12-05 11:07 ` [PATCH net-next] tcp: remove TCP_OFF and TCP_PAGE macros Eric Dumazet @ 2011-12-05 23:47 ` David Miller 0 siblings, 0 replies; 9+ messages in thread From: David Miller @ 2011-12-05 23:47 UTC (permalink / raw) To: eric.dumazet; +Cc: joe, netdev From: Eric Dumazet <eric.dumazet@gmail.com> Date: Mon, 05 Dec 2011 12:07:15 +0100 > Le dimanche 04 décembre 2011 à 09:20 -0800, Joe Perches a écrit : >> And maybe the TCP_OFF and TCP_PAGE macros should be removed. >> > > Agreed, thanks. > > [PATCH net-next] tcp: remove TCP_OFF and TCP_PAGE macros > > As mentioned by Joe Perches, TCP_OFF() and TCP_PAGE() macros are > useless. > > Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com> Applied. ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH net-next] tcp: tcp_sendmsg() page recycling 2011-12-04 17:05 [PATCH net-next] tcp: tcp_sendmsg() page recycling Eric Dumazet 2011-12-04 17:20 ` Joe Perches @ 2011-12-04 17:36 ` Eric Dumazet 2011-12-04 18:14 ` David Miller 2011-12-04 18:21 ` David Miller 2 siblings, 1 reply; 9+ messages in thread From: Eric Dumazet @ 2011-12-04 17:36 UTC (permalink / raw) To: David Miller; +Cc: netdev Le dimanche 04 décembre 2011 à 18:05 +0100, Eric Dumazet a écrit : > If our TCP_PAGE(sk) is not shared (page_count() == 1), we can set page > offset to 0. > > This permits better filling of the pages on small to medium tcp writes. > > "tbench 16" results on my dev server (2x4x2 machine) : > > Before : 3072 MB/s > After : 3146 MB/s (2.4 % gain) By the way current linux tree on the same machine gets 2957 MB/s So the combination of select_size() patch and this one gives a 6.4 % gain. Definitely worth the pain, isnt it ? ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH net-next] tcp: tcp_sendmsg() page recycling 2011-12-04 17:36 ` [PATCH net-next] tcp: tcp_sendmsg() page recycling Eric Dumazet @ 2011-12-04 18:14 ` David Miller 0 siblings, 0 replies; 9+ messages in thread From: David Miller @ 2011-12-04 18:14 UTC (permalink / raw) To: eric.dumazet; +Cc: netdev From: Eric Dumazet <eric.dumazet@gmail.com> Date: Sun, 04 Dec 2011 18:36:52 +0100 > Definitely worth the pain, isnt it ? As long as such gains aren't lost in the noise when talking over real devices. I'm not a big fan of tbench over loopback numbers, frankly :-) ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH net-next] tcp: tcp_sendmsg() page recycling 2011-12-04 17:05 [PATCH net-next] tcp: tcp_sendmsg() page recycling Eric Dumazet 2011-12-04 17:20 ` Joe Perches 2011-12-04 17:36 ` [PATCH net-next] tcp: tcp_sendmsg() page recycling Eric Dumazet @ 2011-12-04 18:21 ` David Miller 2 siblings, 0 replies; 9+ messages in thread From: David Miller @ 2011-12-04 18:21 UTC (permalink / raw) To: eric.dumazet; +Cc: netdev From: Eric Dumazet <eric.dumazet@gmail.com> Date: Sun, 04 Dec 2011 18:05:17 +0100 > If our TCP_PAGE(sk) is not shared (page_count() == 1), we can set page > offset to 0. > > This permits better filling of the pages on small to medium tcp writes. > > "tbench 16" results on my dev server (2x4x2 machine) : > > Before : 3072 MB/s > After : 3146 MB/s (2.4 % gain) > > Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com> Applied. ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2011-12-05 23:47 UTC | newest] Thread overview: 9+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2011-12-04 17:05 [PATCH net-next] tcp: tcp_sendmsg() page recycling Eric Dumazet 2011-12-04 17:20 ` Joe Perches 2011-12-04 18:27 ` Nicolas de Pesloüan 2011-12-04 18:54 ` Joe Perches 2011-12-05 11:07 ` [PATCH net-next] tcp: remove TCP_OFF and TCP_PAGE macros Eric Dumazet 2011-12-05 23:47 ` David Miller 2011-12-04 17:36 ` [PATCH net-next] tcp: tcp_sendmsg() page recycling Eric Dumazet 2011-12-04 18:14 ` David Miller 2011-12-04 18:21 ` David Miller
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).