Improvements in sockets allocation.

This commit is contained in:
Fotis Panagiotopoulos
2023-02-13 18:30:21 +02:00
committed by Xiang Xiao
parent cf15d6b63a
commit 9b4d784307
13 changed files with 63 additions and 36 deletions
@@ -44,7 +44,7 @@ CONFIG_NET_ARP_SEND=y
CONFIG_NET_ICMP=y CONFIG_NET_ICMP=y
CONFIG_NET_ICMP_SOCKET=y CONFIG_NET_ICMP_SOCKET=y
CONFIG_NET_MAX_LISTENPORTS=8 CONFIG_NET_MAX_LISTENPORTS=8
CONFIG_NET_NACTIVESOCKETS=12 CONFIG_NET_PREALLOC_DEVIF_CALLBACKS=12
CONFIG_NET_SOCKOPTS=y CONFIG_NET_SOCKOPTS=y
CONFIG_NET_TCP=y CONFIG_NET_TCP=y
CONFIG_NET_TCPBACKLOG=y CONFIG_NET_TCPBACKLOG=y
@@ -35,7 +35,7 @@ CONFIG_NETDEV_IFINDEX=y
CONFIG_NETDEV_LATEINIT=y CONFIG_NETDEV_LATEINIT=y
CONFIG_NET_CAN=y CONFIG_NET_CAN=y
CONFIG_NET_CAN_ERRORS=y CONFIG_NET_CAN_ERRORS=y
CONFIG_NET_NACTIVESOCKETS=16 CONFIG_NET_PREALLOC_DEVIF_CALLBACKS=16
CONFIG_NET_SOCKOPTS=y CONFIG_NET_SOCKOPTS=y
CONFIG_NET_STATISTICS=y CONFIG_NET_STATISTICS=y
CONFIG_NSH_BUILTIN_APPS=y CONFIG_NSH_BUILTIN_APPS=y
@@ -83,7 +83,7 @@ CONFIG_NET_BROADCAST=y
CONFIG_NET_ETH_PKTSIZE=1518 CONFIG_NET_ETH_PKTSIZE=1518
CONFIG_NET_ICMP=y CONFIG_NET_ICMP=y
CONFIG_NET_ICMP_SOCKET=y CONFIG_NET_ICMP_SOCKET=y
CONFIG_NET_NACTIVESOCKETS=32 CONFIG_NET_PREALLOC_DEVIF_CALLBACKS=32
CONFIG_NET_STATISTICS=y CONFIG_NET_STATISTICS=y
CONFIG_NET_TCP=y CONFIG_NET_TCP=y
CONFIG_NET_TCP_DELAYED_ACK=y CONFIG_NET_TCP_DELAYED_ACK=y
@@ -57,7 +57,7 @@ CONFIG_NET_BROADCAST=y
CONFIG_NET_ETH_PKTSIZE=1518 CONFIG_NET_ETH_PKTSIZE=1518
CONFIG_NET_ICMP=y CONFIG_NET_ICMP=y
CONFIG_NET_ICMP_SOCKET=y CONFIG_NET_ICMP_SOCKET=y
CONFIG_NET_NACTIVESOCKETS=32 CONFIG_NET_PREALLOC_DEVIF_CALLBACKS=32
CONFIG_NET_STATISTICS=y CONFIG_NET_STATISTICS=y
CONFIG_NET_TCP=y CONFIG_NET_TCP=y
CONFIG_NET_TCP_DELAYED_ACK=y CONFIG_NET_TCP_DELAYED_ACK=y
@@ -110,7 +110,7 @@ CONFIG_NET_BROADCAST=y
CONFIG_NET_ETH_PKTSIZE=1518 CONFIG_NET_ETH_PKTSIZE=1518
CONFIG_NET_ICMP=y CONFIG_NET_ICMP=y
CONFIG_NET_ICMP_SOCKET=y CONFIG_NET_ICMP_SOCKET=y
CONFIG_NET_NACTIVESOCKETS=32 CONFIG_NET_PREALLOC_DEVIF_CALLBACKS=32
CONFIG_NET_STATISTICS=y CONFIG_NET_STATISTICS=y
CONFIG_NET_TCP=y CONFIG_NET_TCP=y
CONFIG_NET_TCP_DELAYED_ACK=y CONFIG_NET_TCP_DELAYED_ACK=y
@@ -64,7 +64,7 @@ CONFIG_NET_BROADCAST=y
CONFIG_NET_ETH_PKTSIZE=1518 CONFIG_NET_ETH_PKTSIZE=1518
CONFIG_NET_ICMP=y CONFIG_NET_ICMP=y
CONFIG_NET_ICMP_SOCKET=y CONFIG_NET_ICMP_SOCKET=y
CONFIG_NET_NACTIVESOCKETS=32 CONFIG_NET_PREALLOC_DEVIF_CALLBACKS=32
CONFIG_NET_STATISTICS=y CONFIG_NET_STATISTICS=y
CONFIG_NET_TCP=y CONFIG_NET_TCP=y
CONFIG_NET_TCP_DELAYED_ACK=y CONFIG_NET_TCP_DELAYED_ACK=y
@@ -84,7 +84,7 @@ CONFIG_NET_BROADCAST=y
CONFIG_NET_ETH_PKTSIZE=1518 CONFIG_NET_ETH_PKTSIZE=1518
CONFIG_NET_ICMP=y CONFIG_NET_ICMP=y
CONFIG_NET_ICMP_SOCKET=y CONFIG_NET_ICMP_SOCKET=y
CONFIG_NET_NACTIVESOCKETS=32 CONFIG_NET_PREALLOC_DEVIF_CALLBACKS=32
CONFIG_NET_STATISTICS=y CONFIG_NET_STATISTICS=y
CONFIG_NET_TCP=y CONFIG_NET_TCP=y
CONFIG_NET_TCP_DELAYED_ACK=y CONFIG_NET_TCP_DELAYED_ACK=y
@@ -52,7 +52,7 @@ CONFIG_NET_BROADCAST=y
CONFIG_NET_ETH_PKTSIZE=1518 CONFIG_NET_ETH_PKTSIZE=1518
CONFIG_NET_ICMP=y CONFIG_NET_ICMP=y
CONFIG_NET_ICMP_SOCKET=y CONFIG_NET_ICMP_SOCKET=y
CONFIG_NET_NACTIVESOCKETS=32 CONFIG_NET_PREALLOC_DEVIF_CALLBACKS=32
CONFIG_NET_STATISTICS=y CONFIG_NET_STATISTICS=y
CONFIG_NET_TCP=y CONFIG_NET_TCP=y
CONFIG_NET_TCP_DELAYED_ACK=y CONFIG_NET_TCP_DELAYED_ACK=y
@@ -83,7 +83,7 @@ CONFIG_NET_BROADCAST=y
CONFIG_NET_ETH_PKTSIZE=1518 CONFIG_NET_ETH_PKTSIZE=1518
CONFIG_NET_ICMP=y CONFIG_NET_ICMP=y
CONFIG_NET_ICMP_SOCKET=y CONFIG_NET_ICMP_SOCKET=y
CONFIG_NET_NACTIVESOCKETS=32 CONFIG_NET_PREALLOC_DEVIF_CALLBACKS=32
CONFIG_NET_STATISTICS=y CONFIG_NET_STATISTICS=y
CONFIG_NET_TCP=y CONFIG_NET_TCP=y
CONFIG_NET_TCP_DELAYED_ACK=y CONFIG_NET_TCP_DELAYED_ACK=y
@@ -52,7 +52,7 @@ CONFIG_NET_BROADCAST=y
CONFIG_NET_ETH_PKTSIZE=1518 CONFIG_NET_ETH_PKTSIZE=1518
CONFIG_NET_ICMP=y CONFIG_NET_ICMP=y
CONFIG_NET_ICMP_SOCKET=y CONFIG_NET_ICMP_SOCKET=y
CONFIG_NET_NACTIVESOCKETS=32 CONFIG_NET_PREALLOC_DEVIF_CALLBACKS=32
CONFIG_NET_STATISTICS=y CONFIG_NET_STATISTICS=y
CONFIG_NET_TCP=y CONFIG_NET_TCP=y
CONFIG_NET_TCP_DELAYED_ACK=y CONFIG_NET_TCP_DELAYED_ACK=y
-10
View File
@@ -415,16 +415,6 @@
# define CONFIG_NET_MAX_LISTENPORTS 20 # define CONFIG_NET_MAX_LISTENPORTS 20
#endif #endif
/* Define the maximum number of concurrently active UDP and TCP
* ports. This number must be greater than the number of open
* sockets in order to support multi-threaded read/write operations.
*/
#ifndef CONFIG_NET_NACTIVESOCKETS
# define CONFIG_NET_NACTIVESOCKETS (CONFIG_NET_TCP_PREALLOC_CONNS + \
CONFIG_NET_UDP_PREALLOC_CONNS)
#endif
/* The initial retransmission timeout counted in timer pulses. /* The initial retransmission timeout counted in timer pulses.
* REVISIT: TCP RTO really should be calculated dynamically for each TCP * REVISIT: TCP RTO really should be calculated dynamically for each TCP
* connection. * connection.
+26 -12
View File
@@ -43,8 +43,9 @@
* Private Data * Private Data
****************************************************************************/ ****************************************************************************/
#ifndef CONFIG_NET_ALLOC_CONNS #if CONFIG_NET_PREALLOC_DEVIF_CALLBACKS > 0
static struct devif_callback_s g_cbprealloc[CONFIG_NET_NACTIVESOCKETS]; static struct devif_callback_s
g_cbprealloc[CONFIG_NET_PREALLOC_DEVIF_CALLBACKS];
#endif #endif
static FAR struct devif_callback_s *g_cbfreelist = NULL; static FAR struct devif_callback_s *g_cbfreelist = NULL;
@@ -164,11 +165,24 @@ static void devif_callback_free(FAR struct net_driver_s *dev,
} }
} }
/* Put the structure into the free list */ /* If this is a preallocated or a batch allocated callback store it in
* the free callbacks list. Else free it.
*/
#if CONFIG_NET_ALLOC_DEVIF_CALLBACKS == 1
if (cb < g_cbprealloc || cb >= (g_cbprealloc +
CONFIG_NET_PREALLOC_DEVIF_CALLBACKS))
{
kmm_free(cb);
}
else
#endif
{
cb->nxtconn = g_cbfreelist;
cb->nxtdev = NULL;
g_cbfreelist = cb;
}
cb->nxtconn = g_cbfreelist;
cb->nxtdev = NULL;
g_cbfreelist = cb;
net_unlock(); net_unlock();
} }
} }
@@ -230,10 +244,10 @@ static bool devif_event_trigger(uint16_t events, uint16_t triggers)
void devif_callback_init(void) void devif_callback_init(void)
{ {
#ifndef CONFIG_NET_ALLOC_CONNS #if CONFIG_NET_PREALLOC_DEVIF_CALLBACKS > 0
int i; int i;
for (i = 0; i < CONFIG_NET_NACTIVESOCKETS; i++) for (i = 0; i < CONFIG_NET_PREALLOC_DEVIF_CALLBACKS; i++)
{ {
g_cbprealloc[i].nxtconn = g_cbfreelist; g_cbprealloc[i].nxtconn = g_cbfreelist;
g_cbfreelist = &g_cbprealloc[i]; g_cbfreelist = &g_cbprealloc[i];
@@ -263,7 +277,7 @@ FAR struct devif_callback_s *
FAR struct devif_callback_s **list_tail) FAR struct devif_callback_s **list_tail)
{ {
FAR struct devif_callback_s *ret; FAR struct devif_callback_s *ret;
#ifdef CONFIG_NET_ALLOC_CONNS #if CONFIG_NET_ALLOC_DEVIF_CALLBACKS > 0
int i; int i;
#endif #endif
@@ -290,14 +304,14 @@ FAR struct devif_callback_s *
/* Allocate the callback entry from heap */ /* Allocate the callback entry from heap */
#ifdef CONFIG_NET_ALLOC_CONNS #if CONFIG_NET_ALLOC_DEVIF_CALLBACKS > 0
if (g_cbfreelist == NULL) if (g_cbfreelist == NULL)
{ {
ret = kmm_zalloc(sizeof(struct devif_callback_s) * ret = kmm_zalloc(sizeof(struct devif_callback_s) *
CONFIG_NET_NACTIVESOCKETS); CONFIG_NET_ALLOC_DEVIF_CALLBACKS);
if (ret != NULL) if (ret != NULL)
{ {
for (i = 0; i < CONFIG_NET_NACTIVESOCKETS; i++) for (i = 0; i < CONFIG_NET_ALLOC_DEVIF_CALLBACKS; i++)
{ {
ret[i].nxtconn = g_cbfreelist; ret[i].nxtconn = g_cbfreelist;
g_cbfreelist = &ret[i]; g_cbfreelist = &ret[i];
+27 -4
View File
@@ -5,13 +5,36 @@
menu "Socket Support" menu "Socket Support"
config NET_NACTIVESOCKETS config NET_PREALLOC_DEVIF_CALLBACKS
int "Max socket operations" int "Preallocated socket callbacks"
default 16 if !DEFAULT_SMALL default 16 if !DEFAULT_SMALL
default 4 if DEFAULT_SMALL default 4 if DEFAULT_SMALL
---help--- ---help---
Maximum number of concurrent socket operations (recv, send, Number of preallocated socket callbacks (all tasks).
connection monitoring, etc.). Default: 16
This number of callbacks will be pre-allocated during system boot.
If dynamic callbacks allocation is enabled, more callbacks may be
allocated at a later time, as the system needs them. Else this
will be the maximum number of callbacks available to the system
at all times.
Set to 0 to disable (and rely only on dynamic allocations).
config NET_ALLOC_DEVIF_CALLBACKS
int "Dynamic socket callbacks allocation"
default 0
---help---
Dynamic memory allocations for socket callbacks.
When set to 0 all dynamic allocations are disabled.
When set to 1 a new callback will be allocated every time, and
it will be free'd when no longer needed.
Setting this to 2 or more will allocate the callbacks in batches
(with batch size equal to this config). When a callback is no
longer needed, it will be returned to the free callbacks pool,
and it will never be deallocated!
config NET_SOCKOPTS config NET_SOCKOPTS
bool "Socket options" bool "Socket options"