add muti nic and fix bugs

(cherry picked from commit 680f9fbf06160e2e9dda88d3b8238c53680ab899)
This commit is contained in:
wu-changsheng 2022-11-14 11:24:49 +08:00 committed by openeuler-sync-bot
parent 1bb2ace36f
commit e417d29170
14 changed files with 935 additions and 1 deletions

View File

@ -0,0 +1,46 @@
From a5c1ea6f66d8ae22b411154409c463899b8076c4 Mon Sep 17 00:00:00 2001
From: kircher <majun65@huawei.com>
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, &eth_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

View File

@ -0,0 +1,25 @@
From b82f1facd8fabf299719705602b0a2e354573af3 Mon Sep 17 00:00:00 2001
From: kircher <majun65@huawei.com>
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

View File

@ -0,0 +1,38 @@
From b37eb61864e0f54aff78ac11d20828cb57278753 Mon Sep 17 00:00:00 2001
From: wu-changsheng <wuchangsheng2@huawei.com>
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

View File

@ -0,0 +1,46 @@
From 732557e3671bed8a71153f4d4f81a650d5a2ecb9 Mon Sep 17 00:00:00 2001
From: kircher <majun65@huawei.com>
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

View File

@ -0,0 +1,32 @@
From 9a7cb66fd9912c3073f3299e8db4167b4882c020 Mon Sep 17 00:00:00 2001
From: wu-changsheng <wuchangsheng2@huawei.com>
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

View File

@ -0,0 +1,27 @@
From fb2c23cc1be1171a70f650d2de6c7dad7539d2db Mon Sep 17 00:00:00 2001
From: wu-changsheng <wuchangsheng2@huawei.com>
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

View File

@ -0,0 +1,83 @@
From 16d35b610e00b18005049d80ad91bedb2ca64501 Mon Sep 17 00:00:00 2001
From: wu-changsheng <wuchangsheng2@huawei.com>
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

View File

@ -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

View File

@ -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

View File

@ -0,0 +1,432 @@
From 29ce2b92248fce0ce90abbcf0625653a5327b232 Mon Sep 17 00:00:00 2001
From: kircher <majun65@huawei.com>
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 dumpedcaught 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

View File

@ -0,0 +1,27 @@
From 3149382926845f44a398ba2d29a732c3e42b11ab Mon Sep 17 00:00:00 2001
From: kircher <majun65@huawei.com>
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

View File

@ -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

View File

@ -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

View File

@ -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 <wuchangsheng2@huawei.com> - 1.0.1-21
- support muti-nic
fix some bugs
* Tue Nov 8 2022 kircher <majun65@huawei.com> - 1.0.1-20
- add pdump support in lstack