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