Projects
Eulaceura:Mainline
lwip
_service:obs_scm:0024-refactor-pkt-read-send-pe...
Sign Up
Log In
Username
Password
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File _service:obs_scm:0024-refactor-pkt-read-send-performance.patch of Package lwip
From 10e21843fc3fde51cb99510792835a65c9b5baad Mon Sep 17 00:00:00 2001 From: wuchangsheng <wuchangsheng2@huawei.com> Date: Thu, 7 Jul 2022 20:00:14 +0800 Subject: [PATCH] refactor pkt read/send --- src/api/api_msg.c | 15 ++++++--------- src/api/posix_api.c | 4 ++-- src/api/sockets.c | 11 +++-------- src/api/sys_arch.c | 11 +++++------ src/include/arch/sys_arch.h | 46 +++++++++++++++++++++++++++++++++++++++++++++ src/include/lwipopts.h | 2 +- src/include/lwipsock.h | 29 +++++++++++----------------- src/include/posix_api.h | 2 +- 8 files changed, 75 insertions(+), 45 deletions(-) diff --git a/src/api/api_msg.c b/src/api/api_msg.c index 8f20577..ab3cfc1 100644 --- a/src/api/api_msg.c +++ b/src/api/api_msg.c @@ -344,13 +344,12 @@ recv_tcp(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err) #if LWIP_SO_RCVBUF SYS_ARCH_INC(conn->recv_avail, len); #endif /* LWIP_SO_RCVBUF */ - /* Register event with callback */ - API_EVENT(conn, NETCONN_EVT_RCVPLUS, len); #if USE_LIBOS - if (conn->state == NETCONN_WRITE || conn->state == NETCONN_CLOSE || - conn->state == NETCONN_CONNECT) { add_recv_list(conn->socket); - } + LWIP_UNUSED_ARG(len); +#else + /* Register event with callback */ + API_EVENT(conn, NETCONN_EVT_RCVPLUS, len); #endif } @@ -482,10 +481,7 @@ err_tcp(void *arg, err_t err) /* use trypost to prevent deadlock */ sys_mbox_trypost(&conn->recvmbox, mbox_msg); #if USE_LIBOS - if ((old_state == NETCONN_WRITE) || (old_state == NETCONN_CLOSE) || - (old_state == NETCONN_CONNECT)) { - add_recv_list(conn->socket); - } + add_recv_list(conn->socket); #endif } /* pass error message to acceptmbox to wake up pending accept */ @@ -1357,6 +1353,7 @@ lwip_netconn_do_connected(void *arg, struct tcp_pcb *pcb, err_t err) } } SET_CONN_TYPE_LIBOS(conn); + add_epoll_event(conn, EPOLLOUT); #endif LWIP_ASSERT("conn->state == NETCONN_CONNECT", conn->state == NETCONN_CONNECT); diff --git a/src/api/posix_api.c b/src/api/posix_api.c index 3f85bad..6afb9c6 100644 --- a/src/api/posix_api.c +++ b/src/api/posix_api.c @@ -60,7 +60,7 @@ static struct lwip_sock *chld_get_socket(int fd) void posix_api_fork(void) { /* lstack helper api */ - posix_api->is_chld = 1; + posix_api->ues_posix = 1; posix_api->is_epfd = chld_is_epfd; posix_api->get_socket = chld_get_socket; } @@ -117,7 +117,7 @@ int posix_api_init(void) posix_api->epoll_close_fn = lstack_epoll_close; /* support fork */ - posix_api->is_chld = 1; + posix_api->ues_posix = 1; return ERR_OK; err_out: diff --git a/src/api/sockets.c b/src/api/sockets.c index 4216986..7cdb9d8 100644 --- a/src/api/sockets.c +++ b/src/api/sockets.c @@ -1076,11 +1076,7 @@ lwip_recv_tcp(struct lwip_sock *sock, void *mem, size_t len, int flags) { u8_t apiflags = NETCONN_NOAUTORCVD; ssize_t recvd = 0; -#if USE_LIBOS - apiflags = 0; -#else ssize_t recv_left = (len <= SSIZE_MAX) ? (ssize_t)len : SSIZE_MAX; -#endif LWIP_ASSERT("no socket given", sock != NULL); LWIP_ASSERT("this should be checked internally", NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_TCP); @@ -1170,6 +1166,7 @@ lwip_recv_tcp(struct lwip_sock *sock, void *mem, size_t len, int flags) } while ((recv_left > 0) && !(flags & MSG_PEEK)); lwip_recv_tcp_done: #else /* USE_LIBOS */ + LWIP_UNUSED_ARG(recv_left); recvd = read_lwip_data(sock, flags, apiflags); if (recvd <= 0) { return recvd; @@ -2709,10 +2706,8 @@ event_callback(struct netconn *conn, enum netconn_evt evt, u16_t len) check_waiters = 0; } #if USE_LIBOS - if (conn->state == NETCONN_LISTEN) { - add_epoll_event(conn, EPOLLIN); - } else { - add_recv_list(conn->socket); + if (conn->acceptmbox != NULL && !sys_mbox_empty(conn->acceptmbox)) { + add_epoll_event(conn, POLLIN); } #endif break; diff --git a/src/api/sys_arch.c b/src/api/sys_arch.c index 9a92143..f93a00e 100644 --- a/src/api/sys_arch.c +++ b/src/api/sys_arch.c @@ -37,7 +37,6 @@ #include <unistd.h> #include <rte_memzone.h> -#include <rte_ring.h> #include "lwip/err.h" #include "lwip/mem.h" @@ -134,7 +133,7 @@ err_t sys_mbox_trypost(struct sys_mbox **mb, void *msg) unsigned int n; struct sys_mbox *mbox = *mb; - n = rte_ring_sp_enqueue_bulk(mbox->ring, &msg, 1, NULL); + n = gazelle_st_ring_enqueue_busrt(mbox->ring, &msg, 1); if (!n) return ERR_BUF; return ERR_OK; @@ -148,7 +147,7 @@ void sys_mbox_post(struct sys_mbox **mb, void *msg) * If the ring size of mbox is greater than MEMP_NUM_TCPIP_MSG_API, * enqueue failure will never happen. * */ - if (!rte_ring_sp_enqueue_bulk(mbox->ring, &msg, 1, NULL)) { + if (!gazelle_st_ring_enqueue_busrt(mbox->ring, &msg, 1)) { LWIP_ASSERT("It is failed to post msg into mbox", 0); } } @@ -163,7 +162,7 @@ uint32_t sys_arch_mbox_tryfetch(struct sys_mbox **mb, void **msg) unsigned int n; struct sys_mbox *mbox = *mb; - n = rte_ring_sc_dequeue_bulk(mbox->ring, msg, 1, NULL); + n = gazelle_st_ring_dequeue_burst(mbox->ring, msg, 1); if (!n) { *msg = NULL; return SYS_MBOX_EMPTY; @@ -179,7 +178,7 @@ uint32_t sys_arch_mbox_fetch(struct sys_mbox **mb, void **msg, uint32_t timeout) uint32_t time_needed = 0; struct sys_mbox *mbox = *mb; - n = rte_ring_sc_dequeue_bulk(mbox->ring, msg, 1, NULL); + n = gazelle_st_ring_dequeue_burst(mbox->ring, msg, 1); if (timeout > 0) poll_ts = sys_now(); @@ -194,7 +193,7 @@ uint32_t sys_arch_mbox_fetch(struct sys_mbox **mb, void **msg, uint32_t timeout) (void)mbox->wait_fn(); - n = rte_ring_sc_dequeue_bulk(mbox->ring, msg, 1, NULL); + n = gazelle_st_ring_dequeue_burst(mbox->ring, msg, 1); } return time_needed; diff --git a/src/include/arch/sys_arch.h b/src/include/arch/sys_arch.h index b8a0d28..fc4a9fd 100644 --- a/src/include/arch/sys_arch.h +++ b/src/include/arch/sys_arch.h @@ -76,7 +76,53 @@ int sys_mbox_empty(struct sys_mbox *); struct sys_thread; typedef struct sys_thread *sys_thread_t; +#if USE_LIBOS extern int eth_dev_poll(void); +#include <rte_ring.h> + +/* + gazelle custom rte ring interface + lightweight ring no atomic. + only surpport in single thread. + */ +static __rte_always_inline uint32_t gazelle_st_ring_enqueue_busrt(struct rte_ring *r, void **obj_table, uint32_t n) +{ + uint32_t prod = r->prod.tail; + uint32_t cons = r->cons.tail; + uint32_t free_entries = r->capacity + cons - prod; + + if (n > free_entries) { + return 0; + } + + __rte_ring_enqueue_elems(r, prod, obj_table, sizeof(void *), n); + + r->prod.tail = prod + n; + + return n; +} + +static __rte_always_inline uint32_t gazelle_st_ring_dequeue_burst(struct rte_ring *r, void **obj_table, uint32_t n) +{ + uint32_t cons = r->cons.tail; + uint32_t prod = r->prod.tail; + uint32_t entries = prod - cons; + + if (n > entries) { + n = entries; + } + + if (n == 0) { + return 0; + } + + __rte_ring_dequeue_elems(r, cons, obj_table, sizeof(void *), n); + + r->cons.tail = cons + n; + + return n; +} +#endif void sys_calibrate_tsc(void); uint32_t sys_now(void); diff --git a/src/include/lwipopts.h b/src/include/lwipopts.h index df587c0..75d3c74 100644 --- a/src/include/lwipopts.h +++ b/src/include/lwipopts.h @@ -97,7 +97,7 @@ #define TCP_WND (40 * TCP_MSS) -#define TCP_SND_BUF (5 * TCP_MSS) +#define TCP_SND_BUF (40 * TCP_MSS) #define TCP_SND_QUEUELEN (8191) diff --git a/src/include/lwipsock.h b/src/include/lwipsock.h index eec4e8e..500292d 100644 --- a/src/include/lwipsock.h +++ b/src/include/lwipsock.h @@ -63,6 +63,7 @@ union lwip_sock_lastdata { struct protocol_stack; struct wakeup_poll; struct rte_ring; +#include <rte_common.h> #endif /** Contains all internal pointers and states used for a socket */ struct lwip_sock { @@ -92,28 +93,21 @@ struct lwip_sock { #endif #if USE_LIBOS + volatile uint32_t events __rte_cache_aligned; /* available events */ + struct pbuf *recv_lastdata __rte_cache_aligned; /* unread data in one pbuf */ + struct list_node recv_list __rte_cache_aligned; + struct list_node event_list __rte_cache_aligned; + struct list_node send_list __rte_cache_aligned; + char pad __rte_cache_aligned; + uint32_t epoll_events; /* registered events */ - volatile uint32_t events; /* available events */ - epoll_data_t ep_data; struct wakeup_poll *wakeup; + epoll_data_t ep_data; + bool wait_close; + struct lwip_sock *listen_next; /* listenfd list */ struct protocol_stack *stack; struct rte_ring *recv_ring; - struct rte_ring *recv_wait_free; - struct pbuf *recv_lastdata; /* unread data in one pbuf */ - struct pbuf *send_lastdata; /* unread data in one pbuf */ struct rte_ring *send_ring; - struct rte_ring *send_idle_ring; - int32_t recv_flags; - int32_t send_flags; - bool wait_close; - int32_t attach_fd; - struct lwip_sock *shadowed_sock; - struct list_node attach_list; - struct list_node listen_list; - struct list_node recv_list; - struct list_node event_list; - struct list_node send_list; - int32_t nextfd; /* listenfd list */ #endif }; @@ -160,7 +154,6 @@ get_socket_without_errno(int s) extern void add_recv_list(int32_t fd); extern ssize_t read_lwip_data(struct lwip_sock *sock, int32_t flags, u8_t apiflags); extern struct pbuf *write_lwip_data(struct lwip_sock *sock, uint16_t remain_size, uint8_t *apiflags); -extern void gazelle_clean_sock(int32_t fd); extern void gazelle_init_sock(int32_t fd); #endif /* USE_LIBOS */ diff --git a/src/include/posix_api.h b/src/include/posix_api.h index 2afd266..c8f2cf9 100644 --- a/src/include/posix_api.h +++ b/src/include/posix_api.h @@ -76,7 +76,7 @@ typedef struct { int (*poll_fn)(struct pollfd *fds, nfds_t nfds, int timeout); int (*ioctl_fn)(int fd, int cmd, ...); - int is_chld; + int ues_posix; } posix_api_t; extern posix_api_t *posix_api; -- 2.8.4.windows.1
Locations
Projects
Search
Status Monitor
Help
Open Build Service
OBS Manuals
API Documentation
OBS Portal
Reporting a Bug
Contact
Mailing List
Forums
Chat (IRC)
Twitter
Open Build Service (OBS)
is an
openSUSE project
.
浙ICP备2022010568号-2