From: Arjun Roy <arjunroy.kdev@gmail.com>
To: davem@davemloft.net, netdev@vger.kernel.org
Cc: arjunroy@google.com, edumazet@google.com, soheil@google.com
Subject: [net-next 4/8] tcp: Refactor frag-is-remappable test for recv zerocopy.
Date: Thu, 12 Nov 2020 11:02:01 -0800 [thread overview]
Message-ID: <20201112190205.633640-5-arjunroy.kdev@gmail.com> (raw)
In-Reply-To: <20201112190205.633640-1-arjunroy.kdev@gmail.com>
From: Arjun Roy <arjunroy@google.com>
Refactor frag-is-remappable test for tcp receive zerocopy. This is
part of a patch set that introduces short-circuited hybrid copies
for small receive operations, which results in roughly 33% fewer
syscalls for small RPC scenarios.
Signed-off-by: Arjun Roy <arjunroy@google.com>
Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: Soheil Hassas Yeganeh <soheil@google.com>
---
net/ipv4/tcp.c | 34 ++++++++++++++++++++++++++--------
1 file changed, 26 insertions(+), 8 deletions(-)
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c
index ab19d0d00db1..f3bd606a678d 100644
--- a/net/ipv4/tcp.c
+++ b/net/ipv4/tcp.c
@@ -1765,6 +1765,26 @@ static skb_frag_t *skb_advance_to_frag(struct sk_buff *skb, u32 offset_skb,
return frag;
}
+static bool can_map_frag(const skb_frag_t *frag)
+{
+ return skb_frag_size(frag) == PAGE_SIZE && !skb_frag_off(frag);
+}
+
+static int find_next_mappable_frag(const skb_frag_t *frag,
+ int remaining_in_skb)
+{
+ int offset = 0;
+
+ if (likely(can_map_frag(frag)))
+ return 0;
+
+ while (offset < remaining_in_skb && !can_map_frag(frag)) {
+ offset += skb_frag_size(frag);
+ ++frag;
+ }
+ return offset;
+}
+
static int tcp_copy_straggler_data(struct tcp_zerocopy_receive *zc,
struct sk_buff *skb, u32 copylen,
u32 *offset, u32 *seq)
@@ -1886,6 +1906,8 @@ static int tcp_zerocopy_receive(struct sock *sk,
ret = 0;
curr_addr = address;
while (length + PAGE_SIZE <= zc->length) {
+ int mappable_offset;
+
if (zc->recv_skip_hint < PAGE_SIZE) {
u32 offset_frag;
@@ -1913,15 +1935,11 @@ static int tcp_zerocopy_receive(struct sock *sk,
if (!frags || offset_frag)
break;
}
- if (skb_frag_size(frags) != PAGE_SIZE || skb_frag_off(frags)) {
- int remaining = zc->recv_skip_hint;
- while (remaining && (skb_frag_size(frags) != PAGE_SIZE ||
- skb_frag_off(frags))) {
- remaining -= skb_frag_size(frags);
- frags++;
- }
- zc->recv_skip_hint -= remaining;
+ mappable_offset = find_next_mappable_frag(frags,
+ zc->recv_skip_hint);
+ if (mappable_offset) {
+ zc->recv_skip_hint = mappable_offset;
break;
}
pages[pg_idx] = skb_frag_page(frags);
--
2.29.2.222.g5d2a92d10f8-goog
next prev parent reply other threads:[~2020-11-12 19:03 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-11-12 19:01 [net-next 0/8] Perf. optimizations for TCP Recv. Zerocopy Arjun Roy
2020-11-12 19:01 ` [net-next 1/8] tcp: Copy straggler unaligned data for TCP Rx. zerocopy Arjun Roy
2020-11-13 2:36 ` kernel test robot
2020-11-13 2:36 ` kernel test robot
2020-11-12 19:01 ` [net-next 2/8] tcp: Introduce tcp_recvmsg_locked() Arjun Roy
2020-11-12 19:02 ` [net-next 3/8] tcp: Refactor skb frag fast-forward op for recv zerocopy Arjun Roy
2020-11-12 19:02 ` Arjun Roy [this message]
2020-11-12 19:02 ` [net-next 5/8] tcp: Fast return if inq < PAGE_SIZE " Arjun Roy
2020-11-12 19:02 ` [net-next 6/8] tcp: Introduce short-circuit small reads " Arjun Roy
2020-11-12 19:02 ` [net-next 7/8] tcp: Set zerocopy hint when data is copied Arjun Roy
2020-11-12 19:02 ` [net-next 8/8] tcp: Defer vm zap unless actually needed for recv zerocopy Arjun Roy
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=20201112190205.633640-5-arjunroy.kdev@gmail.com \
--to=arjunroy.kdev@gmail.com \
--cc=arjunroy@google.com \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=netdev@vger.kernel.org \
--cc=soheil@google.com \
/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.