File 2861-erts-New-default-values-for-the-buffer-option-a.patch of Package erlang
From 02101c2c0b8c0cabc5b178a910be9139161c8dc9 Mon Sep 17 00:00:00 2001
From: Micael Karlberg <bmk@erlang.org>
Date: Fri, 4 Apr 2025 19:12:17 +0200
Subject: [PATCH 1/3] [erts] New default values for the 'buffer' option(a)
The socket option(s) 'buffer' and 'recbuf' have both a
new default value; 9216.
OTP-19576
---
erts/emulator/drivers/common/inet_drv.c | 85 +++++++++++++++++++++----
1 file changed, 71 insertions(+), 14 deletions(-)
diff --git a/erts/emulator/drivers/common/inet_drv.c b/erts/emulator/drivers/common/inet_drv.c
index e301e1da53..b7aef9ab75 100644
--- a/erts/emulator/drivers/common/inet_drv.c
+++ b/erts/emulator/drivers/common/inet_drv.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1997-2024. All Rights Reserved.
+ * Copyright Ericsson AB 1997-2025. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -1032,8 +1032,19 @@ static size_t my_strnlen(const char *s, size_t maxlen)
#define INET_MAX_OPT_BUFFER (64*1024)
-#define INET_DEF_BUFFER 1460 /* default buffer size */
-#define INET_MIN_BUFFER 1 /* internal min buffer */
+/* Jumbo Frames size(s) */
+#if !defined(INET_BUFFER_TCP_DEFAULT)
+#define INET_BUFFER_TCP_DEFAULT 9216
+#endif
+#if !defined(INET_BUFFER_UDP_DEFAULT)
+#define INET_BUFFER_UDP_DEFAULT 9216
+#endif
+#if !defined(INET_BUFFER_SCTP_DEFAULT)
+#define INET_BUFFER_SCTP_DEFAULT 9216
+#endif
+#define INET_BUFFER_MIN 1
+#define INET_UDP_THEORETICAL_MAX_MTU (1 << 16)
+
#define INET_HIGH_WATERMARK (1024*8) /* 8k pending high => busy */
#define INET_LOW_WATERMARK (1024*4) /* 4k pending => allow more */
@@ -1877,7 +1888,13 @@ static void end_caller_ref(CallerRef *cref_p) {
#else
# define IS_SCTP(desc) 0
#endif
-# define ANC_BUFF_SIZE INET_DEF_BUFFER/2 /* XXX: not very good... */
+/*
+ * Can we "calculate" this dynamically?
+ * On linux: sysctl net.core.optmem_max
+ * This is better than the previous value which was 1460 / 2.
+ */
+#define ANC_BUFF_SIZE 1024
+
#ifdef HAVE_UDP
@@ -6904,7 +6921,7 @@ static int inet_set_opts(inet_descriptor* desc, char* ptr, int len)
("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
"inet_set_opts(buffer) -> %d\r\n",
__LINE__, desc->s, driver_caller(desc->port), ival) );
- if (ival < INET_MIN_BUFFER) ival = INET_MIN_BUFFER;
+ if (ival < INET_BUFFER_MIN) ival = INET_BUFFER_MIN;
desc->bufsz = ival;
desc->flags |= INET_FLG_BUFFER_SET;
continue;
@@ -7268,14 +7285,39 @@ static int inet_set_opts(inet_descriptor* desc, char* ptr, int len)
"inet_set_opts(rcvbuf) -> %d\r\n",
__LINE__, desc->s, driver_caller(desc->port), ival) );
if (!(desc->flags & INET_FLG_BUFFER_SET)) {
- /* make sure we have desc->bufsz >= SO_RCVBUF */
- if (ival > (1 << 16) && desc->stype == SOCK_DGRAM && !IS_SCTP(desc))
+
+ /* BUFFER has not previously been explicitly set.
+ * Make sure we have desc->bufsz >= SO_RCVBUF,
+ * except if rcvbuf is larger than max when type = DGRAM.
+ */
+
+ if ((ival > INET_UDP_THEORETICAL_MAX_MTU) &&
+ (desc->stype == SOCK_DGRAM) &&
+ !IS_SCTP(desc)) {
+
/* For UDP we don't want to automatically
- set the buffer size to be larger than
- the theoretical max MTU */
- desc->bufsz = 1 << 16;
- else if (ival > desc->bufsz)
+ * set the buffer size to be larger than
+ * the theoretical max MTU. */
+
+ DDBG(desc,
+ ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+ "inet_set_opts(rcvbuf) -> "
+ "force update of 'buffer' to max-mtu (%d)\r\n",
+ __LINE__, desc->s, driver_caller(desc->port),
+ INET_UDP_THEORETICAL_MAX_MTU) );
+
+ desc->bufsz = INET_UDP_THEORETICAL_MAX_MTU;
+
+ } else if (ival > desc->bufsz) {
+
+ DDBG(desc,
+ ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+ "inet_set_opts(rcvbuf) -> "
+ "force update of 'buffer'\r\n",
+ __LINE__, desc->s, driver_caller(desc->port)) );
+
desc->bufsz = ival;
+ }
}
break;
@@ -7999,8 +8041,8 @@ static int sctp_set_opts(inet_descriptor* desc, char* ptr, int len)
desc->bufsz = ival;
- if (desc->bufsz < INET_MIN_BUFFER)
- desc->bufsz = INET_MIN_BUFFER;
+ if (desc->bufsz < INET_BUFFER_MIN)
+ desc->bufsz = INET_BUFFER_MIN;
desc->flags |= INET_FLG_BUFFER_SET;
res = 0; /* This does not affect the kernel buffer size */
}
@@ -9024,6 +9066,10 @@ static ErlDrvSSizeT inet_fill_opts(inet_descriptor* desc,
switch(opt) {
case INET_LOPT_BUFFER:
+ DDBG(desc,
+ ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+ "inet_fill_opts -> buffer: %d\r\n",
+ __LINE__, desc->s, driver_caller(desc->port), desc->bufsz) );
*ptr++ = opt;
put_int32(desc->bufsz, ptr);
continue;
@@ -10749,7 +10795,18 @@ static ErlDrvData inet_start(ErlDrvPort port, int size, int protocol)
desc->dport = driver_mk_port(port);
desc->state = INET_STATE_CLOSED;
desc->prebound = 0;
- desc->bufsz = INET_DEF_BUFFER;
+
+ if (protocol == IPPROTO_TCP)
+ desc->bufsz = INET_BUFFER_TCP_DEFAULT;
+ else if (protocol == IPPROTO_UDP)
+ desc->bufsz = INET_BUFFER_UDP_DEFAULT;
+#if defined(HAVE_SCTP)
+ else if (protocol == IPPROTO_SCTP)
+ desc->bufsz = INET_BUFFER_SCTP_DEFAULT;
+#endif
+ else /* We only support tcp, udp and SCTP so this "should not" happen... */
+ desc->bufsz = 9999;
+
desc->hsz = 0; /* list header size */
desc->htype = TCP_PB_RAW; /* default packet type */
desc->psize = 0; /* no size check */
--
2.43.0