• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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