gazelle/0245-cleancode-refactor-gazelle_list.h.patch
jiangheng12 50b48909f3 sync drop netbuf in read_lwip_data to fix mem overflow
(cherry picked from commit 1aabf9e9472126c472a28577057044b4649bbe11)
2023-05-29 21:59:17 +08:00

456 lines
18 KiB
Diff

From a62c495e7124a958f80615a375fa1c1c32852936 Mon Sep 17 00:00:00 2001
From: Lemmy Huang <huangliming5@huawei.com>
Date: Thu, 25 May 2023 16:25:11 +0800
Subject: [PATCH] cleancode: refactor gazelle_list.h
Signed-off-by: Lemmy Huang <huangliming5@huawei.com>
---
src/common/gazelle_base_func.h | 6 ---
src/lstack/api/lstack_epoll.c | 72 +++++++++++--------------
src/lstack/core/lstack_lwip.c | 55 +++++++------------
src/lstack/core/lstack_protocol_stack.c | 16 +++---
src/lstack/core/lstack_stack_stat.c | 7 +--
5 files changed, 64 insertions(+), 92 deletions(-)
diff --git a/src/common/gazelle_base_func.h b/src/common/gazelle_base_func.h
index d21ef5f..f83a8eb 100644
--- a/src/common/gazelle_base_func.h
+++ b/src/common/gazelle_base_func.h
@@ -25,16 +25,10 @@
return -1; \
} while (0)
-#define NODE_ENTRY(node, type, member) \
- ((type*)((char*)(node) - (size_t)&((type*)0)->member))
-
int32_t separate_str_to_array(char *args, uint32_t *array, int32_t array_size, int32_t max_value);
int32_t check_and_set_run_dir(void);
int32_t filename_check(const char* args);
-#undef container_of
-#define container_of(ptr, type, field) ((type *)(void*)(((char *)(ptr)) - offsetof(type, field)))
-
#endif /* ifndef __GAZELLE_BASE_FUNC_H__ */
diff --git a/src/lstack/api/lstack_epoll.c b/src/lstack/api/lstack_epoll.c
index 2fba2ee..64c3600 100644
--- a/src/lstack/api/lstack_epoll.c
+++ b/src/lstack/api/lstack_epoll.c
@@ -67,35 +67,26 @@ void add_sock_event(struct lwip_sock *sock, uint32_t event)
}
sock->events |= (event == EPOLLERR) ? (EPOLLIN | EPOLLERR) : (event & sock->epoll_events);
- if (list_is_null(&sock->event_list)) {
- list_add_node(&wakeup->event_list, &sock->event_list);
+ if (list_node_null(&sock->event_list)) {
+ list_add_node(&sock->event_list, &wakeup->event_list);
}
pthread_spin_unlock(&wakeup->event_list_lock);
}
struct protocol_stack *stack = sock->stack;
- if (list_is_null(&wakeup->wakeup_list[stack->stack_idx])) {
- list_add_node(&stack->wakeup_list, &wakeup->wakeup_list[stack->stack_idx]);
+ if (list_node_null(&wakeup->wakeup_list[stack->stack_idx])) {
+ list_add_node(&wakeup->wakeup_list[stack->stack_idx], &stack->wakeup_list);
}
}
void wakeup_stack_epoll(struct protocol_stack *stack)
{
- struct list_node *node, *temp;
-
- list_for_each_safe(node, temp, &stack->wakeup_list) {
- /* When temp is NULL, find the tail node in the wekeup_list and connect it to the back of the node */
- if (unlikely(temp == NULL)) {
- struct list_node *nod = &stack->wakeup_list;
- while (nod->prev && nod->prev != node) {
- nod = nod->prev;
- }
- nod->prev = node;
- node->next = nod;
- temp = nod;
- }
+ struct wakeup_poll *wakeup;
+ struct list_node *node, *next;
- struct wakeup_poll *wakeup = container_of((node - stack->stack_idx), struct wakeup_poll, wakeup_list);
+ list_for_each_node(node, next, &stack->wakeup_list) {
+ node -= stack->stack_idx; /* array header address */
+ wakeup = list_entry((typeof(((struct wakeup_poll *)0)->wakeup_list) *)node, struct wakeup_poll, wakeup_list);
if (__atomic_load_n(&wakeup->in_wait, __ATOMIC_ACQUIRE)) {
__atomic_store_n(&wakeup->in_wait, false, __ATOMIC_RELEASE);
@@ -104,7 +95,7 @@ void wakeup_stack_epoll(struct protocol_stack *stack)
stack->stats.wakeup_events++;
}
- list_del_node_null(&wakeup->wakeup_list[stack->stack_idx]);
+ list_del_node(&wakeup->wakeup_list[stack->stack_idx]);
}
}
@@ -155,8 +146,8 @@ static void raise_pending_events(struct wakeup_poll *wakeup, struct lwip_sock *s
pthread_spin_lock(&wakeup->event_list_lock);
sock->events = event;
if (wakeup->type == WAKEUP_EPOLL && (sock->events & sock->epoll_events) &&
- list_is_null(&sock->event_list)) {
- list_add_node(&wakeup->event_list, &sock->event_list);
+ list_node_null(&sock->event_list)) {
+ list_add_node(&sock->event_list, &wakeup->event_list);
}
pthread_spin_unlock(&wakeup->event_list_lock);
}
@@ -183,7 +174,7 @@ int32_t lstack_do_epoll_create(int32_t fd)
}
for (uint32_t i = 0; i < PROTOCOL_STACK_MAX; i++) {
- init_list_node_null(&wakeup->wakeup_list[i]);
+ list_init_node(&wakeup->wakeup_list[i]);
}
if (pthread_mutex_init(&wakeup->wait, NULL) != 0) {
@@ -195,12 +186,12 @@ int32_t lstack_do_epoll_create(int32_t fd)
__atomic_store_n(&wakeup->in_wait, false, __ATOMIC_RELEASE);
struct protocol_stack_group *stack_group = get_protocol_stack_group();
- init_list_node_null(&wakeup->poll_list);
+ list_init_node(&wakeup->poll_list);
pthread_spin_lock(&stack_group->poll_list_lock);
- list_add_node(&stack_group->poll_list, &wakeup->poll_list);
+ list_add_node(&wakeup->poll_list, &stack_group->poll_list);
pthread_spin_unlock(&stack_group->poll_list_lock);
- init_list_node(&wakeup->event_list);
+ list_init_head(&wakeup->event_list);
pthread_spin_init(&wakeup->event_list_lock, PTHREAD_PROCESS_PRIVATE);
wakeup->type = WAKEUP_EPOLL;
@@ -239,6 +230,7 @@ int32_t lstack_epoll_close(int32_t fd)
struct protocol_stack_group *stack_group = get_protocol_stack_group();
struct wakeup_poll *wakeup = sock->wakeup;
+ struct list_node *node, *next;
if (wakeup == NULL) {
return 0;
}
@@ -247,17 +239,16 @@ int32_t lstack_epoll_close(int32_t fd)
stack_broadcast_clean_epoll(wakeup);
- struct list_node *node, *temp;
pthread_spin_lock(&wakeup->event_list_lock);
- list_for_each_safe(node, temp, &wakeup->event_list) {
- struct lwip_sock *sock = container_of(node, struct lwip_sock, event_list);
- list_del_node_null(&sock->event_list);
+ list_for_each_node(node, next, &wakeup->event_list) {
+ struct lwip_sock *sock = list_entry(node, struct lwip_sock, event_list);
+ list_del_node(&sock->event_list);
}
pthread_spin_unlock(&wakeup->event_list_lock);
pthread_spin_destroy(&wakeup->event_list_lock);
pthread_spin_lock(&stack_group->poll_list_lock);
- list_del_node_null(&wakeup->poll_list);
+ list_del_node(&wakeup->poll_list);
pthread_spin_unlock(&stack_group->poll_list_lock);
pthread_mutex_destroy(&wakeup->wait);
@@ -348,7 +339,7 @@ int32_t lstack_epoll_ctl(int32_t epfd, int32_t op, int32_t fd, struct epoll_even
sock->epoll_events = 0;
wakeup->stack_fd_cnt[sock->stack->stack_idx]--;
pthread_spin_lock(&wakeup->event_list_lock);
- list_del_node_null(&sock->event_list);
+ list_del_node(&sock->event_list);
pthread_spin_unlock(&wakeup->event_list_lock);
break;
default:
@@ -364,26 +355,27 @@ int32_t lstack_epoll_ctl(int32_t epfd, int32_t op, int32_t fd, struct epoll_even
static int32_t epoll_lwip_event(struct wakeup_poll *wakeup, struct epoll_event *events, uint32_t maxevents)
{
int32_t event_num = 0;
- struct list_node *node, *temp;
+ struct lwip_sock *sock;
+ struct list_node *node, *next;
pthread_spin_lock(&wakeup->event_list_lock);
- list_for_each_safe(node, temp, &wakeup->event_list) {
- struct lwip_sock *sock = container_of(node, struct lwip_sock, event_list);
+ list_for_each_node(node, next, &wakeup->event_list) {
+ sock = list_entry(node, struct lwip_sock, event_list);
if ((sock->epoll_events & sock->events) == 0) {
- list_del_node_null(&sock->event_list);
+ list_del_node(&sock->event_list);
continue;
}
if (sock->epoll_events & EPOLLET) {
- list_del_node_null(&sock->event_list);
+ list_del_node(&sock->event_list);
}
/* EPOLLONESHOT: generate event after epoll_ctl add/mod event again
epoll_event set 0 avoid generating event util epoll_ctl set epoll_event a valu */
if (sock->epoll_events & EPOLLONESHOT) {
- list_del_node_null(&sock->event_list);
+ list_del_node(&sock->event_list);
sock->epoll_events = 0;
}
@@ -519,7 +511,7 @@ static int32_t init_poll_wakeup_data(struct wakeup_poll *wakeup)
__atomic_store_n(&wakeup->in_wait, false, __ATOMIC_RELEASE);
for (uint32_t i = 0; i < PROTOCOL_STACK_MAX; i++) {
- init_list_node_null(&wakeup->wakeup_list[i]);
+ list_init_node(&wakeup->wakeup_list[i]);
}
wakeup->epollfd = posix_api->epoll_create_fn(POLL_KERNEL_EVENTS);
@@ -542,9 +534,9 @@ static int32_t init_poll_wakeup_data(struct wakeup_poll *wakeup)
}
struct protocol_stack_group *stack_group = get_protocol_stack_group();
- init_list_node_null(&wakeup->poll_list);
+ list_init_node(&wakeup->poll_list);
pthread_spin_lock(&stack_group->poll_list_lock);
- list_add_node(&stack_group->poll_list, &wakeup->poll_list);
+ list_add_node(&wakeup->poll_list, &stack_group->poll_list);
pthread_spin_unlock(&stack_group->poll_list_lock);
int32_t stack_count[PROTOCOL_STACK_MAX] = {0};
diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c
index 035311f..08836da 100644
--- a/src/lstack/core/lstack_lwip.c
+++ b/src/lstack/core/lstack_lwip.c
@@ -202,8 +202,8 @@ void gazelle_init_sock(int32_t fd)
(void)replenish_send_idlembuf(stack, sock);
sock->stack = stack;
- init_list_node_null(&sock->recv_list);
- init_list_node_null(&sock->event_list);
+ list_init_node(&sock->recv_list);
+ list_init_node(&sock->event_list);
}
void gazelle_clean_sock(int32_t fd)
@@ -215,7 +215,7 @@ void gazelle_clean_sock(int32_t fd)
if (sock->wakeup && sock->wakeup->type == WAKEUP_EPOLL) {
pthread_spin_lock(&sock->wakeup->event_list_lock);
- list_del_node_null(&sock->event_list);
+ list_del_node(&sock->event_list);
pthread_spin_unlock(&sock->wakeup->event_list_lock);
}
@@ -223,7 +223,7 @@ void gazelle_clean_sock(int32_t fd)
reset_sock_data(sock);
- list_del_node_null(&sock->recv_list);
+ list_del_node(&sock->recv_list);
}
void gazelle_free_pbuf(struct pbuf *pbuf)
@@ -342,7 +342,7 @@ static inline void del_data_out_event(struct lwip_sock *sock)
sock->events &= ~EPOLLOUT;
if (sock->events == 0) {
- list_del_node_null(&sock->event_list);
+ list_del_node(&sock->event_list);
}
}
@@ -874,7 +874,7 @@ static inline void del_data_in_event(struct lwip_sock *sock)
sock->events &= ~EPOLLIN;
if (sock->events == 0) {
- list_del_node_null(&sock->event_list);
+ list_del_node(&sock->event_list);
}
}
@@ -1121,20 +1121,18 @@ void add_recv_list(int32_t fd)
{
struct lwip_sock *sock = lwip_get_socket_nouse(fd);
- if (sock && sock->stack && list_is_null(&sock->recv_list)) {
- list_add_node(&sock->stack->recv_list, &sock->recv_list);
+ if (sock && sock->stack && list_node_null(&sock->recv_list)) {
+ list_add_node(&sock->recv_list, &sock->stack->recv_list);
}
}
void read_same_node_recv_list(struct protocol_stack *stack)
{
- struct list_node *list = &(stack->same_node_recv_list);
- struct list_node *node, *temp;
+ struct list_node *node, *next;
struct lwip_sock *sock;
-
- list_for_each_safe(node, temp, list) {
- sock = container_of(node, struct lwip_sock, recv_list);
-
+
+ list_for_each_node(node, next, &stack->same_node_recv_list) {
+ sock = list_entry(node, struct lwip_sock, recv_list);
if (sock->same_node_rx_ring != NULL && same_node_ring_count(sock)) {
add_sock_event(sock, EPOLLIN);
}
@@ -1143,23 +1141,22 @@ void read_same_node_recv_list(struct protocol_stack *stack)
void read_recv_list(struct protocol_stack *stack, uint32_t max_num)
{
- struct list_node *list = &(stack->recv_list);
- struct list_node *node, *temp;
+ struct list_node *node, *next;
struct lwip_sock *sock;
uint32_t read_num = 0;
- list_for_each_safe(node, temp, list) {
- sock = container_of(node, struct lwip_sock, recv_list);
+ list_for_each_node(node, next, &stack->recv_list) {
+ sock = list_entry(node, struct lwip_sock, recv_list);
if (++read_num > max_num) {
/* list head move to next send */
list_del_node(&stack->recv_list);
- list_add_node(&sock->recv_list, &stack->recv_list);
+ list_add_node(&stack->recv_list, &sock->recv_list);
break;
}
if (sock->conn == NULL || sock->conn->recvmbox == NULL || rte_ring_count(sock->conn->recvmbox->ring) == 0) {
- list_del_node_null(&sock->recv_list);
+ list_del_node(&sock->recv_list);
continue;
}
@@ -1229,7 +1226,7 @@ static void copy_pcb_to_conn(struct gazelle_stat_lstack_conn_info *conn, const s
conn->send_ring_cnt = gazelle_ring_readover_count(sock->send_ring);
conn->events = sock->events;
conn->epoll_events = sock->epoll_events;
- conn->eventlist = !list_is_null(&sock->event_list);
+ conn->eventlist = !list_node_null(&sock->event_list);
}
}
}
@@ -1368,18 +1365,6 @@ void get_lwip_connnum(struct rpc_msg *msg)
msg->result = conn_num;
}
-static uint32_t get_list_count(struct list_node *list)
-{
- struct list_node *node, *temp;
- uint32_t count = 0;
-
- list_for_each_safe(node, temp, list) {
- count++;
- }
-
- return count;
-}
-
void stack_mempool_size(struct rpc_msg *msg)
{
struct protocol_stack *stack = (struct protocol_stack*)msg->args[MSG_ARG_0].p;
@@ -1391,7 +1376,7 @@ void stack_recvlist_count(struct rpc_msg *msg)
{
struct protocol_stack *stack = (struct protocol_stack*)msg->args[MSG_ARG_0].p;
- msg->result = get_list_count(&stack->recv_list);
+ msg->result = list_get_count(&stack->recv_list);
}
void netif_poll(struct netif *netif)
@@ -1513,7 +1498,7 @@ err_t find_same_node_memzone(struct tcp_pcb *pcb, struct lwip_sock *nsock)
/* rcvlink init in alloc_socket() */
/* remove from g_rcv_process_list in free_socket */
- list_add_node(&nsock->stack->same_node_recv_list, &nsock->recv_list);
+ list_add_node(&nsock->recv_list, &nsock->stack->same_node_recv_list);
return 0;
}
diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c
index b7aeeae..c31e65b 100644
--- a/src/lstack/core/lstack_protocol_stack.c
+++ b/src/lstack/core/lstack_protocol_stack.c
@@ -288,9 +288,9 @@ static int32_t init_stack_value(struct protocol_stack *stack, void *arg)
stack->stack_idx = t_params->idx;
stack->lwip_stats = &lwip_stats;
- init_list_node(&stack->recv_list);
- init_list_node(&stack->same_node_recv_list);
- init_list_node(&stack->wakeup_list);
+ list_init_head(&stack->recv_list);
+ list_init_head(&stack->same_node_recv_list);
+ list_init_head(&stack->wakeup_list);
sys_calibrate_tsc();
stack_stat_init();
@@ -421,8 +421,8 @@ static void wakeup_kernel_event(struct protocol_stack *stack)
}
__atomic_store_n(&wakeup->have_kernel_event, true, __ATOMIC_RELEASE);
- if (list_is_null(&wakeup->wakeup_list[stack->stack_idx])) {
- list_add_node(&stack->wakeup_list, &wakeup->wakeup_list[stack->stack_idx]);
+ if (list_node_null(&wakeup->wakeup_list[stack->stack_idx])) {
+ list_add_node(&wakeup->wakeup_list[stack->stack_idx], &stack->wakeup_list);
}
}
@@ -545,7 +545,7 @@ int32_t init_protocol_stack(void)
stack_group->stack_num = get_global_cfg_params()->num_cpu * 2;
}
- init_list_node(&stack_group->poll_list);
+ list_init_head(&stack_group->poll_list);
pthread_spin_init(&stack_group->poll_list_lock, PTHREAD_PROCESS_PRIVATE);
pthread_spin_init(&stack_group->socket_lock, PTHREAD_PROCESS_PRIVATE);
@@ -814,7 +814,7 @@ void stack_clean_epoll(struct rpc_msg *msg)
struct protocol_stack *stack = get_protocol_stack();
struct wakeup_poll *wakeup = (struct wakeup_poll *)msg->args[MSG_ARG_0].p;
- list_del_node_null(&wakeup->wakeup_list[stack->stack_idx]);
+ list_del_node(&wakeup->wakeup_list[stack->stack_idx]);
}
/* when fd is listenfd, listenfd of all protocol stack thread will be closed */
@@ -929,7 +929,7 @@ static void inline del_accept_in_event(struct lwip_sock *sock)
if (!NETCONN_IS_ACCEPTIN(sock)) {
sock->events &= ~EPOLLIN;
if (sock->events == 0) {
- list_del_node_null(&sock->event_list);
+ list_del_node(&sock->event_list);
}
}
diff --git a/src/lstack/core/lstack_stack_stat.c b/src/lstack/core/lstack_stack_stat.c
index a66445b..9f2e93a 100644
--- a/src/lstack/core/lstack_stack_stat.c
+++ b/src/lstack/core/lstack_stack_stat.c
@@ -128,12 +128,13 @@ static void set_latency_start_flag(bool start)
static void get_wakeup_stat(struct protocol_stack_group *stack_group, struct protocol_stack *stack,
struct gazelle_wakeup_stat *stat)
{
- struct list_node *node, *temp;
+ struct wakeup_poll *wakeup;
+ struct list_node *node, *next;
pthread_spin_lock(&stack_group->poll_list_lock);
- list_for_each_safe(node, temp, &stack_group->poll_list) {
- struct wakeup_poll *wakeup = container_of(node, struct wakeup_poll, poll_list);
+ list_for_each_node(node, next, &stack_group->poll_list) {
+ wakeup = list_entry(node, struct wakeup_poll, poll_list);
if (wakeup->bind_stack == stack) {
stat->app_events += wakeup->stat.app_events;
--
2.23.0