diff --git a/0122-fix-uninit-stack-port_id-when-use-mutil-NIC.patch b/0122-fix-uninit-stack-port_id-when-use-mutil-NIC.patch new file mode 100644 index 0000000..9c8ea57 --- /dev/null +++ b/0122-fix-uninit-stack-port_id-when-use-mutil-NIC.patch @@ -0,0 +1,46 @@ +From a5c1ea6f66d8ae22b411154409c463899b8076c4 Mon Sep 17 00:00:00 2001 +From: kircher +Date: Thu, 10 Nov 2022 10:21:05 +0800 +Subject: [PATCH 07/20] fix uninit stack->port_id when use mutil NIC + +--- + src/lstack/core/lstack_dpdk.c | 10 ++++++++++ + src/lstack/core/lstack_protocol_stack.c | 1 - + 2 files changed, 10 insertions(+), 1 deletion(-) + +diff --git a/src/lstack/core/lstack_dpdk.c b/src/lstack/core/lstack_dpdk.c +index 77ae3eb..e187bca 100644 +--- a/src/lstack/core/lstack_dpdk.c ++++ b/src/lstack/core/lstack_dpdk.c +@@ -446,6 +446,16 @@ int32_t dpdk_ethdev_init(void) + stack_group->rx_offload = eth_params->conf.rxmode.offloads; + stack_group->tx_offload = eth_params->conf.txmode.offloads; + ++ for (uint32_t i = 0; i < stack_group->stack_num; i++) { ++ struct protocol_stack *stack = stack_group->stacks[i]; ++ if (likely(stack)) { ++ stack->port_id = stack_group->port_id; ++ } else { ++ LSTACK_LOG(ERR, LSTACK, "empty stack at stack_num %d\n", i); ++ return -EINVAL; ++ } ++ } ++ + ret = rte_eth_dev_configure(port_id, nb_queues, nb_queues, ð_params->conf); + if (ret < 0) { + LSTACK_LOG(ERR, LSTACK, "cannot config eth dev at port %d: %s\n", port_id, rte_strerror(-ret)); +diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c +index 3daa09f..03ed18e 100644 +--- a/src/lstack/core/lstack_protocol_stack.c ++++ b/src/lstack/core/lstack_protocol_stack.c +@@ -280,7 +280,6 @@ static int32_t init_stack_value(struct protocol_stack *stack, uint16_t queue_id) + + stack->tid = rte_gettid(); + stack->queue_id = queue_id; +- stack->port_id = stack_group->port_id; + stack->cpu_id = get_global_cfg_params()->cpus[queue_id]; + stack->lwip_stats = &lwip_stats; + +-- +2.23.0 + diff --git a/0123-fix-memleak-in-dpdk_ethdev_init-unlikely-path.patch b/0123-fix-memleak-in-dpdk_ethdev_init-unlikely-path.patch new file mode 100644 index 0000000..ccc4ca3 --- /dev/null +++ b/0123-fix-memleak-in-dpdk_ethdev_init-unlikely-path.patch @@ -0,0 +1,25 @@ +From b82f1facd8fabf299719705602b0a2e354573af3 Mon Sep 17 00:00:00 2001 +From: kircher +Date: Thu, 10 Nov 2022 17:34:43 +0800 +Subject: [PATCH 09/20] fix memleak in dpdk_ethdev_init unlikely path + +--- + src/lstack/core/lstack_dpdk.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/src/lstack/core/lstack_dpdk.c b/src/lstack/core/lstack_dpdk.c +index e187bca..0198655 100644 +--- a/src/lstack/core/lstack_dpdk.c ++++ b/src/lstack/core/lstack_dpdk.c +@@ -452,6 +452,8 @@ int32_t dpdk_ethdev_init(void) + stack->port_id = stack_group->port_id; + } else { + LSTACK_LOG(ERR, LSTACK, "empty stack at stack_num %d\n", i); ++ stack_group->eth_params = NULL; ++ free(eth_params); + return -EINVAL; + } + } +-- +2.23.0 + diff --git a/0124-fix-epoll_wait-return-when-timeout-is-0.patch b/0124-fix-epoll_wait-return-when-timeout-is-0.patch new file mode 100644 index 0000000..a3e63bc --- /dev/null +++ b/0124-fix-epoll_wait-return-when-timeout-is-0.patch @@ -0,0 +1,38 @@ +From b37eb61864e0f54aff78ac11d20828cb57278753 Mon Sep 17 00:00:00 2001 +From: wu-changsheng +Date: Sat, 12 Nov 2022 14:42:56 +0800 +Subject: [PATCH 10/20] fix epoll_wait return when timeout is 0 + +--- + src/lstack/api/lstack_epoll.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/src/lstack/api/lstack_epoll.c b/src/lstack/api/lstack_epoll.c +index 6979e12..20ed224 100644 +--- a/src/lstack/api/lstack_epoll.c ++++ b/src/lstack/api/lstack_epoll.c +@@ -453,6 +453,10 @@ int32_t lstack_epoll_wait(int32_t epfd, struct epoll_event* events, int32_t maxe + return lwip_num + kernel_num; + } + ++ if (timeout == 0) { ++ return 0; ++ } ++ + if (timeout < 0) { + ret = pthread_mutex_lock(&wakeup->wait); + } else { +@@ -654,6 +658,10 @@ int32_t lstack_poll(struct pollfd *fds, nfds_t nfds, int32_t timeout) + return lwip_num + kernel_num; + } + ++ if (timeout == 0) { ++ return 0; ++ } ++ + if (timeout < 0) { + ret = pthread_mutex_lock(&wakeup->wait); + } else { +-- +2.23.0 + diff --git a/0125-fix-gazelle-pdump-init-fail-with-dpdk-21.11.patch b/0125-fix-gazelle-pdump-init-fail-with-dpdk-21.11.patch new file mode 100644 index 0000000..013bd97 --- /dev/null +++ b/0125-fix-gazelle-pdump-init-fail-with-dpdk-21.11.patch @@ -0,0 +1,46 @@ +From 732557e3671bed8a71153f4d4f81a650d5a2ecb9 Mon Sep 17 00:00:00 2001 +From: kircher +Date: Sat, 12 Nov 2022 16:09:49 +0800 +Subject: [PATCH 11/20] fix gazelle pdump init fail with dpdk-21.11 + +--- + src/lstack/core/lstack_dpdk.c | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) + +diff --git a/src/lstack/core/lstack_dpdk.c b/src/lstack/core/lstack_dpdk.c +index 0198655..5dc2e54 100644 +--- a/src/lstack/core/lstack_dpdk.c ++++ b/src/lstack/core/lstack_dpdk.c +@@ -106,14 +106,6 @@ int32_t dpdk_eal_init(void) + int32_t ret; + struct cfg_params *global_params = get_global_cfg_params(); + +- ret = rte_pdump_init(); +- if (ret < 0) { +- LSTACK_PRE_LOG(LSTACK_ERR, "rte_pdump_init failed init, rte_errno %d\n", rte_errno); +- /* We do not care whether the pdump is successfully loaded. So, just print an alarm. */ +- } else { +- LSTACK_PRE_LOG(LSTACK_INFO, "rte_pdump_init success\n"); +- } +- + ret = rte_eal_init(global_params->dpdk_argc, global_params->dpdk_argv); + if (ret < 0) { + if (rte_errno == EALREADY) { +@@ -127,6 +119,14 @@ int32_t dpdk_eal_init(void) + LSTACK_PRE_LOG(LSTACK_INFO, "dpdk_eal_init success\n"); + } + ++ ret = rte_pdump_init(); ++ if (ret < 0) { ++ LSTACK_PRE_LOG(LSTACK_ERR, "rte_pdump_init failed init, rte_errno %d\n", rte_errno); ++ /* We do not care whether the pdump is successfully loaded. So, just print an alarm. */ ++ } else { ++ LSTACK_PRE_LOG(LSTACK_INFO, "rte_pdump_init success\n"); ++ } ++ + return ret; + } + +-- +2.23.0 + diff --git a/0126-fix-add-outdated-event.patch b/0126-fix-add-outdated-event.patch new file mode 100644 index 0000000..54982b6 --- /dev/null +++ b/0126-fix-add-outdated-event.patch @@ -0,0 +1,32 @@ +From 9a7cb66fd9912c3073f3299e8db4167b4882c020 Mon Sep 17 00:00:00 2001 +From: wu-changsheng +Date: Sat, 12 Nov 2022 16:48:50 +0800 +Subject: [PATCH 12/20] fix add outdated event + +--- + src/lstack/api/lstack_epoll.c | 9 +++++++++ + 1 file changed, 9 insertions(+) + +diff --git a/src/lstack/api/lstack_epoll.c b/src/lstack/api/lstack_epoll.c +index 20ed224..759b0c0 100644 +--- a/src/lstack/api/lstack_epoll.c ++++ b/src/lstack/api/lstack_epoll.c +@@ -55,6 +55,15 @@ void add_sock_event(struct lwip_sock *sock, uint32_t event) + + if (wakeup->type == WAKEUP_EPOLL) { + pthread_spin_lock(&wakeup->event_list_lock); ++ ++ /* app thread have read/write, event is outdated */ ++ if (event == EPOLLIN && sock->conn->state == NETCONN_LISTEN && !NETCONN_IS_DATAIN(sock)) { ++ return; ++ } ++ if (event == EPOLLOUT && !NETCONN_IS_OUTIDLE(sock)) { ++ return; ++ } ++ + 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); +-- +2.23.0 + diff --git a/0127-revert-write-usleep.patch b/0127-revert-write-usleep.patch new file mode 100644 index 0000000..dd00741 --- /dev/null +++ b/0127-revert-write-usleep.patch @@ -0,0 +1,27 @@ +From fb2c23cc1be1171a70f650d2de6c7dad7539d2db Mon Sep 17 00:00:00 2001 +From: wu-changsheng +Date: Sat, 12 Nov 2022 16:58:10 +0800 +Subject: [PATCH 13/20] revert write usleep + +--- + src/lstack/core/lstack_lwip.c | 4 ---- + 1 file changed, 4 deletions(-) + +diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c +index 0437187..087d09b 100644 +--- a/src/lstack/core/lstack_lwip.c ++++ b/src/lstack/core/lstack_lwip.c +@@ -307,10 +307,6 @@ ssize_t write_stack_data(struct lwip_sock *sock, const void *buf, size_t len) + sock->wakeup->stat.app_write_cnt += send_pkt; + } + +- if (send_len == 0) { +- /* 100: give up cpu to other threads, when send_ring is full */ +- usleep(100); +- } + return send_len; + } + +-- +2.23.0 + diff --git a/0128-reduce-thread-variable-access.patch b/0128-reduce-thread-variable-access.patch new file mode 100644 index 0000000..f93fdfb --- /dev/null +++ b/0128-reduce-thread-variable-access.patch @@ -0,0 +1,83 @@ +From 16d35b610e00b18005049d80ad91bedb2ca64501 Mon Sep 17 00:00:00 2001 +From: wu-changsheng +Date: Sat, 12 Nov 2022 17:24:02 +0800 +Subject: [PATCH 14/20] reduce thread variable access + +--- + src/lstack/api/lstack_epoll.c | 4 ++-- + src/lstack/core/lstack_protocol_stack.c | 8 +++++--- + src/lstack/include/posix/lstack_epoll.h | 2 +- + 3 files changed, 8 insertions(+), 6 deletions(-) + +diff --git a/src/lstack/api/lstack_epoll.c b/src/lstack/api/lstack_epoll.c +index 759b0c0..ebad98e 100644 +--- a/src/lstack/api/lstack_epoll.c ++++ b/src/lstack/api/lstack_epoll.c +@@ -77,14 +77,14 @@ void add_sock_event(struct lwip_sock *sock, uint32_t event) + } + } + +-void wakeup_stack_epoll(struct protocol_stack *stack) ++void wakeup_stack_epoll(struct protocol_stack *stack, bool wakeup_thread_enable) + { + struct list_node *node, *temp; + + list_for_each_safe(node, temp, &stack->wakeup_list) { + struct wakeup_poll *wakeup = container_of((node - stack->queue_id), struct wakeup_poll, wakeup_list); + +- if (!get_protocol_stack_group()->wakeup_enable) { ++ if (!wakeup_thread_enable) { + if (__atomic_load_n(&wakeup->in_wait, __ATOMIC_ACQUIRE)) { + __atomic_store_n(&wakeup->in_wait, false, __ATOMIC_RELEASE); + rte_mb(); +diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c +index 03ed18e..7a3955d 100644 +--- a/src/lstack/core/lstack_protocol_stack.c ++++ b/src/lstack/core/lstack_protocol_stack.c +@@ -423,17 +423,19 @@ static void* gazelle_stack_thread(void *arg) + bool use_ltran_flag = use_ltran(); + bool kni_switch = get_global_cfg_params()->kni_switch; + uint32_t wakeup_tick = 0; ++ struct protocol_stack_group *stack_group = get_protocol_stack_group(); ++ bool wakeup_thread_enable = stack_group->wakeup_enable; + + struct protocol_stack *stack = stack_thread_init(queue_id); + if (stack == NULL) { + /* exit in main thread, avoid create mempool and exit at the same time */ + set_init_fail(); +- sem_post(&get_protocol_stack_group()->all_init); ++ sem_post(&stack_group->all_init); + LSTACK_LOG(ERR, LSTACK, "stack_thread_init failed queue_id=%hu\n", queue_id); + return NULL; + } + +- sem_post(&get_protocol_stack_group()->all_init); ++ sem_post(&stack_group->all_init); + LSTACK_LOG(INFO, LSTACK, "stack_%02hu init success\n", queue_id); + + for (;;) { +@@ -447,7 +449,7 @@ static void* gazelle_stack_thread(void *arg) + + if ((wakeup_tick & 0xf) == 0) { + wakeup_kernel_event(stack); +- wakeup_stack_epoll(stack); ++ wakeup_stack_epoll(stack, wakeup_thread_enable); + } + + /* KNI requests are generally low-rate I/Os, +diff --git a/src/lstack/include/posix/lstack_epoll.h b/src/lstack/include/posix/lstack_epoll.h +index d6c81a7..6aa9d30 100644 +--- a/src/lstack/include/posix/lstack_epoll.h ++++ b/src/lstack/include/posix/lstack_epoll.h +@@ -64,7 +64,7 @@ struct wakeup_poll { + struct netconn; + struct lwip_sock; + void add_sock_event(struct lwip_sock *sock, uint32_t event); +-void wakeup_stack_epoll(struct protocol_stack *stack); ++void wakeup_stack_epoll(struct protocol_stack *stack, bool wakeup_thread_enable); + int32_t lstack_epoll_create(int32_t size); + int32_t lstack_epoll_create1(int32_t flags); + int32_t lstack_epoll_ctl(int32_t epfd, int32_t op, int32_t fd, struct epoll_event *event); +-- +2.23.0 + diff --git a/0129-add-readv-and-readv-kernel.patch b/0129-add-readv-and-readv-kernel.patch new file mode 100644 index 0000000..409e1a5 --- /dev/null +++ b/0129-add-readv-and-readv-kernel.patch @@ -0,0 +1,38 @@ +From 9a07e4017b13fa4e502ea18f16d7e7f4b49e088e Mon Sep 17 00:00:00 2001 +From: compile_success <980965867@qq.com> +Date: Sat, 12 Nov 2022 09:58:25 +0000 +Subject: [PATCH 15/20] add readv and readv kernel + +--- + src/lstack/api/lstack_wrap.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/src/lstack/api/lstack_wrap.c b/src/lstack/api/lstack_wrap.c +index 1a654e9..d48fee0 100644 +--- a/src/lstack/api/lstack_wrap.c ++++ b/src/lstack/api/lstack_wrap.c +@@ -339,6 +339,10 @@ static inline ssize_t do_read(int32_t s, void *mem, size_t len) + + static inline ssize_t do_readv(int32_t s, const struct iovec *iov, int iovcnt) + { ++ if (select_path(s) != PATH_LWIP) { ++ return posix_api->readv_fn(s, iov, iovcnt); ++ } ++ + struct msghdr msg; + + msg.msg_name = NULL; +@@ -371,6 +375,10 @@ static inline ssize_t do_write(int32_t s, const void *mem, size_t size) + + static inline ssize_t do_writev(int32_t s, const struct iovec *iov, int iovcnt) + { ++ if (select_path(s) != PATH_LWIP) { ++ return posix_api->writev_fn(s, iov, iovcnt); ++ } ++ + struct msghdr msg; + + msg.msg_name = NULL; +-- +2.23.0 + diff --git a/0130-add-unlock-before-after.patch b/0130-add-unlock-before-after.patch new file mode 100644 index 0000000..084baef --- /dev/null +++ b/0130-add-unlock-before-after.patch @@ -0,0 +1,30 @@ +From f77823af16f5eff88203a1c183d4bb5c67e3d3b0 Mon Sep 17 00:00:00 2001 +From: compile_success <980965867@qq.com> +Date: Sat, 12 Nov 2022 13:27:36 +0000 +Subject: [PATCH 16/20] add unlock before after + +--- + src/lstack/api/lstack_epoll.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/src/lstack/api/lstack_epoll.c b/src/lstack/api/lstack_epoll.c +index ebad98e..8d5439b 100644 +--- a/src/lstack/api/lstack_epoll.c ++++ b/src/lstack/api/lstack_epoll.c +@@ -57,10 +57,12 @@ void add_sock_event(struct lwip_sock *sock, uint32_t event) + pthread_spin_lock(&wakeup->event_list_lock); + + /* app thread have read/write, event is outdated */ +- if (event == EPOLLIN && sock->conn->state == NETCONN_LISTEN && !NETCONN_IS_DATAIN(sock)) { ++ if (event == EPOLLIN && sock->conn->state != NETCONN_LISTEN && !NETCONN_IS_DATAIN(sock)) { ++ pthread_spin_unlock(&wakeup->event_list_lock); + return; + } + if (event == EPOLLOUT && !NETCONN_IS_OUTIDLE(sock)) { ++ pthread_spin_unlock(&wakeup->event_list_lock); + return; + } + +-- +2.23.0 + diff --git a/0131-add-mutil-NIC-support-in-gazelle.patch b/0131-add-mutil-NIC-support-in-gazelle.patch new file mode 100644 index 0000000..40a5e58 --- /dev/null +++ b/0131-add-mutil-NIC-support-in-gazelle.patch @@ -0,0 +1,432 @@ +From 29ce2b92248fce0ce90abbcf0625653a5327b232 Mon Sep 17 00:00:00 2001 +From: kircher +Date: Sat, 12 Nov 2022 21:12:03 +0800 +Subject: [PATCH 17/20] add mutil NIC support in gazelle + +--- + src/common/gazelle_base_func.h | 2 + + src/common/gazelle_opt.h | 2 + + src/common/gazelle_parse_config.c | 31 +++++++++++ + src/lstack/core/lstack_cfg.c | 46 ++++++++++++++++ + src/lstack/core/lstack_control_plane.c | 17 ++++-- + src/lstack/include/lstack_cfg.h | 1 + + src/ltran/ltran_base.h | 1 + + src/ltran/ltran_dfx.c | 35 +++++++++++- + src/ltran/ltran_param.c | 75 +++++++++++++++++++++++++- + src/ltran/ltran_param.h | 2 + + src/ltran/main.c | 9 ++++ + 11 files changed, 215 insertions(+), 6 deletions(-) + +diff --git a/src/common/gazelle_base_func.h b/src/common/gazelle_base_func.h +index fe3411a..22d7a7f 100644 +--- a/src/common/gazelle_base_func.h ++++ b/src/common/gazelle_base_func.h +@@ -32,6 +32,8 @@ int32_t separate_str_to_array(char *args, uint32_t *array, int32_t array_size); + + 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))) + +diff --git a/src/common/gazelle_opt.h b/src/common/gazelle_opt.h +index 7521e8c..e9e3676 100644 +--- a/src/common/gazelle_opt.h ++++ b/src/common/gazelle_opt.h +@@ -75,6 +75,8 @@ + #define GAZELLE_MAX_STACK_ARRAY_SIZE GAZELLE_CLIENT_NUM + + #define GAZELLE_REG_SOCK_PATHNAME "/var/run/gazelle/gazelle_client.sock" ++#define GAZELLE_REG_SOCK_FILENAME "gazelle_client.sock" ++#define GAZELLE_SOCK_FILENAME_MAXLEN 128 + + #define GAZELLE_RUN_DIR "/var/run/gazelle/" + #define GAZELLE_FILE_PERMISSION 0700 +diff --git a/src/common/gazelle_parse_config.c b/src/common/gazelle_parse_config.c +index 8556e37..fc286d9 100644 +--- a/src/common/gazelle_parse_config.c ++++ b/src/common/gazelle_parse_config.c +@@ -21,6 +21,16 @@ + #include "gazelle_opt.h" + #include "gazelle_base_func.h" + ++#ifdef LTRAN_COMPILE ++#include "ltran_log.h" ++#define COMMON_ERR(fmt, ...) LTRAN_ERR(fmt, ##__VA_ARGS__) ++#define COMMON_INFO(fmt, ...) LTRAN_INFO(fmt, ##__VA_ARGS__) ++#else ++#include "lstack_log.h" ++#define COMMON_ERR(fmt, ...) LSTACK_LOG(ERR, LSTACK, fmt, ##__VA_ARGS__) ++#define COMMON_INFO(fmt, ...) LSTACK_LOG(INFO, LSTACK, fmt, ##__VA_ARGS__) ++#endif ++ + static int32_t parse_str_data(char *args, uint32_t *array, int32_t array_size) + { + const char *delim = "-"; +@@ -87,3 +97,24 @@ int32_t check_and_set_run_dir(void) + } + return 0; + } ++ ++/* return 1 for check error */ ++int32_t filename_check(const char* args) ++{ ++ if (args == NULL) { ++ return 1; ++ } ++ ++ if (strlen(args) <= 0 || strlen(args) > GAZELLE_SOCK_FILENAME_MAXLEN - 1) { ++ COMMON_ERR("socket_filename_check: invalid unix sock name %s, filename exceeds the limit %d.\n", args, GAZELLE_SOCK_FILENAME_MAXLEN); ++ return 1; ++ } ++ ++ char* sensitive_chars = strpbrk(args, "|;&$><`\\!\n"); ++ if (sensitive_chars != NULL) { ++ COMMON_ERR("socket_filename_check: invalid unix sock name %s, filename contains sensitive characters.\n", args); ++ return 1; ++ } ++ ++ return 0; ++} +diff --git a/src/lstack/core/lstack_cfg.c b/src/lstack/core/lstack_cfg.c +index 2cd9989..1ff3794 100644 +--- a/src/lstack/core/lstack_cfg.c ++++ b/src/lstack/core/lstack_cfg.c +@@ -56,6 +56,7 @@ static int32_t parse_gateway_addr(void); + static int32_t parse_kni_switch(void); + static int32_t parse_listen_shadow(void); + static int32_t parse_app_bind_numa(void); ++static int32_t parse_unix_prefix(void); + + struct config_vector_t { + const char *name; +@@ -75,6 +76,7 @@ static struct config_vector_t g_config_tbl[] = { + { "kni_switch", parse_kni_switch }, + { "listen_shadow", parse_listen_shadow }, + { "app_bind_numa", parse_app_bind_numa }, ++ { "unix_prefix", parse_unix_prefix }, + { NULL, NULL } + }; + +@@ -803,3 +805,47 @@ int32_t cfg_init(void) + free(config_file); + return ret; + } ++ ++static int32_t parse_unix_prefix(void) ++{ ++ const config_setting_t *unix_prefix = NULL; ++ const char *args = NULL; ++ int32_t ret = 0; ++ ++ ret = memset_s(g_config_params.unix_socket_filename, sizeof(g_config_params.unix_socket_filename), ++ 0, sizeof(g_config_params.unix_socket_filename)); ++ if (ret != EOK) { ++ return ret; ++ } ++ ++ ret = strncpy_s(g_config_params.unix_socket_filename, sizeof(g_config_params.unix_socket_filename), ++ GAZELLE_RUN_DIR, strlen(GAZELLE_RUN_DIR) + 1); ++ if (ret != EOK) { ++ return ret; ++ } ++ ++ unix_prefix = config_lookup(&g_config, "unix_prefix"); ++ ++ if (unix_prefix) { ++ args = config_setting_get_string(unix_prefix); ++ ++ if (filename_check(args)) { ++ return -EINVAL; ++ } ++ ++ ret = strncat_s(g_config_params.unix_socket_filename, sizeof(g_config_params.unix_socket_filename), ++ args, strlen(args) + 1); ++ if (ret != EOK) { ++ return ret; ++ } ++ } ++ ++ ret = strncat_s(g_config_params.unix_socket_filename, sizeof(g_config_params.unix_socket_filename), ++ GAZELLE_REG_SOCK_FILENAME, strlen(GAZELLE_REG_SOCK_FILENAME) + 1); ++ if (ret != EOK) { ++ return ret; ++ } ++ ++ return 0; ++} ++ +diff --git a/src/lstack/core/lstack_control_plane.c b/src/lstack/core/lstack_control_plane.c +index 7f62254..0a10d83 100644 +--- a/src/lstack/core/lstack_control_plane.c ++++ b/src/lstack/core/lstack_control_plane.c +@@ -67,9 +67,12 @@ static int control_unix_sock(struct sockaddr_un *address) + posix_api->close_fn(sockfd); + return -1; + } ++ ++ struct cfg_params *global_params = get_global_cfg_params(); ++ + address->sun_family = AF_UNIX; +- int ret = strncpy_s(address->sun_path, sizeof(address->sun_path), GAZELLE_REG_SOCK_PATHNAME, +- strlen(GAZELLE_REG_SOCK_PATHNAME) + 1); ++ int ret = strncpy_s(address->sun_path, sizeof(address->sun_path), global_params->unix_socket_filename, ++ strlen(global_params->unix_socket_filename) + 1); + if (ret != EOK) { + posix_api->close_fn(sockfd); + return -1; +@@ -459,6 +462,14 @@ void control_fd_close(void) + /* 200ms: wait ltran instance logout */ + rte_delay_ms(200); + } ++ ++ struct cfg_params *global_params = get_global_cfg_params(); ++ if (!global_params->use_ltran) { ++ int ret = unlink(global_params->unix_socket_filename); ++ if (ret == -1) { ++ LSTACK_LOG(ERR, LSTACK, "unlink failed, just skip it\n"); ++ } ++ } + } + + int32_t control_init_client(bool is_reconnect) +@@ -675,7 +686,7 @@ static int32_t control_init_server(void) + return -1; + } + +- ret = unlink(GAZELLE_REG_SOCK_PATHNAME); ++ ret = unlink(get_global_cfg_params()->unix_socket_filename); + if (ret == -1) { + LSTACK_LOG(ERR, LSTACK, "unlink failed, just skip it\n"); + } +diff --git a/src/lstack/include/lstack_cfg.h b/src/lstack/include/lstack_cfg.h +index 80dfd24..3864250 100644 +--- a/src/lstack/include/lstack_cfg.h ++++ b/src/lstack/include/lstack_cfg.h +@@ -80,6 +80,7 @@ struct cfg_params { + int dpdk_argc; + char **dpdk_argv; + struct secondary_attach_arg sec_attach_arg; ++ char unix_socket_filename[NAME_MAX]; + }; + + struct cfg_params *get_global_cfg_params(void); +diff --git a/src/ltran/ltran_base.h b/src/ltran/ltran_base.h +index 41d4cfb..6be9152 100644 +--- a/src/ltran/ltran_base.h ++++ b/src/ltran/ltran_base.h +@@ -99,5 +99,6 @@ + #define GAZELLE_INET_ADDRSTRLEN 16 + + #define GAZELLE_DFX_SOCK_PATHNAME "/var/run/gazelle/gazelle_cmd.sock" ++#define GAZELLE_DFX_SOCK_FILENAME "gazelle_cmd.sock" + + #endif /* ifndef __GAZELLE_BASE_H__ */ +diff --git a/src/ltran/ltran_dfx.c b/src/ltran/ltran_dfx.c +index de97a48..bab3f89 100644 +--- a/src/ltran/ltran_dfx.c ++++ b/src/ltran/ltran_dfx.c +@@ -57,6 +57,8 @@ static struct gazelle_stat_lstack_total g_last_lstack_total[GAZELLE_MAX_STACK_AR + + static bool g_use_ltran = false; + ++static char* g_unix_prefix; ++ + /* Use the largest data structure. */ + #define GAZELLE_CMD_RESP_BUFFER_SIZE (sizeof(struct gazelle_stack_dfx_data) / sizeof(char)) + +@@ -162,15 +164,23 @@ static int32_t dfx_connect_ltran(bool use_ltran, bool probe) + printf("%s:%d memset_s fail ret=%d\n", __FUNCTION__, __LINE__, ret); + } + ++ if (g_unix_prefix) { ++ ret = strncat_s(addr.sun_path, sizeof(addr.sun_path), GAZELLE_RUN_DIR, ++ strlen(GAZELLE_RUN_DIR) + 1); ++ if (ret != EOK) { ++ printf("%s:%d strncpy_s fail ret=%d\n", __FUNCTION__, __LINE__, ret); ++ } ++ } ++ + addr.sun_family = AF_UNIX; + if (use_ltran) { +- ret = strncpy_s(addr.sun_path, sizeof(addr.sun_path), GAZELLE_DFX_SOCK_PATHNAME, ++ ret = strncat_s(addr.sun_path, sizeof(addr.sun_path), GAZELLE_DFX_SOCK_PATHNAME, + strlen(GAZELLE_DFX_SOCK_PATHNAME) + 1); + if (ret != EOK) { + printf("%s:%d strncpy_s fail ret=%d\n", __FUNCTION__, __LINE__, ret); + } + } else { +- ret = strncpy_s(addr.sun_path, sizeof(addr.sun_path), GAZELLE_REG_SOCK_PATHNAME, ++ ret = strncat_s(addr.sun_path, sizeof(addr.sun_path), GAZELLE_REG_SOCK_PATHNAME, + strlen(GAZELLE_REG_SOCK_PATHNAME) + 1); + if (ret != EOK) { + printf("%s:%d strncpy_s fail ret=%d\n", __FUNCTION__, __LINE__, ret); +@@ -1251,6 +1261,27 @@ int32_t main(int32_t argc, char *argv[]) + struct gazelle_stat_msg_request req_msg[GAZELLE_CMD_MAX] = {0}; + int32_t req_msg_num, ret; + ++ int unix_arg = 0; ++ for (int32_t i = 1; i < argc; i++) { ++ if (unix_arg == 0) { ++ if (!strcmp(argv[i], "-u")) { ++ unix_arg++; ++ } ++ } else if (unix_arg == 1) { ++ g_unix_prefix = argv[i]; ++ unix_arg++; ++ } else { ++ argv[i - unix_arg] = argv[i]; ++ } ++ } ++ ++ argv[argc - unix_arg] = argv[argc]; ++ argc -= unix_arg; ++ ++ if (g_unix_prefix && filename_check(g_unix_prefix)) { ++ return -1; ++ } ++ + int32_t fd = dfx_connect_ltran(true, true); + if (fd > 0) { + g_use_ltran = true; +diff --git a/src/ltran/ltran_param.c b/src/ltran/ltran_param.c +index fc45895..4974085 100644 +--- a/src/ltran/ltran_param.c ++++ b/src/ltran/ltran_param.c +@@ -42,6 +42,7 @@ + #define PARAM_BOND_RX_QUEUE_NUM "bond_rx_queue_num" + #define PARAM_BOND_MACS "bond_macs" + #define PARAM_TCP_CONN_SCAN_INTERVAL "tcp_conn_scan_interval" ++#define PARAM_UNIX_PREFIX "unix_prefix" + + static struct ltran_config g_ltran_config = {0}; + struct ltran_config* get_ltran_config(void) +@@ -537,6 +538,78 @@ struct param_parser { + param_parse_func func; + }; + ++static int32_t parse_unix_prefix(const config_t *config, const char *key, struct ltran_config *ltran_config) ++{ ++ const char *prefix = NULL; ++ int32_t ret = 0; ++ ++ ret = memset_s(ltran_config->unix_socket_filename, sizeof(ltran_config->unix_socket_filename), ++ 0, sizeof(ltran_config->unix_socket_filename)); ++ if (ret != EOK) { ++ gazelle_set_errno(GAZELLE_EINETATON); ++ return GAZELLE_ERR; ++ } ++ ++ ret = memset_s(ltran_config->dfx_socket_filename, sizeof(ltran_config->dfx_socket_filename), ++ 0, sizeof(ltran_config->dfx_socket_filename)); ++ if (ret != EOK) { ++ gazelle_set_errno(GAZELLE_EINETATON); ++ return GAZELLE_ERR; ++ } ++ ++ ret = strncpy_s(ltran_config->unix_socket_filename, sizeof(ltran_config->unix_socket_filename), ++ GAZELLE_RUN_DIR, strlen(GAZELLE_RUN_DIR) + 1); ++ if (ret != EOK) { ++ gazelle_set_errno(GAZELLE_EINETATON); ++ return GAZELLE_ERR; ++ } ++ ++ ret = strncpy_s(ltran_config->dfx_socket_filename, sizeof(ltran_config->dfx_socket_filename), ++ GAZELLE_RUN_DIR, strlen(GAZELLE_RUN_DIR) + 1); ++ if (ret != EOK) { ++ gazelle_set_errno(GAZELLE_EINETATON); ++ return GAZELLE_ERR; ++ } ++ ++ ret = config_lookup_string(config, key, &prefix); ++ if (ret) { ++ if (filename_check(prefix)) { ++ gazelle_set_errno(GAZELLE_EINETATON); ++ return GAZELLE_ERR; ++ } ++ ++ ret = strncat_s(ltran_config->unix_socket_filename, sizeof(ltran_config->unix_socket_filename), ++ prefix, strlen(prefix) + 1); ++ if (ret != EOK) { ++ gazelle_set_errno(GAZELLE_EINETATON); ++ return GAZELLE_ERR; ++ } ++ ++ ret = strncat_s(ltran_config->dfx_socket_filename, sizeof(ltran_config->dfx_socket_filename), ++ prefix, strlen(prefix) + 1); ++ if (ret != EOK) { ++ gazelle_set_errno(GAZELLE_EINETATON); ++ return GAZELLE_ERR; ++ } ++ } ++ ++ ret = strncat_s(ltran_config->unix_socket_filename, sizeof(ltran_config->unix_socket_filename), ++ GAZELLE_REG_SOCK_FILENAME, strlen(GAZELLE_REG_SOCK_FILENAME) + 1); ++ if (ret != EOK) { ++ gazelle_set_errno(GAZELLE_EINETATON); ++ return GAZELLE_ERR; ++ } ++ ++ ret = strncat_s(ltran_config->dfx_socket_filename, sizeof(ltran_config->dfx_socket_filename), ++ GAZELLE_DFX_SOCK_FILENAME, strlen(GAZELLE_DFX_SOCK_FILENAME) + 1); ++ if (ret != EOK) { ++ gazelle_set_errno(GAZELLE_EINETATON); ++ return GAZELLE_ERR; ++ } ++ ++ return GAZELLE_OK; ++} ++ + struct param_parser g_param_parse_tbl[] = { + {PARAM_FORWARD_KIT_ARGS, parse_forward_kit_args}, + {PARAM_DISPATCH_MAX_CLIENT, parse_dispatch_max_client}, +@@ -551,6 +624,7 @@ struct param_parser g_param_parse_tbl[] = { + {PARAM_BOND_TX_QUEUE_NUM, parse_bond_tx_queue_num}, + {PARAM_TCP_CONN_SCAN_INTERVAL, parse_tcp_conn_scan_interval}, + {PARAM_KNI_SWITCH, parse_kni_switch}, ++ {PARAM_UNIX_PREFIX, parse_unix_prefix}, + }; + + int32_t parse_config_file_args(const char *conf_file_path, struct ltran_config *ltran_config) +@@ -597,4 +671,3 @@ bool is_same_mac_addr(const uint8_t *smac, const uint8_t *dmac) + } + return true; + } +- +diff --git a/src/ltran/ltran_param.h b/src/ltran/ltran_param.h +index 3ec6451..6f013d5 100644 +--- a/src/ltran/ltran_param.h ++++ b/src/ltran/ltran_param.h +@@ -56,6 +56,8 @@ struct ltran_config { + struct { + int32_t log_switch; + } log; ++ char unix_socket_filename[NAME_MAX]; ++ char dfx_socket_filename[NAME_MAX]; + }; + + int32_t parse_config_file_args(const char *conf_file_path, struct ltran_config *ltran_config); +diff --git a/src/ltran/main.c b/src/ltran/main.c +index 691595e..03b3ad5 100644 +--- a/src/ltran/main.c ++++ b/src/ltran/main.c +@@ -58,6 +58,15 @@ static void sig_default_handler(int32_t sig) + LTRAN_ERR("ltran dumped,caught signal:%d.\n", sig); + print_stack(); + dpdk_kni_release(); ++ int ret = 0; ++ ret = unlink(get_ltran_config()->unix_socket_filename); ++ if (ret) { ++ LTRAN_WARN("unlink %s ERROR. errn: %d. ret=%d\n", get_ltran_config()->unix_socket_filename, errno, ret); ++ } ++ ret = unlink(get_ltran_config()->dfx_socket_filename); ++ if (ret) { ++ LTRAN_WARN("unlink %s ERROR. errn: %d. ret=%d\n", get_ltran_config()->dfx_socket_filename, errno, ret); ++ } + kill(getpid(), sig); + } + +-- +2.23.0 + diff --git a/0132-remove-filename_check-in-gazellectl-to-fix-build-err.patch b/0132-remove-filename_check-in-gazellectl-to-fix-build-err.patch new file mode 100644 index 0000000..da4c451 --- /dev/null +++ b/0132-remove-filename_check-in-gazellectl-to-fix-build-err.patch @@ -0,0 +1,27 @@ +From 3149382926845f44a398ba2d29a732c3e42b11ab Mon Sep 17 00:00:00 2001 +From: kircher +Date: Sat, 12 Nov 2022 22:01:06 +0800 +Subject: [PATCH 18/20] remove filename_check in gazellectl to fix build error + +--- + src/ltran/ltran_dfx.c | 4 ---- + 1 file changed, 4 deletions(-) + +diff --git a/src/ltran/ltran_dfx.c b/src/ltran/ltran_dfx.c +index bab3f89..5d2c305 100644 +--- a/src/ltran/ltran_dfx.c ++++ b/src/ltran/ltran_dfx.c +@@ -1278,10 +1278,6 @@ int32_t main(int32_t argc, char *argv[]) + argv[argc - unix_arg] = argv[argc]; + argc -= unix_arg; + +- if (g_unix_prefix && filename_check(g_unix_prefix)) { +- return -1; +- } +- + int32_t fd = dfx_connect_ltran(true, true); + if (fd > 0) { + g_use_ltran = true; +-- +2.23.0 + diff --git a/0133-cancel-kernel-sock-epoll-ctl-when-lwip-sock-connect.patch b/0133-cancel-kernel-sock-epoll-ctl-when-lwip-sock-connect.patch new file mode 100644 index 0000000..b9bec6f --- /dev/null +++ b/0133-cancel-kernel-sock-epoll-ctl-when-lwip-sock-connect.patch @@ -0,0 +1,27 @@ +From 193937aa1b3bdf0c37059c6bc24504363f728c66 Mon Sep 17 00:00:00 2001 +From: compile_success <980965867@qq.com> +Date: Sat, 12 Nov 2022 14:08:12 +0000 +Subject: [PATCH 19/20] cancel kernel sock epoll ctl when lwip sock connect + +--- + src/lstack/core/lstack_lwip.c | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c +index 087d09b..d9ae6c0 100644 +--- a/src/lstack/core/lstack_lwip.c ++++ b/src/lstack/core/lstack_lwip.c +@@ -721,6 +721,10 @@ void gazelle_connected_callback(struct netconn *conn) + return; + } + ++ if (sock->wakeup != NULL && sock->wakeup->epollfd > 0){ ++ posix_api->epoll_ctl_fn(sock->wakeup->epollfd, EPOLL_CTL_DEL, fd, NULL); ++ } ++ + posix_api->shutdown_fn(fd, SHUT_RDWR); + + SET_CONN_TYPE_LIBOS(conn); +-- +2.23.0 + diff --git a/0134-modify-readv-and-writev-first-buf-is-null.patch b/0134-modify-readv-and-writev-first-buf-is-null.patch new file mode 100644 index 0000000..a35e861 --- /dev/null +++ b/0134-modify-readv-and-writev-first-buf-is-null.patch @@ -0,0 +1,66 @@ +From fce82f12ef0fde847d291b85057e9e0df07f011c Mon Sep 17 00:00:00 2001 +From: compile_success <980965867@qq.com> +Date: Sat, 12 Nov 2022 14:19:30 +0000 +Subject: [PATCH 20/20] modify readv and writev first buf is null + +--- + src/lstack/api/lstack_wrap.c | 7 ++++++- + src/lstack/core/lstack_lwip.c | 10 +++++++++- + 2 files changed, 15 insertions(+), 2 deletions(-) + +diff --git a/src/lstack/api/lstack_wrap.c b/src/lstack/api/lstack_wrap.c +index d48fee0..2eeda6b 100644 +--- a/src/lstack/api/lstack_wrap.c ++++ b/src/lstack/api/lstack_wrap.c +@@ -352,7 +352,12 @@ static inline ssize_t do_readv(int32_t s, const struct iovec *iov, int iovcnt) + msg.msg_control = NULL; + msg.msg_controllen = 0; + msg.msg_flags = 0; +- return recvmsg_from_stack(s, &msg, 0); ++ ssize_t result = recvmsg_from_stack(s, &msg, 0); ++ if(result == -1 && errno == EAGAIN){ ++ errno = 0; ++ return 0; ++ } ++ return result; + } + + static inline ssize_t do_send(int32_t sockfd, const void *buf, size_t len, int32_t flags) +diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c +index d9ae6c0..4fec74e 100644 +--- a/src/lstack/core/lstack_lwip.c ++++ b/src/lstack/core/lstack_lwip.c +@@ -473,7 +473,7 @@ static int32_t check_msg_vaild(const struct msghdr *message) + for (int32_t i = 0; i < message->msg_iovlen; i++) { + if ((message->msg_iov[i].iov_base == NULL) || ((ssize_t)message->msg_iov[i].iov_len < 0) || + ((size_t)(ssize_t)message->msg_iov[i].iov_len != message->msg_iov[i].iov_len) || +- ((ssize_t)(buflen + (ssize_t)message->msg_iov[i].iov_len) <= 0)) { ++ ((ssize_t)(buflen + (ssize_t)message->msg_iov[i].iov_len) < 0)) { + GAZELLE_RETURN(EINVAL); + } + buflen = (ssize_t)(buflen + (ssize_t)message->msg_iov[i].iov_len); +@@ -491,6 +491,10 @@ ssize_t recvmsg_from_stack(int32_t s, struct msghdr *message, int32_t flags) + } + + for (int32_t i = 0; i < message->msg_iovlen; i++) { ++ if (message->msg_iov[i].iov_len == 0){ ++ continue; ++ } ++ + ssize_t recvd_local = read_stack_data(s, message->msg_iov[i].iov_base, message->msg_iov[i].iov_len, flags); + if (recvd_local > 0) { + buflen += recvd_local; +@@ -554,6 +558,10 @@ ssize_t sendmsg_to_stack(int32_t s, const struct msghdr *message, int32_t flags) + continue; + } + ++ if (message->msg_iov[i].iov_len == 0){ ++ continue; ++ } ++ + ret = write_stack_data(sock, message->msg_iov[i].iov_base, message->msg_iov[i].iov_len); + if (ret <= 0) { + buflen = (buflen == 0) ? ret : buflen; +-- +2.23.0 + diff --git a/gazelle.spec b/gazelle.spec index c79e0af..2ea4fa0 100644 --- a/gazelle.spec +++ b/gazelle.spec @@ -2,7 +2,7 @@ Name: gazelle Version: 1.0.1 -Release: 20 +Release: 21 Summary: gazelle is a high performance user-mode stack License: MulanPSL-2.0 URL: https://gitee.com/openeuler/gazelle @@ -136,6 +136,19 @@ Patch9118: 0118-expand-nic-rx-desc-size.patch Patch9119: 0119-add-kni-local-support-in-lstack.patch Patch9120: 0120-resolve-the-conflict-between-the-eth_dev_ops-variabl.patch Patch9121: 0121-add-pdump-support-in-lstack.patch +Patch9122: 0122-fix-uninit-stack-port_id-when-use-mutil-NIC.patch +Patch9123: 0123-fix-memleak-in-dpdk_ethdev_init-unlikely-path.patch +Patch9124: 0124-fix-epoll_wait-return-when-timeout-is-0.patch +Patch9125: 0125-fix-gazelle-pdump-init-fail-with-dpdk-21.11.patch +Patch9126: 0126-fix-add-outdated-event.patch +Patch9127: 0127-revert-write-usleep.patch +Patch9128: 0128-reduce-thread-variable-access.patch +Patch9129: 0129-add-readv-and-readv-kernel.patch +Patch9130: 0130-add-unlock-before-after.patch +Patch9131: 0131-add-mutil-NIC-support-in-gazelle.patch +Patch9132: 0132-remove-filename_check-in-gazellectl-to-fix-build-err.patch +Patch9133: 0133-cancel-kernel-sock-epoll-ctl-when-lwip-sock-connect.patch +Patch9134: 0134-modify-readv-and-writev-first-buf-is-null.patch %description %{name} is a high performance user-mode stack. @@ -176,6 +189,10 @@ install -Dpm 0640 %{_builddir}/%{name}-%{version}/src/ltran/ltran.conf %{b %config(noreplace) %{conf_path}/ltran.conf %changelog +* Mon Nov 14 2022 wuchangsheng - 1.0.1-21 +- support muti-nic + fix some bugs + * Tue Nov 8 2022 kircher - 1.0.1-20 - add pdump support in lstack