Commit 5c1ebbfa authored by Brian Vazquez's avatar Brian Vazquez Committed by Paolo Abeni

net: use indirect calls helpers for sk_exit_memory_pressure()

Florian reported a regression and sent a patch with the following
changelog:

<quote>
 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.
</quote>

It seems we forgot to upstream this indirect call mitigation we
had for years, lets do this instead.

[edumazet] - It seems we forgot to upstream this indirect call
             mitigation we had for years, let's do this instead.
           - Changed to INDIRECT_CALL_INET_1() to avoid bots reports.

Fixes: 4890b686 ("net: keep sk->sk_forward_alloc as small as possible")
Reported-by: default avatarFlorian Westphal <fw@strlen.de>
Link: https://lore.kernel.org/netdev/20230227152741.4a53634b@kernel.org/T/Signed-off-by: default avatarBrian Vazquez <brianvv@google.com>
Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
Link: https://lore.kernel.org/r/20230301133247.2346111-1-edumazet@google.comSigned-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parent 044c8bf7
...@@ -2818,7 +2818,8 @@ static void sk_enter_memory_pressure(struct sock *sk) ...@@ -2818,7 +2818,8 @@ static void sk_enter_memory_pressure(struct sock *sk)
static void sk_leave_memory_pressure(struct sock *sk) static void sk_leave_memory_pressure(struct sock *sk)
{ {
if (sk->sk_prot->leave_memory_pressure) { if (sk->sk_prot->leave_memory_pressure) {
sk->sk_prot->leave_memory_pressure(sk); INDIRECT_CALL_INET_1(sk->sk_prot->leave_memory_pressure,
tcp_leave_memory_pressure, sk);
} else { } else {
unsigned long *memory_pressure = sk->sk_prot->memory_pressure; unsigned long *memory_pressure = sk->sk_prot->memory_pressure;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment