From: Florian Westphal <fw@strlen.de>
To: netdev@vger.kernel.org
Cc: davem@davemloft.net, edumazet@google.com, kuba@kernel.org,
pabeni@redhat.com, shakeelb@google.com, soheil@google.com,
Florian Westphal <fw@strlen.de>
Subject: [PATCH net] net: avoid indirect memory pressure calls
Date: Fri, 24 Feb 2023 19:46:06 +0100 [thread overview]
Message-ID: <20230224184606.7101-1-fw@strlen.de> (raw)
There is a noticeable tcp performance regression (loopback or cross-netns),
seen with iperf3 -Z (sendfile mode) when generic retpolines are needed.
With SK_RECLAIM_THRESHOLD checks gone number of calls to enter/leave
memory pressure happen much more often. For TCP indirect calls are
used.
We can't remove the if-set-return short-circuit check in
tcp_enter_memory_pressure because there are callers other than
sk_enter_memory_pressure. Doing a check in the sk wrapper too
reduces the indirect calls enough to recover some performance.
Before,
0.00-60.00 sec 322 GBytes 46.1 Gbits/sec receiver
After:
0.00-60.04 sec 359 GBytes 51.4 Gbits/sec receiver
"iperf3 -c $peer -t 60 -Z -f g", connected via veth in another netns.
Fixes: 4890b686f408 ("net: keep sk->sk_forward_alloc as small as possible")
Signed-off-by: Florian Westphal <fw@strlen.de>
---
net/core/sock.c | 22 +++++++++++++---------
1 file changed, 13 insertions(+), 9 deletions(-)
diff --git a/net/core/sock.c b/net/core/sock.c
index 341c565dbc26..45d247112aa5 100644
--- a/net/core/sock.c
+++ b/net/core/sock.c
@@ -2809,22 +2809,26 @@ EXPORT_SYMBOL(sock_cmsg_send);
static void sk_enter_memory_pressure(struct sock *sk)
{
- if (!sk->sk_prot->enter_memory_pressure)
+ unsigned long *memory_pressure = sk->sk_prot->memory_pressure;
+
+ if (!memory_pressure || READ_ONCE(*memory_pressure))
return;
- sk->sk_prot->enter_memory_pressure(sk);
+ if (sk->sk_prot->enter_memory_pressure)
+ sk->sk_prot->enter_memory_pressure(sk);
}
static void sk_leave_memory_pressure(struct sock *sk)
{
- if (sk->sk_prot->leave_memory_pressure) {
- sk->sk_prot->leave_memory_pressure(sk);
- } else {
- unsigned long *memory_pressure = sk->sk_prot->memory_pressure;
+ unsigned long *memory_pressure = sk->sk_prot->memory_pressure;
- if (memory_pressure && READ_ONCE(*memory_pressure))
- WRITE_ONCE(*memory_pressure, 0);
- }
+ if (!memory_pressure || READ_ONCE(*memory_pressure) == 0)
+ return;
+
+ if (sk->sk_prot->leave_memory_pressure)
+ sk->sk_prot->leave_memory_pressure(sk);
+ else
+ WRITE_ONCE(*memory_pressure, 0);
}
DEFINE_STATIC_KEY_FALSE(net_high_order_alloc_disable_key);
--
2.39.2
next reply other threads:[~2023-02-24 18:49 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-02-24 18:46 Florian Westphal [this message]
2023-02-27 23:27 ` [PATCH net] net: avoid indirect memory pressure calls Jakub Kicinski
2023-02-28 16:28 ` Alexander Lobakin
2023-02-28 16:34 ` Florian Westphal
2023-02-28 16:35 ` Eric Dumazet
2023-02-28 16:44 ` Eric Dumazet
2023-02-28 17:42 ` Eric Dumazet
2023-03-01 12:31 ` Florian Westphal
2023-03-01 12:51 ` Eric Dumazet
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=20230224184606.7101-1-fw@strlen.de \
--to=fw@strlen.de \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=kuba@kernel.org \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=shakeelb@google.com \
--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.