From f443db72edc7d4706cf425bb0632b2fbf5032b82 Mon Sep 17 00:00:00 2001 From: jiangheng Date: Tue, 26 Dec 2023 10:14:28 +0800 Subject: [PATCH] fix rte_ring_create/free time-consuming --- 0099-fix-rte_ring_create-time-consuming.patch | 142 ++++++++++++++++++ lwip.spec | 6 +- 2 files changed, 147 insertions(+), 1 deletion(-) create mode 100644 0099-fix-rte_ring_create-time-consuming.patch diff --git a/0099-fix-rte_ring_create-time-consuming.patch b/0099-fix-rte_ring_create-time-consuming.patch new file mode 100644 index 0000000..c544b2a --- /dev/null +++ b/0099-fix-rte_ring_create-time-consuming.patch @@ -0,0 +1,142 @@ +From 01be1587c5e6771da95d6cf8d387c0b5ba15c275 Mon Sep 17 00:00:00 2001 +From: jiangheng +Date: Wed, 27 Dec 2023 10:19:34 +0800 +Subject: [PATCH] fix rte_ring_create time consuming + +--- + src/api/sockets.c | 2 +- + src/api/sys_arch.c | 63 ++++++++++++++++++++++++++++--------- + src/include/arch/sys_arch.h | 4 +++ + 3 files changed, 54 insertions(+), 15 deletions(-) + +diff --git a/src/api/sockets.c b/src/api/sockets.c +index b7ee304..15053b3 100644 +--- a/src/api/sockets.c ++++ b/src/api/sockets.c +@@ -2810,7 +2810,7 @@ event_callback(struct netconn *conn, enum netconn_evt evt, u16_t len) + #endif + break; + case NETCONN_EVT_ERROR: +- if (conn->pending_err != ERR_OK) { ++ if ((conn->pending_err != ERR_OK) && (conn->pending_err != ERR_RST)) { + LWIP_DEBUGF(GAZELLE_DEBUG_SERIOUS, ("event_callback: have errevent, err=%d, fd=%d\n", conn->pending_err, conn->socket)); + } + sock->errevent = 1; +diff --git a/src/api/sys_arch.c b/src/api/sys_arch.c +index 1bc3aee..332d460 100644 +--- a/src/api/sys_arch.c ++++ b/src/api/sys_arch.c +@@ -37,6 +37,7 @@ + #include + + #include ++#include + + #include "lwip/err.h" + #include "lwip/mem.h" +@@ -89,9 +90,50 @@ static int mbox_wait_func(void) + return eth_dev_poll(); + } + ++struct rte_ring *gazelle_ring_create_fast(const char *name, uint32_t size, uint32_t flags) ++{ ++ ssize_t ring_size; ++ char ring_name[RTE_MEMZONE_NAMESIZE] = {0}; ++ struct rte_ring *ring; ++ ++ ring_size = rte_ring_get_memsize_elem(sizeof(void *), size); ++ if (ring_size < 0) { ++ RTE_LOG(ERR, EAL, "rte_ring_get_memszie_elem failed\n"); ++ return NULL; ++ } ++ ++ /* ++ * rte_ring_create is not used because it calls memzone_lookup_thread_unsafe function ++ * time consuming when there are many rings ++ */ ++ ring = rte_malloc_socket(NULL, ring_size, RTE_CACHE_LINE_SIZE, rte_socket_id()); ++ if (ring == NULL) { ++ RTE_LOG(ERR, EAL, "cannot create rte_ring for mbox\n"); ++ return NULL; ++ } ++ ++ if (snprintf(ring_name, sizeof(ring_name), "%s""%"PRIXPTR, name, (uintptr_t)ring) < 0) { ++ rte_free(ring); ++ RTE_LOG(ERR, EAL, "snprintf failed\n"); ++ return NULL; ++ } ++ ++ if (rte_ring_init(ring, ring_name, size, flags) != 0) { ++ rte_free(ring); ++ RTE_LOG(ERR, EAL, "cannot init rte_ring for mbox\n"); ++ return NULL; ++ } ++ ++ return ring; ++} ++ ++void gazelle_ring_free_fast(struct rte_ring *ring) ++{ ++ rte_free(ring); ++} ++ + err_t sys_mbox_new(struct sys_mbox **mb, int size) + { +- int ret; + struct sys_mbox *mbox; + + mbox = (struct sys_mbox *)memp_malloc(MEMP_SYS_MBOX); +@@ -100,21 +142,14 @@ err_t sys_mbox_new(struct sys_mbox **mb, int size) + } + + mbox->flags = RING_F_SP_ENQ | RING_F_SC_DEQ; +- +- ret = snprintf(mbox->name, sizeof(mbox->name), MBOX_NAME_PREFIX"%"PRIXPTR, (uintptr_t)mbox); +- if (ret < 0) { +- memp_free(MEMP_SYS_MBOX, mbox); +- return ERR_VAL; +- } +- + mbox->size = size; + mbox->socket_id = rte_socket_id(); +- mbox->ring = rte_ring_create(mbox->name, mbox->size, mbox->socket_id, mbox->flags); +- if (!mbox->ring) { +- RTE_LOG(ERR, EAL, "cannot create rte_ring for mbox\n"); +- memp_free(MEMP_SYS_MBOX, mbox); +- return ERR_MEM; ++ ++ mbox->ring = gazelle_ring_create_fast(MBOX_NAME_PREFIX, mbox->size, mbox->flags); ++ if (mbox->ring == NULL) { ++ sys_mbox_free(&mbox); + } ++ + mbox->wait_fn = mbox_wait_func; + *mb = mbox; + +@@ -125,7 +160,7 @@ void sys_mbox_free(struct sys_mbox **mb) + { + struct sys_mbox *mbox = *mb; + if (mbox->ring != NULL) { +- rte_ring_free(mbox->ring); ++ gazelle_ring_free_fast(mbox->ring); + mbox->ring = NULL; + } + memp_free(MEMP_SYS_MBOX, mbox); +diff --git a/src/include/arch/sys_arch.h b/src/include/arch/sys_arch.h +index 5e95f3d..bf7e437 100644 +--- a/src/include/arch/sys_arch.h ++++ b/src/include/arch/sys_arch.h +@@ -123,6 +123,10 @@ static __rte_always_inline uint32_t gazelle_st_ring_dequeue_burst(struct rte_rin + + return n; + } ++ ++void gazelle_ring_free_fast(struct rte_ring *ring); ++struct rte_ring *gazelle_ring_create_fast(const char *name, uint32_t size, uint32_t flags); ++ + #endif + + void sys_calibrate_tsc(void); +-- +2.33.0 + diff --git a/lwip.spec b/lwip.spec index 22a4049..65ffa68 100644 --- a/lwip.spec +++ b/lwip.spec @@ -4,7 +4,7 @@ Summary: lwip is a small independent implementation of the TCP/IP protocol suite Name: lwip Version: 2.1.3 -Release: 101 +Release: 102 License: BSD URL: http://savannah.nongnu.org/projects/lwip/ Source0: http://download.savannah.nongnu.org/releases/lwip/%{name}-%{version}.zip @@ -112,6 +112,7 @@ Patch9094: 0095-event_callback-del-errevent-log-if-err-is-ERR_OK.patch Patch9095: 0096-tcp_send_fin-add-the-fin-to-the-last-unsent-segment.patch Patch9096: 0097-Mod-the-issue-that-2w-connection-unable-to-establish.patch Patch9097: 0098-remove-duplicate-lwip-log.patch +Patch9098: 0099-fix-rte_ring_create-time-consuming.patch BuildRequires: gcc-c++ dos2unix dpdk-devel @@ -142,6 +143,9 @@ cd %{_builddir}/%{name}-%{version}/src %{_libdir}/liblwip.a %changelog +* Tue Dec 26 2023 jiangheng - 2.1.3-102 +- fix rte_ring_create/free time-consuming + * Tue Dec 26 2023 jiangheng - 2.1.3-101 - remove duplicate lwip log