From c72dfe116d768803bb0767faf2cd47faa63e5802 Mon Sep 17 00:00:00 2001 From: yinbin Date: Wed, 27 Dec 2023 11:44:34 +0800 Subject: [PATCH] sync fix rte_ring_create/free time consuming (cherry picked from commit a648226e16c6617ea4bb9f33eb3abdecf392292b) --- 0091-fix-alloc-not-free.patch | 49 +++++++ ...igaction-fix-deprecated-signal-flags.patch | 59 ++++++++ 0093-fix-gazellectl-c-msg-error.patch | 38 ++++++ ...eck-func-strdup-return-value-is-NULL.patch | 107 +++++++++++++++ ...parate_str_to_array-overflow-problem.patch | 26 ++++ 0096-use-default-nonblock-mode.patch | 76 +++++++++++ ...-rte_ring_create-free-time-consuming.patch | 128 ++++++++++++++++++ 0098-optimize-shutdown-exit-process.patch | 25 ++++ ...parate_str_to_array-overflow-problem.patch | 32 +++++ ...parate_str_to_array-overflow-problem.patch | 28 ++++ ...parate_str_to_array-overflow-problem.patch | 26 ++++ ...parate_str_to_array-overflow-problem.patch | 26 ++++ ...stack_setup_thread-array-doesn-t-init.patc | 25 ++++ 0104-fix-stack_setup_thread-array-range.patch | 21 +++ ...parate_str_to_array-overflow-problem.patch | 80 +++++++++++ gazelle.spec | 27 +++- 16 files changed, 772 insertions(+), 1 deletion(-) create mode 100644 0091-fix-alloc-not-free.patch create mode 100644 0092-sigaction-fix-deprecated-signal-flags.patch create mode 100644 0093-fix-gazellectl-c-msg-error.patch create mode 100644 0094-CFG-fix-check-func-strdup-return-value-is-NULL.patch create mode 100644 0095-fix-func-separate_str_to_array-overflow-problem.patch create mode 100644 0096-use-default-nonblock-mode.patch create mode 100644 0097-fix-rte_ring_create-free-time-consuming.patch create mode 100644 0098-optimize-shutdown-exit-process.patch create mode 100644 0099-fix-func-separate_str_to_array-overflow-problem.patch create mode 100644 0100-fix-func-separate_str_to_array-overflow-problem.patch create mode 100644 0101-fix-func-separate_str_to_array-overflow-problem.patch create mode 100644 0102-fix-func-separate_str_to_array-overflow-problem.patch create mode 100644 0103-fix-func-stack_setup_thread-array-doesn-t-init.patc create mode 100644 0104-fix-stack_setup_thread-array-range.patch create mode 100644 0105-fix-func-separate_str_to_array-overflow-problem.patch diff --git a/0091-fix-alloc-not-free.patch b/0091-fix-alloc-not-free.patch new file mode 100644 index 0000000..33c3c55 --- /dev/null +++ b/0091-fix-alloc-not-free.patch @@ -0,0 +1,49 @@ +From 053024d4cbedc106276e25a7ace5d833f8a62dea Mon Sep 17 00:00:00 2001 +From: compile_success <980965867@qq.com> +Date: Wed, 20 Dec 2023 01:37:12 +0000 +Subject: [PATCH] fix alloc not free + +--- + src/lstack/core/lstack_cfg.c | 2 ++ + src/lstack/core/lstack_dpdk.c | 2 ++ + 2 files changed, 4 insertions(+) + +diff --git a/src/lstack/core/lstack_cfg.c b/src/lstack/core/lstack_cfg.c +index 6324c97..f639473 100644 +--- a/src/lstack/core/lstack_cfg.c ++++ b/src/lstack/core/lstack_cfg.c +@@ -1185,11 +1185,13 @@ static int32_t parse_bond_slave_mac(void) + if (k >= GAZELLE_MAX_BOND_NUM) { + LSTACK_PRE_LOG(LSTACK_ERR, "cfg: too many slave mac address. The maximum number of mac address is %d.\n", + GAZELLE_MAX_BOND_NUM); ++ free(bond_slave_mac_tmp); + return -EINVAL; + } + ret = str_to_eth_addr(mac_addr, g_config_params.bond_slave_mac_addr[k].addr_bytes); + if (ret != 0) { + LSTACK_PRE_LOG(LSTACK_ERR, "cfg: invalid device name %s ret=%d.\n", mac_addr, ret); ++ free(bond_slave_mac_tmp); + return ret; + } + mac_addr = strtok_s(NULL, delim, &tmp); +diff --git a/src/lstack/core/lstack_dpdk.c b/src/lstack/core/lstack_dpdk.c +index e20dea8..6933ecd 100644 +--- a/src/lstack/core/lstack_dpdk.c ++++ b/src/lstack/core/lstack_dpdk.c +@@ -553,11 +553,13 @@ int32_t dpdk_ethdev_init(int port_id, bool bond_port) + int slave_id = rte_eth_bond_primary_get(port_id); + if (slave_id < 0) { + LSTACK_LOG(ERR, LSTACK, "dpdk get bond primary port failed port = %d\n", slave_id); ++ free(eth_params); + return slave_id; + } + ret = rte_eth_dev_info_get(slave_id, &slave_dev_info); + if (ret != 0) { + LSTACK_LOG(ERR, LSTACK, "dpdk get bond dev info failed ret = %d\n", ret); ++ free(eth_params); + return ret; + } + dev_info.rx_offload_capa = slave_dev_info.rx_offload_capa; +-- +2.27.0 + diff --git a/0092-sigaction-fix-deprecated-signal-flags.patch b/0092-sigaction-fix-deprecated-signal-flags.patch new file mode 100644 index 0000000..899febb --- /dev/null +++ b/0092-sigaction-fix-deprecated-signal-flags.patch @@ -0,0 +1,59 @@ +From 3af406243bb2a4a6c8ac5b3f1d98a9cd7e0af295 Mon Sep 17 00:00:00 2001 +From: yangchen +Date: Wed, 20 Dec 2023 11:37:13 +0800 +Subject: [PATCH] sigaction: fix deprecated signal flags + +--- + src/lstack/api/lstack_signal.c | 10 +++++++++- + src/lstack/core/lstack_lwip.c | 7 ++++--- + 2 files changed, 13 insertions(+), 4 deletions(-) + +diff --git a/src/lstack/api/lstack_signal.c b/src/lstack/api/lstack_signal.c +index 6da6eb4..314c14c 100644 +--- a/src/lstack/api/lstack_signal.c ++++ b/src/lstack/api/lstack_signal.c +@@ -57,7 +57,7 @@ static inline bool match_hijack_signal(int sig) + + static void lstack_sig_default_handler(int sig) + { +- LSTACK_LOG(ERR, LSTACK, "lstack dumped,caught signal:%d\n", sig); ++ LSTACK_LOG(ERR, LSTACK, "lstack dumped, caught signal: %d\n", sig); + if (get_global_cfg_params() && get_global_cfg_params()->is_primary) { + delete_primary_path(); + } +@@ -94,5 +94,13 @@ int lstack_sigaction(int sig_num, const struct sigaction *action, struct sigacti + new_action.sa_handler = lstack_sig_default_handler; + return posix_api->sigaction_fn(sig_num, &new_action, old_action); + } ++ ++ /* SA_INTERRUPT is deprecated, use SA_RESETHAND instead. */ ++ if ((match_hijack_signal(sig_num) != 0) && (action && action->sa_flags == SA_INTERRUPT)) { ++ new_action = *action; ++ new_action.sa_flags |= SA_RESETHAND; ++ return posix_api->sigaction_fn(sig_num, &new_action, old_action); ++ } ++ + return posix_api->sigaction_fn(sig_num, action, old_action); + } +diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c +index 34ec1bd..100f075 100644 +--- a/src/lstack/core/lstack_lwip.c ++++ b/src/lstack/core/lstack_lwip.c +@@ -564,10 +564,11 @@ static ssize_t do_lwip_fill_sendring(struct lwip_sock *sock, const void *buf, si + uint32_t write_avail = gazelle_ring_readable_count(sock->send_ring); + struct wakeup_poll *wakeup = sock->wakeup; + +- if (!netconn_is_nonblocking(sock->conn)) { +- while (write_avail < write_num) { +- write_avail = gazelle_ring_readable_count(sock->send_ring); ++ while (!netconn_is_nonblocking(sock->conn) && (write_avail < write_num)) { ++ if (sock->errevent > 0) { ++ GAZELLE_RETURN(ENOTCONN); + } ++ write_avail = gazelle_ring_readable_count(sock->send_ring); + } + + /* send_ring is full, data attach last pbuf */ +-- +2.27.0 + diff --git a/0093-fix-gazellectl-c-msg-error.patch b/0093-fix-gazellectl-c-msg-error.patch new file mode 100644 index 0000000..26cc6c0 --- /dev/null +++ b/0093-fix-gazellectl-c-msg-error.patch @@ -0,0 +1,38 @@ +From 887130c90c7875b4c0860ed0667224418e690752 Mon Sep 17 00:00:00 2001 +From: jinag12 +Date: Thu, 21 Dec 2023 09:03:02 +0000 +Subject: [PATCH] fix gazellectl -c msg error + +Signed-off-by: jinag12 +--- + src/lstack/core/lstack_lwip.c | 11 +++++------ + 1 file changed, 5 insertions(+), 6 deletions(-) + +diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c +index 15f99f9..1913d03 100644 +--- a/src/lstack/core/lstack_lwip.c ++++ b/src/lstack/core/lstack_lwip.c +@@ -1158,15 +1158,14 @@ static void copy_pcb_to_conn(struct gazelle_stat_lstack_conn_info *conn, const s + conn->keep_intvl = pcb->keep_intvl; + conn->keep_cnt = pcb->keep_cnt; + +- if (netconn != NULL && netconn->recvmbox != NULL) { +- conn->recv_cnt = rte_ring_count(netconn->recvmbox->ring); ++ if (netconn != NULL) { + conn->fd = netconn->socket; +- ++ conn->recv_cnt = (netconn->recvmbox == NULL) ? 0 : rte_ring_count(netconn->recvmbox->ring); + struct lwip_sock *sock = get_socket(netconn->socket); +- if (netconn->socket > 0 && sock != NULL && sock->recv_ring != NULL && sock->send_ring != NULL) { +- conn->recv_ring_cnt = gazelle_ring_readable_count(sock->recv_ring); ++ if (sock != NULL) { ++ conn->recv_ring_cnt = (sock->recv_ring == NULL) ? 0 : gazelle_ring_readable_count(sock->recv_ring); + conn->recv_ring_cnt += (sock->recv_lastdata) ? 1 : 0; +- conn->send_ring_cnt = gazelle_ring_readover_count(sock->send_ring); ++ conn->send_ring_cnt = (sock->send_ring == NULL) ? 0 : 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); +-- +2.27.0 + diff --git a/0094-CFG-fix-check-func-strdup-return-value-is-NULL.patch b/0094-CFG-fix-check-func-strdup-return-value-is-NULL.patch new file mode 100644 index 0000000..ddd4df6 --- /dev/null +++ b/0094-CFG-fix-check-func-strdup-return-value-is-NULL.patch @@ -0,0 +1,107 @@ +From 43985056c5446c0ad45acb2309165543bd8e15e1 Mon Sep 17 00:00:00 2001 +From: yinbin +Date: Fri, 22 Dec 2023 15:42:40 +0800 +Subject: [PATCH] CFG:fix check func strdup return value is NULL + +--- + src/lstack/core/lstack_cfg.c | 31 ++++++++++++++++++++----------- + 1 file changed, 20 insertions(+), 11 deletions(-) + +diff --git a/src/lstack/core/lstack_cfg.c b/src/lstack/core/lstack_cfg.c +index 6324c97..6e97c96 100644 +--- a/src/lstack/core/lstack_cfg.c ++++ b/src/lstack/core/lstack_cfg.c +@@ -145,6 +145,15 @@ static struct config_vector_t g_config_tbl[] = { + { NULL, NULL } + }; + ++static char* strdup_assert_return(const char* str) ++{ ++ char* result = strdup(str); ++ if (result == NULL) { ++ LSTACK_EXIT(1, "strdup_assert_return failed, func strdup return NULL!\n"); ++ } ++ return result; ++} ++ + struct cfg_params *get_global_cfg_params(void) + { + return &g_config_params; +@@ -336,15 +345,15 @@ static int32_t parse_stack_cpu_number(void) + if (!have_corelist_arg(g_config_params.dpdk_argc, g_config_params.dpdk_argv)) { + int32_t idx = get_param_idx(g_config_params.dpdk_argc, g_config_params.dpdk_argv, OPT_BIND_CORELIST); + if (idx < 0) { +- g_config_params.dpdk_argv[g_config_params.dpdk_argc] = strdup(OPT_BIND_CORELIST); ++ g_config_params.dpdk_argv[g_config_params.dpdk_argc] = strdup_assert_return(OPT_BIND_CORELIST); + g_config_params.dpdk_argc++; + +- g_config_params.dpdk_argv[g_config_params.dpdk_argc] = strdup(args); ++ g_config_params.dpdk_argv[g_config_params.dpdk_argc] = strdup_assert_return(args); + g_config_params.dpdk_argc++; + } + } + +- char *tmp_arg = strdup(args); ++ char *tmp_arg = strdup_assert_return(args); + int32_t cnt = separate_str_to_array(tmp_arg, g_config_params.cpus, CFG_MAX_CPUS, CFG_MAX_CPUS); + free(tmp_arg); + if (cnt <= 0 || cnt > CFG_MAX_CPUS) { +@@ -369,15 +378,15 @@ static int32_t parse_stack_cpu_number(void) + if (!have_corelist_arg(g_config_params.dpdk_argc, g_config_params.dpdk_argv)) { + int32_t idx = get_param_idx(g_config_params.dpdk_argc, g_config_params.dpdk_argv, OPT_BIND_CORELIST); + if (idx < 0) { +- g_config_params.dpdk_argv[g_config_params.dpdk_argc] = strdup(OPT_BIND_CORELIST); ++ g_config_params.dpdk_argv[g_config_params.dpdk_argc] = strdup_assert_return(OPT_BIND_CORELIST); + g_config_params.dpdk_argc++; + +- g_config_params.dpdk_argv[g_config_params.dpdk_argc] = strdup(args); ++ g_config_params.dpdk_argv[g_config_params.dpdk_argc] = strdup_assert_return(args); + g_config_params.dpdk_argc++; + } + } + +- char *tmp_arg_send = strdup(args); ++ char *tmp_arg_send = strdup_assert_return(args); + int32_t send_cpu_cnt = separate_str_to_array(tmp_arg_send, g_config_params.send_cpus, + CFG_MAX_CPUS, CFG_MAX_CPUS); + free(tmp_arg_send); +@@ -396,15 +405,15 @@ static int32_t parse_stack_cpu_number(void) + if (!have_corelist_arg(g_config_params.dpdk_argc, g_config_params.dpdk_argv)) { + int32_t idx = get_param_idx(g_config_params.dpdk_argc, g_config_params.dpdk_argv, OPT_BIND_CORELIST); + if (idx < 0) { +- g_config_params.dpdk_argv[g_config_params.dpdk_argc] = strdup(OPT_BIND_CORELIST); ++ g_config_params.dpdk_argv[g_config_params.dpdk_argc] = strdup_assert_return(OPT_BIND_CORELIST); + g_config_params.dpdk_argc++; + +- g_config_params.dpdk_argv[g_config_params.dpdk_argc] = strdup(args); ++ g_config_params.dpdk_argv[g_config_params.dpdk_argc] = strdup_assert_return(args); + g_config_params.dpdk_argc++; + } + } + +- char *tmp_arg_recv = strdup(args); ++ char *tmp_arg_recv = strdup_assert_return(args); + int32_t recv_cpu_cnt = separate_str_to_array(tmp_arg_recv, g_config_params.recv_cpus, + CFG_MAX_CPUS, CFG_MAX_CPUS); + free(tmp_arg_recv); +@@ -450,7 +459,7 @@ static int32_t parse_app_exclude_cpus(void) + return -EINVAL; + } + +- tmp_arg = strdup(args); ++ tmp_arg = strdup_assert_return(args); + cnt = separate_str_to_array(tmp_arg, g_config_params.app_exclude_cpus, CFG_MAX_CPUS, CFG_MAX_CPUS); + free(tmp_arg); + if (cnt <= 0 || cnt > CFG_MAX_CPUS) { +@@ -1176,7 +1185,7 @@ static int32_t parse_bond_slave_mac(void) + } + + int32_t k = 0; +- char *bond_slave_mac_tmp = strdup(bond_slave_mac); ++ char *bond_slave_mac_tmp = strdup_assert_return(bond_slave_mac); + char *tmp = NULL; + const char *delim = ";"; + +-- +2.27.0 + diff --git a/0095-fix-func-separate_str_to_array-overflow-problem.patch b/0095-fix-func-separate_str_to_array-overflow-problem.patch new file mode 100644 index 0000000..1cfbaf7 --- /dev/null +++ b/0095-fix-func-separate_str_to_array-overflow-problem.patch @@ -0,0 +1,26 @@ +From f6a7a9585bfb82680519034869b4141c514d9214 Mon Sep 17 00:00:00 2001 +From: yinbin +Date: Mon, 25 Dec 2023 00:34:55 +0800 +Subject: [PATCH] fix func separate_str_to_array overflow problem + +--- + src/common/gazelle_parse_config.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/src/common/gazelle_parse_config.c b/src/common/gazelle_parse_config.c +index 42e12b5..77d0b82 100644 +--- a/src/common/gazelle_parse_config.c ++++ b/src/common/gazelle_parse_config.c +@@ -80,6 +80,9 @@ int32_t separate_str_to_array(char *args, uint32_t *array, int32_t array_size, i + for (idx = min; idx <= max; idx++) { + array[count] = idx; + count++; ++ if (count > array_size) { ++ return -1; ++ } + } + min = array_size; + } else { +-- +2.27.0 + diff --git a/0096-use-default-nonblock-mode.patch b/0096-use-default-nonblock-mode.patch new file mode 100644 index 0000000..e9e1bb8 --- /dev/null +++ b/0096-use-default-nonblock-mode.patch @@ -0,0 +1,76 @@ +From 47ab261c2b533975a59b34f06da0ccf83692bb78 Mon Sep 17 00:00:00 2001 +From: compile_success <980965867@qq.com> +Date: Tue, 26 Dec 2023 16:53:58 +0000 +Subject: [PATCH] use default nonblock mode + +--- + src/lstack/core/lstack_cfg.c | 12 ++++++++++++ + src/lstack/core/lstack_protocol_stack.c | 5 ++++- + src/lstack/include/lstack_cfg.h | 1 + + 3 files changed, 17 insertions(+), 1 deletion(-) + +diff --git a/src/lstack/core/lstack_cfg.c b/src/lstack/core/lstack_cfg.c +index a292070..d9c23fb 100644 +--- a/src/lstack/core/lstack_cfg.c ++++ b/src/lstack/core/lstack_cfg.c +@@ -80,6 +80,7 @@ static int32_t parse_nic_rxqueue_size(void); + static int32_t parse_nic_txqueue_size(void); + static int32_t parse_stack_thread_mode(void); + static int32_t parse_nic_vlan_mode(void); ++static int32_t parse_defaule_nonblock_mode(void); + + #define PARSE_ARG(_arg, _arg_string, _default_val, _min_val, _max_val, _ret) \ + do { \ +@@ -142,6 +143,7 @@ static struct config_vector_t g_config_tbl[] = { + { "nic_txqueue_size", parse_nic_txqueue_size}, + { "stack_thread_mode", parse_stack_thread_mode }, + { "nic_vlan_mode", parse_nic_vlan_mode }, ++ { "nonblock_mode", parse_defaule_nonblock_mode }, + { NULL, NULL } + }; + +@@ -1280,3 +1282,13 @@ static int32_t parse_nic_vlan_mode(void) + return ret; + } + ++static int32_t parse_defaule_nonblock_mode(void) ++{ ++ int32_t ret; ++ PARSE_ARG(g_config_params.nonblock_mode, "nonblock_mode", 1, 0, 1, ret); ++ if (ret != 0) { ++ LSTACK_PRE_LOG(LSTACK_ERR, "cfg: invalid nonblock mode value %d. only support 0 or 1\n", \ ++ g_config_params.nonblock_mode); ++ } ++ return ret; ++} +diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c +index 9158d20..a000224 100644 +--- a/src/lstack/core/lstack_protocol_stack.c ++++ b/src/lstack/core/lstack_protocol_stack.c +@@ -1287,7 +1287,10 @@ int32_t stack_broadcast_accept4(int32_t fd, struct sockaddr *addr, socklen_t *ad + + int32_t stack_broadcast_accept(int32_t fd, struct sockaddr *addr, socklen_t *addrlen) + { +- return stack_broadcast_accept4(fd, addr, addrlen, 0); ++ if (get_global_cfg_params()->nonblock_mode) ++ return stack_broadcast_accept4(fd, addr, addrlen, O_NONBLOCK); ++ else ++ return stack_broadcast_accept4(fd, addr, addrlen, 0); + } + + static void stack_all_fds_close(void) +diff --git a/src/lstack/include/lstack_cfg.h b/src/lstack/include/lstack_cfg.h +index a6bdfd5..82e96d8 100644 +--- a/src/lstack/include/lstack_cfg.h ++++ b/src/lstack/include/lstack_cfg.h +@@ -118,6 +118,7 @@ struct cfg_params { + bool udp_enable; + struct cfg_nic_params nic; + bool stack_mode_rtc; ++ bool nonblock_mode; + }; + + struct cfg_params *get_global_cfg_params(void); +-- +2.27.0 + diff --git a/0097-fix-rte_ring_create-free-time-consuming.patch b/0097-fix-rte_ring_create-free-time-consuming.patch new file mode 100644 index 0000000..55b45a4 --- /dev/null +++ b/0097-fix-rte_ring_create-free-time-consuming.patch @@ -0,0 +1,128 @@ +From 66b0ba4be7a5c3b79482eafdc28fd75e8f44e761 Mon Sep 17 00:00:00 2001 +From: jiangheng +Date: Wed, 27 Dec 2023 10:26:07 +0800 +Subject: [PATCH] fix rte_ring_create/free time consuming + +--- + src/lstack/core/lstack_dpdk.c | 27 +++------------------------ + src/lstack/core/lstack_lwip.c | 14 ++++++-------- + src/lstack/include/lstack_dpdk.h | 1 - + 3 files changed, 9 insertions(+), 33 deletions(-) + +diff --git a/src/lstack/core/lstack_dpdk.c b/src/lstack/core/lstack_dpdk.c +index 6933ecd..729a84c 100644 +--- a/src/lstack/core/lstack_dpdk.c ++++ b/src/lstack/core/lstack_dpdk.c +@@ -245,43 +245,22 @@ struct rte_mempool *create_mempool(const char *name, uint32_t count, uint32_t si + return mempool; + } + +-struct rte_ring *create_ring(const char *name, uint32_t count, uint32_t flags, int32_t queue_id) +-{ +- char ring_name[RTE_RING_NAMESIZE] = {0}; +- struct rte_ring *ring; +- +- int32_t ret = snprintf_s(ring_name, sizeof(ring_name), RTE_RING_NAMESIZE - 1, +- "%s_%d_%d", name, get_global_cfg_params()->process_idx, queue_id); +- if (ret < 0) { +- LSTACK_LOG(ERR, LSTACK, "snprintf_s fail ret=%d\n", ret); +- return NULL; +- } +- +- ring = rte_ring_create(ring_name, count, rte_socket_id(), flags); +- if (ring == NULL) { +- LSTACK_LOG(ERR, LSTACK, "%s create failed. errno: %d.\n", name, rte_errno); +- } +- +- return ring; +-} +- + int32_t create_shared_ring(struct protocol_stack *stack) + { + lockless_queue_init(&stack->rpc_queue); + + if (use_ltran()) { +- stack->rx_ring = create_ring("RING_RX", VDEV_RX_QUEUE_SZ, RING_F_SP_ENQ | RING_F_SC_DEQ, stack->queue_id); ++ stack->rx_ring = gazelle_ring_create_fast("RING_RX", VDEV_RX_QUEUE_SZ, RING_F_SP_ENQ | RING_F_SC_DEQ); + if (stack->rx_ring == NULL) { + return -1; + } + +- stack->tx_ring = create_ring("RING_TX", VDEV_TX_QUEUE_SZ, RING_F_SP_ENQ | RING_F_SC_DEQ, stack->queue_id); ++ stack->tx_ring = gazelle_ring_create_fast("RING_TX", VDEV_TX_QUEUE_SZ, RING_F_SP_ENQ | RING_F_SC_DEQ); + if (stack->tx_ring == NULL) { + return -1; + } + +- stack->reg_ring = create_ring("SHARED_REG_RING", VDEV_REG_QUEUE_SZ, RING_F_SP_ENQ | RING_F_SC_DEQ, +- stack->queue_id); ++ stack->reg_ring = gazelle_ring_create_fast("SHARED_REG_RING", VDEV_REG_QUEUE_SZ, RING_F_SP_ENQ | RING_F_SC_DEQ); + if (stack->reg_ring == NULL) { + return -1; + } +diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c +index c167ba4..4953f3d 100644 +--- a/src/lstack/core/lstack_lwip.c ++++ b/src/lstack/core/lstack_lwip.c +@@ -72,13 +72,13 @@ static void reset_sock_data(struct lwip_sock *sock) + /* check null pointer in ring_free func */ + if (sock->recv_ring) { + free_ring_pbuf(sock->recv_ring); +- rte_ring_free(sock->recv_ring); ++ gazelle_ring_free_fast(sock->recv_ring); + sock->recv_ring = NULL; + } + + if (sock->send_ring) { + free_ring_pbuf(sock->send_ring); +- rte_ring_free(sock->send_ring); ++ gazelle_ring_free_fast(sock->send_ring); + sock->send_ring = NULL; + } + +@@ -169,7 +169,6 @@ static bool replenish_send_idlembuf(struct protocol_stack *stack, struct lwip_so + + void do_lwip_init_sock(int32_t fd) + { +- static _Atomic uint32_t name_tick = 0; + struct protocol_stack *stack = get_protocol_stack(); + struct lwip_sock *sock = get_socket(fd); + if (sock == NULL) { +@@ -178,18 +177,17 @@ void do_lwip_init_sock(int32_t fd) + + reset_sock_data(sock); + +- sock->recv_ring = create_ring("sock_recv", SOCK_RECV_RING_SIZE, RING_F_SP_ENQ | RING_F_SC_DEQ, +- atomic_fetch_add(&name_tick, 1)); ++ sock->recv_ring = gazelle_ring_create_fast("sock_recv", SOCK_RECV_RING_SIZE, RING_F_SP_ENQ | RING_F_SC_DEQ); + if (sock->recv_ring == NULL) { + LSTACK_LOG(ERR, LSTACK, "sock_recv create failed. errno: %d.\n", rte_errno); + return; + } + +- sock->send_ring = create_ring("sock_send", ++ sock->send_ring = gazelle_ring_create_fast("sock_send", + get_global_cfg_params()->send_ring_size, +- RING_F_SP_ENQ | RING_F_SC_DEQ, +- atomic_fetch_add(&name_tick, 1)); ++ RING_F_SP_ENQ | RING_F_SC_DEQ); + if (sock->send_ring == NULL) { ++ gazelle_ring_free_fast(sock->recv_ring); + LSTACK_LOG(ERR, LSTACK, "sock_send create failed. errno: %d.\n", rte_errno); + return; + } +diff --git a/src/lstack/include/lstack_dpdk.h b/src/lstack/include/lstack_dpdk.h +index 05f5bc6..4a160e0 100644 +--- a/src/lstack/include/lstack_dpdk.h ++++ b/src/lstack/include/lstack_dpdk.h +@@ -44,7 +44,6 @@ struct rte_mbuf; + int32_t fill_mbuf_to_ring(struct rte_mempool *mempool, struct rte_ring *ring, uint32_t mbuf_num); + int32_t dpdk_eal_init(void); + int32_t pktmbuf_pool_init(struct protocol_stack *stack); +-struct rte_ring *create_ring(const char *name, uint32_t count, uint32_t flags, int32_t queue_id); + struct rte_mempool *create_mempool(const char *name, uint32_t count, uint32_t size, + uint32_t flags, int32_t idx); + int32_t create_shared_ring(struct protocol_stack *stack); +-- +2.27.0 + diff --git a/0098-optimize-shutdown-exit-process.patch b/0098-optimize-shutdown-exit-process.patch new file mode 100644 index 0000000..e444784 --- /dev/null +++ b/0098-optimize-shutdown-exit-process.patch @@ -0,0 +1,25 @@ +From 5ca16b89699250a52d11ee5a181fef227fd399b6 Mon Sep 17 00:00:00 2001 +From: yangchen +Date: Mon, 18 Dec 2023 10:50:53 +0800 +Subject: [PATCH] optimize shutdown exit process + +--- + src/lstack/core/lstack_protocol_stack.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c +index 8dbd9ad..564f055 100644 +--- a/src/lstack/core/lstack_protocol_stack.c ++++ b/src/lstack/core/lstack_protocol_stack.c +@@ -722,7 +722,7 @@ void stack_shutdown(struct rpc_msg *msg) + struct protocol_stack *stack = get_protocol_stack_by_fd(fd); + struct lwip_sock *sock = get_socket(fd); + +- if (sock && NETCONN_IS_DATAOUT(sock)) { ++ if (sock && __atomic_load_n(&sock->call_num, __ATOMIC_ACQUIRE) > 0) { + msg->recall_flag = 1; + rpc_call(&stack->rpc_queue, msg); + return; +-- +2.27.0 + diff --git a/0099-fix-func-separate_str_to_array-overflow-problem.patch b/0099-fix-func-separate_str_to_array-overflow-problem.patch new file mode 100644 index 0000000..a4d790f --- /dev/null +++ b/0099-fix-func-separate_str_to_array-overflow-problem.patch @@ -0,0 +1,32 @@ +From e4eeed95dcbb47b3413e51df6c82e85a735aa31c Mon Sep 17 00:00:00 2001 +From: yinbin6 +Date: Mon, 25 Dec 2023 09:31:44 +0000 +Subject: [PATCH] fix func separate_str_to_array overflow problem + +Signed-off-by: yinbin6 +--- + src/common/gazelle_parse_config.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/src/common/gazelle_parse_config.c b/src/common/gazelle_parse_config.c +index 77d0b82..82be52c 100644 +--- a/src/common/gazelle_parse_config.c ++++ b/src/common/gazelle_parse_config.c +@@ -78,11 +78,11 @@ int32_t separate_str_to_array(char *args, uint32_t *array, int32_t array_size, i + min = idx; + } + for (idx = min; idx <= max; idx++) { ++ if (count > array_size) { ++ return -1; ++ } + array[count] = idx; + count++; +- if (count > array_size) { +- return -1; +- } + } + min = array_size; + } else { +-- +2.27.0 + diff --git a/0100-fix-func-separate_str_to_array-overflow-problem.patch b/0100-fix-func-separate_str_to_array-overflow-problem.patch new file mode 100644 index 0000000..8f3b2a5 --- /dev/null +++ b/0100-fix-func-separate_str_to_array-overflow-problem.patch @@ -0,0 +1,28 @@ +From 89abb6f4e231cf378b1e7f7415cfa196fdf7b3da Mon Sep 17 00:00:00 2001 +From: yinbin6 +Date: Mon, 25 Dec 2023 10:25:42 +0000 +Subject: [PATCH] fix func separate_str_to_array overflow problem + +Signed-off-by: yinbin6 +--- + src/common/gazelle_parse_config.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/src/common/gazelle_parse_config.c b/src/common/gazelle_parse_config.c +index 82be52c..9772af9 100644 +--- a/src/common/gazelle_parse_config.c ++++ b/src/common/gazelle_parse_config.c +@@ -79,8 +79,8 @@ int32_t separate_str_to_array(char *args, uint32_t *array, int32_t array_size, i + } + for (idx = min; idx <= max; idx++) { + if (count > array_size) { +- return -1; +- } ++ return -1; ++ } + array[count] = idx; + count++; + } +-- +2.27.0 + diff --git a/0101-fix-func-separate_str_to_array-overflow-problem.patch b/0101-fix-func-separate_str_to_array-overflow-problem.patch new file mode 100644 index 0000000..c0e7eb4 --- /dev/null +++ b/0101-fix-func-separate_str_to_array-overflow-problem.patch @@ -0,0 +1,26 @@ +From 58248cb2bae3d2c50f65b3ade360fc14716a0ce7 Mon Sep 17 00:00:00 2001 +From: yinbin6 +Date: Mon, 25 Dec 2023 11:06:18 +0000 +Subject: [PATCH] fix func separate_str_to_array overflow problem + +Signed-off-by: yinbin6 +--- + src/common/gazelle_parse_config.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/common/gazelle_parse_config.c b/src/common/gazelle_parse_config.c +index 9772af9..16efdc8 100644 +--- a/src/common/gazelle_parse_config.c ++++ b/src/common/gazelle_parse_config.c +@@ -78,7 +78,7 @@ int32_t separate_str_to_array(char *args, uint32_t *array, int32_t array_size, i + min = idx; + } + for (idx = min; idx <= max; idx++) { +- if (count > array_size) { ++ if (count >= array_size) { + return -1; + } + array[count] = idx; +-- +2.27.0 + diff --git a/0102-fix-func-separate_str_to_array-overflow-problem.patch b/0102-fix-func-separate_str_to_array-overflow-problem.patch new file mode 100644 index 0000000..4266ac5 --- /dev/null +++ b/0102-fix-func-separate_str_to_array-overflow-problem.patch @@ -0,0 +1,26 @@ +From fafd5c387910da2f81f38c320b3da01ffd97c6c2 Mon Sep 17 00:00:00 2001 +From: yinbin6 +Date: Mon, 25 Dec 2023 13:01:39 +0000 +Subject: [PATCH] fix func separate_str_to_array overflow problem + +Signed-off-by: yinbin6 +--- + src/common/gazelle_parse_config.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/common/gazelle_parse_config.c b/src/common/gazelle_parse_config.c +index 16efdc8..1adce78 100644 +--- a/src/common/gazelle_parse_config.c ++++ b/src/common/gazelle_parse_config.c +@@ -33,7 +33,7 @@ + + int32_t separate_str_to_array(char *args, uint32_t *array, int32_t array_size, int32_t max_value) + { +- uint32_t count = 0; ++ int32_t count = 0; + char *end = NULL; + int32_t min, max; + int32_t idx; +-- +2.27.0 + diff --git a/0103-fix-func-stack_setup_thread-array-doesn-t-init.patc b/0103-fix-func-stack_setup_thread-array-doesn-t-init.patc new file mode 100644 index 0000000..5015c7a --- /dev/null +++ b/0103-fix-func-stack_setup_thread-array-doesn-t-init.patc @@ -0,0 +1,25 @@ +From 9ed5bee888ab4936372a81919d894d8fd291e7c1 Mon Sep 17 00:00:00 2001 +From: yinbin +Date: Tue, 26 Dec 2023 22:49:03 +0800 +Subject: [PATCH] fix func stack_setup_thread array doesn't init + +--- + src/lstack/core/lstack_protocol_stack.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c +index 829313f..0aff1b4 100644 +--- a/src/lstack/core/lstack_protocol_stack.c ++++ b/src/lstack/core/lstack_protocol_stack.c +@@ -648,7 +648,7 @@ int32_t stack_setup_thread(void) + int32_t ret; + char name[PATH_MAX]; + int queue_num = get_global_cfg_params()->num_queue; +- struct thread_params *t_params[queue_num]; ++ struct thread_params *t_params[queue_num] = {0}; + int process_index = get_global_cfg_params()->process_idx; + + for (uint32_t i = 0; i < queue_num; i++) { +-- +2.27.0 + diff --git a/0104-fix-stack_setup_thread-array-range.patch b/0104-fix-stack_setup_thread-array-range.patch new file mode 100644 index 0000000..57b54ed --- /dev/null +++ b/0104-fix-stack_setup_thread-array-range.patch @@ -0,0 +1,21 @@ +From f6df059cf18aa0019c5bdea8947a5b4a53c02bde Mon Sep 17 00:00:00 2001 +From: yinbin +Date: Wed, 27 Dec 2023 09:58:30 +0800 +Subject: [PATCH] fix stack_setup_thread array range + +diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c +index 0aff1b4..b5d4ea3 100644 +--- a/src/lstack/core/lstack_protocol_stack.c ++++ b/src/lstack/core/lstack_protocol_stack.c +@@ -648,7 +648,7 @@ int32_t stack_setup_thread(void) + int32_t ret; + char name[PATH_MAX]; + int queue_num = get_global_cfg_params()->num_queue; +- struct thread_params *t_params[queue_num] = {0}; ++ struct thread_params *t_params[PROTOCOL_STACK_MAX] = {NULL}; + int process_index = get_global_cfg_params()->process_idx; + + for (uint32_t i = 0; i < queue_num; i++) { +-- +2.27.0 + diff --git a/0105-fix-func-separate_str_to_array-overflow-problem.patch b/0105-fix-func-separate_str_to_array-overflow-problem.patch new file mode 100644 index 0000000..69a3de4 --- /dev/null +++ b/0105-fix-func-separate_str_to_array-overflow-problem.patch @@ -0,0 +1,80 @@ +From c6de43f7e7cb866f8d5ddd453c73783d5daafca0 Mon Sep 17 00:00:00 2001 +From: yinbin +Date: Wed, 27 Dec 2023 12:22:06 +0800 +Subject: [PATCH] fix func separate_str_to_array overflow problem + +--- + src/lstack/core/lstack_protocol_stack.c | 25 +++++++++++++++++++------ + 1 file changed, 19 insertions(+), 6 deletions(-) + +diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c +index b5d4ea3..f3d2452 100644 +--- a/src/lstack/core/lstack_protocol_stack.c ++++ b/src/lstack/core/lstack_protocol_stack.c +@@ -651,44 +651,57 @@ int32_t stack_setup_thread(void) + struct thread_params *t_params[PROTOCOL_STACK_MAX] = {NULL}; + int process_index = get_global_cfg_params()->process_idx; + ++ for (uint32_t i = 0; i < queue_num; ++i) { ++ t_params[i] = malloc(sizeof(struct thread_params)); ++ if (t_params[i] == NULL) { ++ goto OUT; ++ } ++ } ++ + for (uint32_t i = 0; i < queue_num; i++) { + if (get_global_cfg_params()->seperate_send_recv) { + if (i % 2 == 0) { + ret = sprintf_s(name, sizeof(name), "%s_%d_%d", LSTACK_RECV_THREAD_NAME, process_index, i / 2); + if (ret < 0) { +- return -1; ++ goto OUT; + } + } else { + ret = sprintf_s(name, sizeof(name), "%s_%d_%d", LSTACK_SEND_THREAD_NAME, process_index, i / 2); + if (ret < 0) { +- return -1; ++ goto OUT; + } + } + } else { + ret = sprintf_s(name, sizeof(name), "%s", LSTACK_THREAD_NAME); + if (ret < 0) { +- return -1; ++ goto OUT; + } + } + +- t_params[i] = malloc(sizeof(struct thread_params)); + t_params[i]->idx = i; + t_params[i]->queue_id = process_index * queue_num + i; + + ret = create_thread((void *)t_params[i], name, gazelle_stack_thread); + if (ret != 0) { +- return ret; ++ goto OUT; + } + } + + /* 2: wait stack thread and kernel_event thread init finish */ + wait_sem_value(&g_stack_group.sem_stack_setup, queue_num * 2); + if (g_stack_group.stack_setup_fail) { +- return -1; ++ goto OUT; + } + g_stack_group.stack_num = queue_num; + + return 0; ++OUT: ++ for (int32_t i = 0; i < queue_num; ++i) { ++ if (t_params[i] != NULL) { ++ free(t_params[i]); ++ } ++ } ++ return -1; + } + + void stack_arp(struct rpc_msg *msg) +-- +2.27.0 + diff --git a/gazelle.spec b/gazelle.spec index 5bf5033..c348de6 100644 --- a/gazelle.spec +++ b/gazelle.spec @@ -2,7 +2,7 @@ Name: gazelle Version: 1.0.2 -Release: 21 +Release: 22 Summary: gazelle is a high performance user-mode stack License: MulanPSL-2.0 URL: https://gitee.com/openeuler/gazelle @@ -104,6 +104,21 @@ Patch9087: 0087-mod-time-err.patch Patch9088: 0088-fix-gazellectl-lstack-show-ip-r-with-ltran-error-log.patch Patch9089: 0089-fix-udp-multicast-bind-error.patch Patch9090: 0090-support-netperf.patch +Patch9091: 0091-fix-alloc-not-free.patch +Patch9092: 0092-sigaction-fix-deprecated-signal-flags.patch +Patch9093: 0093-fix-gazellectl-c-msg-error.patch +Patch9094: 0094-CFG-fix-check-func-strdup-return-value-is-NULL.patch +Patch9095: 0095-fix-func-separate_str_to_array-overflow-problem.patch +Patch9096: 0096-use-default-nonblock-mode.patch +Patch9097: 0097-fix-rte_ring_create-free-time-consuming.patch +Patch9098: 0098-optimize-shutdown-exit-process.patch +Patch9099: 0099-fix-func-separate_str_to_array-overflow-problem.patch +Patch9100: 0100-fix-func-separate_str_to_array-overflow-problem.patch +Patch9101: 0101-fix-func-separate_str_to_array-overflow-problem.patch +Patch9102: 0102-fix-func-separate_str_to_array-overflow-problem.patch +Patch9103: 0103-fix-func-stack_setup_thread-array-doesn-t-init.patc +Patch9104: 0104-fix-stack_setup_thread-array-range.patch +Patch9105: 0105-fix-func-separate_str_to_array-overflow-problem.patch %description %{name} is a high performance user-mode stack. @@ -145,6 +160,16 @@ install -Dpm 0640 %{_builddir}/%{name}-%{version}/src/ltran/ltran.conf %{b %config(noreplace) %{conf_path}/ltran.conf %changelog +* Wed Dec 27 2023 yinbin6 - 1.0.2-22 +- fix rte_ring_create/free time consuming +- use default nonblock mode +- fix func separate_str_to_array overflow problem +- CFG:fix check func strdup return value is NULL +- fix gazellectl -c msg error +- sigaction: fix deprecated signal flags +- fix alloc not free +- optimize shutdown exit process + * Tue Dec 19 2023 yinbin6 - 1.0.2-21 - support netperf - fix udp multicast bind error