• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1From 10e21843fc3fde51cb99510792835a65c9b5baad Mon Sep 17 00:00:00 2001
2From: wuchangsheng <wuchangsheng2@huawei.com>
3Date: Thu, 7 Jul 2022 20:00:14 +0800
4Subject: [PATCH] refactor pkt read/send
5
6---
7 src/api/api_msg.c           | 15 ++++++---------
8 src/api/posix_api.c         |  4 ++--
9 src/api/sockets.c           | 11 +++--------
10 src/api/sys_arch.c          | 11 +++++------
11 src/include/arch/sys_arch.h | 46 +++++++++++++++++++++++++++++++++++++++++++++
12 src/include/lwipopts.h      |  2 +-
13 src/include/lwipsock.h      | 29 +++++++++++-----------------
14 src/include/posix_api.h     |  2 +-
15 8 files changed, 75 insertions(+), 45 deletions(-)
16
17diff --git a/src/api/api_msg.c b/src/api/api_msg.c
18index 672f022..7839526 100644
19--- a/src/api/api_msg.c
20+++ b/src/api/api_msg.c
21@@ -341,13 +341,12 @@ recv_tcp(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err)
22 #if LWIP_SO_RCVBUF
23     SYS_ARCH_INC(conn->recv_avail, len);
24 #endif /* LWIP_SO_RCVBUF */
25-    /* Register event with callback */
26-    API_EVENT(conn, NETCONN_EVT_RCVPLUS, len);
27 #if USE_LIBOS
28-  if (conn->state == NETCONN_WRITE || conn->state == NETCONN_CLOSE ||
29-      conn->state == NETCONN_CONNECT) {
30     add_recv_list(conn->socket);
31-  }
32+    LWIP_UNUSED_ARG(len);
33+#else
34+    /* Register event with callback */
35+    API_EVENT(conn, NETCONN_EVT_RCVPLUS, len);
36 #endif
37   }
38
39@@ -479,10 +478,7 @@ err_tcp(void *arg, err_t err)
40     /* use trypost to prevent deadlock */
41     sys_mbox_trypost(&conn->recvmbox, mbox_msg);
42 #if USE_LIBOS
43-    if ((old_state == NETCONN_WRITE) || (old_state == NETCONN_CLOSE) ||
44-        (old_state == NETCONN_CONNECT)) {
45-      add_recv_list(conn->socket);
46-    }
47+    add_recv_list(conn->socket);
48 #endif
49   }
50   /* pass error message to acceptmbox to wake up pending accept */
51@@ -1356,6 +1352,7 @@ lwip_netconn_do_connected(void *arg, struct tcp_pcb *pcb, err_t err)
52     }
53   }
54   SET_CONN_TYPE_LIBOS(conn);
55+  add_epoll_event(conn, EPOLLOUT);
56 #endif
57
58   LWIP_ASSERT("conn->state == NETCONN_CONNECT", conn->state == NETCONN_CONNECT);
59diff --git a/src/api/posix_api.c b/src/api/posix_api.c
60index 3f85bad..6afb9c6 100644
61--- a/src/api/posix_api.c
62+++ b/src/api/posix_api.c
63@@ -60,7 +60,7 @@ static struct lwip_sock *chld_get_socket(int fd)
64 void posix_api_fork(void)
65 {
66     /* lstack helper api */
67-    posix_api->is_chld = 1;
68+    posix_api->ues_posix = 1;
69     posix_api->is_epfd = chld_is_epfd;
70     posix_api->get_socket = chld_get_socket;
71 }
72@@ -117,7 +117,7 @@ int posix_api_init(void)
73     posix_api->epoll_close_fn = lstack_epoll_close;
74
75     /* support fork */
76-    posix_api->is_chld = 1;
77+    posix_api->ues_posix = 1;
78     return ERR_OK;
79
80 err_out:
81diff --git a/src/api/sockets.c b/src/api/sockets.c
82index 3d94454..4d4cea1 100644
83--- a/src/api/sockets.c
84+++ b/src/api/sockets.c
85@@ -1039,11 +1039,7 @@ lwip_recv_tcp(struct lwip_sock *sock, void *mem, size_t len, int flags)
86 {
87   u8_t apiflags = NETCONN_NOAUTORCVD;
88   ssize_t recvd = 0;
89-#if USE_LIBOS
90-  apiflags = 0;
91-#else
92   ssize_t recv_left = (len <= SSIZE_MAX) ? (ssize_t)len : SSIZE_MAX;
93-#endif
94
95   LWIP_ASSERT("no socket given", sock != NULL);
96   LWIP_ASSERT("this should be checked internally", NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_TCP);
97@@ -1134,6 +1130,7 @@ lwip_recv_tcp(struct lwip_sock *sock, void *mem, size_t len, int flags)
98
99 lwip_recv_tcp_done:
100 #else /* USE_LIBOS */
101+  LWIP_UNUSED_ARG(recv_left);
102   recvd = read_lwip_data(sock, flags, apiflags);
103   if (recvd <= 0) {
104     return recvd;
105@@ -2667,10 +2664,8 @@ event_callback(struct netconn *conn, enum netconn_evt evt, u16_t len)
106         check_waiters = 0;
107       }
108 #if USE_LIBOS
109-      if (conn->state == NETCONN_LISTEN) {
110-        add_epoll_event(conn, EPOLLIN);
111-      } else {
112-        add_recv_list(conn->socket);
113+      if (conn->acceptmbox != NULL && !sys_mbox_empty(conn->acceptmbox)) {
114+        add_epoll_event(conn, POLLIN);
115       }
116 #endif
117       break;
118diff --git a/src/api/sys_arch.c b/src/api/sys_arch.c
119index 9a92143..f93a00e 100644
120--- a/src/api/sys_arch.c
121+++ b/src/api/sys_arch.c
122@@ -37,7 +37,6 @@
123 #include <unistd.h>
124
125 #include <rte_memzone.h>
126-#include <rte_ring.h>
127
128 #include "lwip/err.h"
129 #include "lwip/mem.h"
130@@ -134,7 +133,7 @@ err_t sys_mbox_trypost(struct sys_mbox **mb, void *msg)
131     unsigned int n;
132     struct sys_mbox *mbox = *mb;
133
134-    n = rte_ring_sp_enqueue_bulk(mbox->ring, &msg, 1, NULL);
135+    n = gazelle_st_ring_enqueue_busrt(mbox->ring, &msg, 1);
136     if (!n)
137         return ERR_BUF;
138     return ERR_OK;
139@@ -148,7 +147,7 @@ void sys_mbox_post(struct sys_mbox **mb, void *msg)
140     * If the ring size of mbox is greater than MEMP_NUM_TCPIP_MSG_API,
141     * enqueue failure will never happen.
142     * */
143-    if (!rte_ring_sp_enqueue_bulk(mbox->ring, &msg, 1, NULL)) {
144+    if (!gazelle_st_ring_enqueue_busrt(mbox->ring, &msg, 1)) {
145         LWIP_ASSERT("It is failed to post msg into mbox", 0);
146     }
147 }
148@@ -163,7 +162,7 @@ uint32_t sys_arch_mbox_tryfetch(struct sys_mbox **mb, void **msg)
149     unsigned int n;
150     struct sys_mbox *mbox = *mb;
151
152-    n = rte_ring_sc_dequeue_bulk(mbox->ring, msg, 1, NULL);
153+    n = gazelle_st_ring_dequeue_burst(mbox->ring, msg, 1);
154     if (!n) {
155         *msg = NULL;
156         return SYS_MBOX_EMPTY;
157@@ -179,7 +178,7 @@ uint32_t sys_arch_mbox_fetch(struct sys_mbox **mb, void **msg, uint32_t timeout)
158     uint32_t time_needed = 0;
159     struct sys_mbox *mbox = *mb;
160
161-    n = rte_ring_sc_dequeue_bulk(mbox->ring, msg, 1, NULL);
162+    n = gazelle_st_ring_dequeue_burst(mbox->ring, msg, 1);
163
164     if (timeout > 0)
165         poll_ts = sys_now();
166@@ -194,7 +193,7 @@ uint32_t sys_arch_mbox_fetch(struct sys_mbox **mb, void **msg, uint32_t timeout)
167
168         (void)mbox->wait_fn();
169
170-        n = rte_ring_sc_dequeue_bulk(mbox->ring, msg, 1, NULL);
171+        n = gazelle_st_ring_dequeue_burst(mbox->ring, msg, 1);
172     }
173
174     return time_needed;
175diff --git a/src/include/arch/sys_arch.h b/src/include/arch/sys_arch.h
176index b8a0d28..fc4a9fd 100644
177--- a/src/include/arch/sys_arch.h
178+++ b/src/include/arch/sys_arch.h
179@@ -76,7 +76,53 @@ int sys_mbox_empty(struct sys_mbox *);
180 struct sys_thread;
181 typedef struct sys_thread *sys_thread_t;
182
183+#if USE_LIBOS
184 extern int eth_dev_poll(void);
185+#include <rte_ring.h>
186+
187+/*
188+    gazelle custom rte ring interface
189+    lightweight ring no atomic.
190+    only surpport in single thread.
191+ */
192+static __rte_always_inline uint32_t gazelle_st_ring_enqueue_busrt(struct rte_ring *r, void **obj_table, uint32_t n)
193+{
194+    uint32_t prod = r->prod.tail;
195+    uint32_t cons = r->cons.tail;
196+    uint32_t free_entries = r->capacity + cons - prod;
197+
198+    if (n > free_entries) {
199+        return 0;
200+    }
201+
202+    __rte_ring_enqueue_elems(r, prod, obj_table, sizeof(void *), n);
203+
204+    r->prod.tail = prod + n;
205+
206+    return n;
207+}
208+
209+static __rte_always_inline uint32_t gazelle_st_ring_dequeue_burst(struct rte_ring *r, void **obj_table, uint32_t n)
210+{
211+    uint32_t cons = r->cons.tail;
212+    uint32_t prod = r->prod.tail;
213+    uint32_t entries = prod - cons;
214+
215+    if (n > entries) {
216+        n = entries;
217+    }
218+
219+    if (n == 0) {
220+        return 0;
221+    }
222+
223+    __rte_ring_dequeue_elems(r, cons, obj_table, sizeof(void *), n);
224+
225+    r->cons.tail = cons + n;
226+
227+    return n;
228+}
229+#endif
230
231 void sys_calibrate_tsc(void);
232 uint32_t sys_now(void);
233diff --git a/src/include/lwipopts.h b/src/include/lwipopts.h
234index df587c0..75d3c74 100644
235--- a/src/include/lwipopts.h
236+++ b/src/include/lwipopts.h
237@@ -97,7 +97,7 @@
238
239 #define TCP_WND (40 * TCP_MSS)
240
241-#define TCP_SND_BUF (5 * TCP_MSS)
242+#define TCP_SND_BUF (40 * TCP_MSS)
243
244 #define TCP_SND_QUEUELEN (8191)
245
246diff --git a/src/include/lwipsock.h b/src/include/lwipsock.h
247index eec4e8e..500292d 100644
248--- a/src/include/lwipsock.h
249+++ b/src/include/lwipsock.h
250@@ -63,6 +63,7 @@ union lwip_sock_lastdata {
251 struct protocol_stack;
252 struct wakeup_poll;
253 struct rte_ring;
254+#include <rte_common.h>
255 #endif
256 /** Contains all internal pointers and states used for a socket */
257 struct lwip_sock {
258@@ -92,28 +93,21 @@ struct lwip_sock {
259 #endif
260
261 #if USE_LIBOS
262+  volatile uint32_t events __rte_cache_aligned; /* available events */
263+  struct pbuf *recv_lastdata __rte_cache_aligned; /* unread data in one pbuf */
264+  struct list_node recv_list __rte_cache_aligned;
265+  struct list_node event_list __rte_cache_aligned;
266+  struct list_node send_list __rte_cache_aligned;
267+  char pad __rte_cache_aligned;
268+
269   uint32_t epoll_events; /* registered events */
270-  volatile uint32_t events; /* available events */
271-  epoll_data_t ep_data;
272   struct wakeup_poll *wakeup;
273+  epoll_data_t ep_data;
274+  bool wait_close;
275+  struct lwip_sock *listen_next; /* listenfd list */
276   struct protocol_stack *stack;
277   struct rte_ring *recv_ring;
278-  struct rte_ring *recv_wait_free;
279-  struct pbuf *recv_lastdata; /* unread data in one pbuf */
280-  struct pbuf *send_lastdata; /* unread data in one pbuf */
281   struct rte_ring *send_ring;
282-  struct rte_ring *send_idle_ring;
283-  int32_t recv_flags;
284-  int32_t send_flags;
285-  bool wait_close;
286-  int32_t attach_fd;
287-  struct lwip_sock *shadowed_sock;
288-  struct list_node attach_list;
289-  struct list_node listen_list;
290-  struct list_node recv_list;
291-  struct list_node event_list;
292-  struct list_node send_list;
293-  int32_t nextfd; /* listenfd list */
294 #endif
295 };
296
297@@ -160,7 +154,6 @@ get_socket_without_errno(int s)
298 extern void add_recv_list(int32_t fd);
299 extern ssize_t read_lwip_data(struct lwip_sock *sock, int32_t flags, u8_t apiflags);
300 extern struct pbuf *write_lwip_data(struct lwip_sock *sock, uint16_t remain_size, uint8_t *apiflags);
301-extern void gazelle_clean_sock(int32_t fd);
302 extern void gazelle_init_sock(int32_t fd);
303 #endif /* USE_LIBOS */
304
305diff --git a/src/include/posix_api.h b/src/include/posix_api.h
306index 2afd266..c8f2cf9 100644
307--- a/src/include/posix_api.h
308+++ b/src/include/posix_api.h
309@@ -76,7 +76,7 @@ typedef struct {
310     int (*poll_fn)(struct pollfd *fds, nfds_t nfds, int timeout);
311     int (*ioctl_fn)(int fd, int cmd, ...);
312
313-    int is_chld;
314+    int ues_posix;
315 } posix_api_t;
316
317 extern posix_api_t *posix_api;
318--
3192.8.4.windows.1
320
321