1From 01be1587c5e6771da95d6cf8d387c0b5ba15c275 Mon Sep 17 00:00:00 2001 2From: jiangheng <jiangheng14@huawei.com> 3Date: Wed, 27 Dec 2023 10:19:34 +0800 4Subject: [PATCH] fix rte_ring_create time consuming 5 6--- 7 src/api/sockets.c | 2 +- 8 src/api/sys_arch.c | 63 ++++++++++++++++++++++++++++--------- 9 src/include/arch/sys_arch.h | 4 +++ 10 3 files changed, 54 insertions(+), 15 deletions(-) 11 12diff --git a/src/api/sockets.c b/src/api/sockets.c 13index b7ee304..15053b3 100644 14--- a/src/api/sockets.c 15+++ b/src/api/sockets.c 16@@ -2810,7 +2810,7 @@ event_callback(struct netconn *conn, enum netconn_evt evt, u16_t len) 17 #endif 18 break; 19 case NETCONN_EVT_ERROR: 20- if (conn->pending_err != ERR_OK) { 21+ if ((conn->pending_err != ERR_OK) && (conn->pending_err != ERR_RST)) { 22 LWIP_DEBUGF(GAZELLE_DEBUG_SERIOUS, ("event_callback: have errevent, err=%d, fd=%d\n", conn->pending_err, conn->socket)); 23 } 24 sock->errevent = 1; 25diff --git a/src/api/sys_arch.c b/src/api/sys_arch.c 26index 1bc3aee..332d460 100644 27--- a/src/api/sys_arch.c 28+++ b/src/api/sys_arch.c 29@@ -37,6 +37,7 @@ 30 #include <unistd.h> 31 32 #include <rte_memzone.h> 33+#include <rte_malloc.h> 34 35 #include "lwip/err.h" 36 #include "lwip/mem.h" 37@@ -89,9 +90,50 @@ static int mbox_wait_func(void) 38 return eth_dev_poll(); 39 } 40 41+struct rte_ring *gazelle_ring_create_fast(const char *name, uint32_t size, uint32_t flags) 42+{ 43+ ssize_t ring_size; 44+ char ring_name[RTE_MEMZONE_NAMESIZE] = {0}; 45+ struct rte_ring *ring; 46+ 47+ ring_size = rte_ring_get_memsize_elem(sizeof(void *), size); 48+ if (ring_size < 0) { 49+ RTE_LOG(ERR, EAL, "rte_ring_get_memszie_elem failed\n"); 50+ return NULL; 51+ } 52+ 53+ /* 54+ * rte_ring_create is not used because it calls memzone_lookup_thread_unsafe function 55+ * time consuming when there are many rings 56+ */ 57+ ring = rte_malloc_socket(NULL, ring_size, RTE_CACHE_LINE_SIZE, rte_socket_id()); 58+ if (ring == NULL) { 59+ RTE_LOG(ERR, EAL, "cannot create rte_ring for mbox\n"); 60+ return NULL; 61+ } 62+ 63+ if (snprintf(ring_name, sizeof(ring_name), "%s""%"PRIXPTR, name, (uintptr_t)ring) < 0) { 64+ rte_free(ring); 65+ RTE_LOG(ERR, EAL, "snprintf failed\n"); 66+ return NULL; 67+ } 68+ 69+ if (rte_ring_init(ring, ring_name, size, flags) != 0) { 70+ rte_free(ring); 71+ RTE_LOG(ERR, EAL, "cannot init rte_ring for mbox\n"); 72+ return NULL; 73+ } 74+ 75+ return ring; 76+} 77+ 78+void gazelle_ring_free_fast(struct rte_ring *ring) 79+{ 80+ rte_free(ring); 81+} 82+ 83 err_t sys_mbox_new(struct sys_mbox **mb, int size) 84 { 85- int ret; 86 struct sys_mbox *mbox; 87 88 mbox = (struct sys_mbox *)memp_malloc(MEMP_SYS_MBOX); 89@@ -100,21 +142,14 @@ err_t sys_mbox_new(struct sys_mbox **mb, int size) 90 } 91 92 mbox->flags = RING_F_SP_ENQ | RING_F_SC_DEQ; 93- 94- ret = snprintf(mbox->name, sizeof(mbox->name), MBOX_NAME_PREFIX"%"PRIXPTR, (uintptr_t)mbox); 95- if (ret < 0) { 96- memp_free(MEMP_SYS_MBOX, mbox); 97- return ERR_VAL; 98- } 99- 100 mbox->size = size; 101 mbox->socket_id = rte_socket_id(); 102- mbox->ring = rte_ring_create(mbox->name, mbox->size, mbox->socket_id, mbox->flags); 103- if (!mbox->ring) { 104- RTE_LOG(ERR, EAL, "cannot create rte_ring for mbox\n"); 105- memp_free(MEMP_SYS_MBOX, mbox); 106- return ERR_MEM; 107+ 108+ mbox->ring = gazelle_ring_create_fast(MBOX_NAME_PREFIX, mbox->size, mbox->flags); 109+ if (mbox->ring == NULL) { 110+ sys_mbox_free(&mbox); 111 } 112+ 113 mbox->wait_fn = mbox_wait_func; 114 *mb = mbox; 115 116@@ -125,7 +160,7 @@ void sys_mbox_free(struct sys_mbox **mb) 117 { 118 struct sys_mbox *mbox = *mb; 119 if (mbox->ring != NULL) { 120- rte_ring_free(mbox->ring); 121+ gazelle_ring_free_fast(mbox->ring); 122 mbox->ring = NULL; 123 } 124 memp_free(MEMP_SYS_MBOX, mbox); 125diff --git a/src/include/arch/sys_arch.h b/src/include/arch/sys_arch.h 126index 5e95f3d..bf7e437 100644 127--- a/src/include/arch/sys_arch.h 128+++ b/src/include/arch/sys_arch.h 129@@ -123,6 +123,10 @@ static __rte_always_inline uint32_t gazelle_st_ring_dequeue_burst(struct rte_rin 130 131 return n; 132 } 133+ 134+void gazelle_ring_free_fast(struct rte_ring *ring); 135+struct rte_ring *gazelle_ring_create_fast(const char *name, uint32_t size, uint32_t flags); 136+ 137 #endif 138 139 void sys_calibrate_tsc(void); 140-- 1412.33.0 142 143