update README
fix some bugs
refactor pkt read send to improve performance
refactor kernle event toimproveperformance
(cherry picked from commit a8c66704608ca83c799adab88be6214bccdcfa44)
357 lines
11 KiB
Diff
357 lines
11 KiB
Diff
From 77a8fb02a7c4352fee106d0aa83500d81c20d315 Mon Sep 17 00:00:00 2001
|
|
From: wuchangsheng <wuchangsheng2@huawei.com>
|
|
Date: Thu, 21 Apr 2022 16:42:01 +0800
|
|
Subject: [PATCH 07/18] clean code:fix huge func
|
|
|
|
---
|
|
src/lstack/core/lstack_control_plane.c | 2 +-
|
|
src/lstack/core/lstack_init.c | 101 +++++++++++++-----------
|
|
src/lstack/core/lstack_protocol_stack.c | 89 +++++++++++----------
|
|
3 files changed, 105 insertions(+), 87 deletions(-)
|
|
|
|
diff --git a/src/lstack/core/lstack_control_plane.c b/src/lstack/core/lstack_control_plane.c
|
|
index 13a2ed3..26a1b1c 100644
|
|
--- a/src/lstack/core/lstack_control_plane.c
|
|
+++ b/src/lstack/core/lstack_control_plane.c
|
|
@@ -705,7 +705,7 @@ void control_server_thread(void *arg)
|
|
|
|
int32_t epfd = init_epoll(listenfd);
|
|
if (epfd < 0) {
|
|
- LSTACK_LOG(ERR, LSTACK, "control_init_server failed\n");
|
|
+ LSTACK_LOG(ERR, LSTACK, "init_epoll failed\n");
|
|
return;
|
|
}
|
|
|
|
diff --git a/src/lstack/core/lstack_init.c b/src/lstack/core/lstack_init.c
|
|
index 335d834..037b8fd 100644
|
|
--- a/src/lstack/core/lstack_init.c
|
|
+++ b/src/lstack/core/lstack_init.c
|
|
@@ -155,12 +155,52 @@ __attribute__((destructor)) void gazelle_network_exit(void)
|
|
}
|
|
}
|
|
|
|
-__attribute__((constructor)) void gazelle_network_init(void)
|
|
+static void create_control_thread(void)
|
|
{
|
|
int32_t ret;
|
|
|
|
+ pthread_t tid;
|
|
+ if (use_ltran()) {
|
|
+ dpdk_skip_nic_init();
|
|
+ if (control_init_client(false) != 0) {
|
|
+ LSTACK_EXIT(1, "control_init_client failed\n");
|
|
+ }
|
|
+ ret = pthread_create(&tid, NULL, (void *(*)(void *))control_client_thread, NULL);
|
|
+ } else {
|
|
+ ret = dpdk_eal_init();
|
|
+ if (ret < 0) {
|
|
+ LSTACK_EXIT(1, "dpdk_eal_init failed ret=%d errno=%d\n", ret, errno);
|
|
+ }
|
|
+
|
|
+ ret = pthread_create(&tid, NULL, (void *(*)(void *))control_server_thread, NULL);
|
|
+ }
|
|
+ if (ret != 0) {
|
|
+ LSTACK_EXIT(1, "pthread_create failed ret=%d errno=%d\n", ret, errno);
|
|
+ }
|
|
+
|
|
+ if (pthread_setname_np(tid, CONTROL_THREAD_NAME) != 0) {
|
|
+ LSTACK_LOG(ERR, LSTACK, "pthread_setname_np failed errno=%d\n", errno);
|
|
+ }
|
|
+ LSTACK_LOG(INFO, LSTACK, "create control_easy_thread success\n");
|
|
+}
|
|
+
|
|
+static void gazelle_signal_init(void)
|
|
+{
|
|
+ /* to prevent crash , just ignore SIGPIPE when socket is closed */
|
|
+ if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) {
|
|
+ LSTACK_PRE_LOG(LSTACK_ERR, "signal error, errno:%d.", errno);
|
|
+ LSTACK_EXIT(1, "signal SIGPIPE SIG_IGN\n");
|
|
+ }
|
|
+
|
|
+ /*
|
|
+ * register core sig handler func to dumped stack */
|
|
+ lstack_signal_init();
|
|
+}
|
|
+
|
|
+__attribute__((constructor)) void gazelle_network_init(void)
|
|
+{
|
|
/*
|
|
- * Phase 1: Init POSXI API and prelog */
|
|
+ * Init POSXI API and prelog */
|
|
lstack_prelog_init("LSTACK");
|
|
if (posix_api_init() != 0) {
|
|
LSTACK_PRE_LOG(LSTACK_ERR, "posix_api_init failed\n");
|
|
@@ -168,7 +208,7 @@ __attribute__((constructor)) void gazelle_network_init(void)
|
|
}
|
|
|
|
/*
|
|
- * Phase 2: Init LD_PRELOAD */
|
|
+ * Init LD_PRELOAD */
|
|
if (preload_info_init() < 0) {
|
|
return;
|
|
}
|
|
@@ -177,7 +217,7 @@ __attribute__((constructor)) void gazelle_network_init(void)
|
|
}
|
|
|
|
/*
|
|
- * Phase 3: Read configure from lstack.cfg */
|
|
+ * Read configure from lstack.cfg */
|
|
if (cfg_init() != 0) {
|
|
LSTACK_PRE_LOG(LSTACK_ERR, "cfg_init failed\n");
|
|
LSTACK_EXIT(1, "cfg_init failed\n");
|
|
@@ -185,87 +225,56 @@ __attribute__((constructor)) void gazelle_network_init(void)
|
|
LSTACK_PRE_LOG(LSTACK_INFO, "cfg_init success\n");
|
|
|
|
/*
|
|
- * Phase 4: check conflict */
|
|
+ * check conflict */
|
|
if (check_process_conflict() < 0) {
|
|
LSTACK_PRE_LOG(LSTACK_INFO, "Have another same primary process. WARNING: Posix API will use kernel mode!\n");
|
|
return;
|
|
}
|
|
|
|
/*
|
|
- * Phase 5: save initial affinity */
|
|
+ * save initial affinity */
|
|
if (thread_affinity_default() < 0) {
|
|
LSTACK_PRE_LOG(LSTACK_ERR, "pthread_getaffinity_np failed\n");
|
|
LSTACK_EXIT(1, "pthread_getaffinity_np failed\n");
|
|
}
|
|
|
|
- /* to prevent crash , just ignore SIGPIPE when socket is closed */
|
|
- if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) {
|
|
- LSTACK_PRE_LOG(LSTACK_ERR, "signal error, errno:%d.", errno);
|
|
- LSTACK_EXIT(1, "signal SIGPIPE SIG_IGN\n");
|
|
- }
|
|
+ gazelle_signal_init();
|
|
|
|
/*
|
|
- * Phase 6: Init control plane and dpdk init */
|
|
- pthread_t tid;
|
|
- if (use_ltran()) {
|
|
- dpdk_skip_nic_init();
|
|
- if (control_init_client(false) != 0) {
|
|
- LSTACK_EXIT(1, "control_init_client failed\n");
|
|
- }
|
|
- ret = pthread_create(&tid, NULL, (void *(*)(void *))control_client_thread, NULL);
|
|
- } else {
|
|
- ret = dpdk_eal_init();
|
|
- if (ret < 0) {
|
|
- LSTACK_EXIT(1, "dpdk_eal_init failed ret=%d errno=%d\n", ret, errno);
|
|
- }
|
|
-
|
|
- ret = pthread_create(&tid, NULL, (void *(*)(void *))control_server_thread, NULL);
|
|
- }
|
|
- if (ret != 0) {
|
|
- LSTACK_EXIT(1, "pthread_create failed errno=%d\n", errno);
|
|
- }
|
|
- if (pthread_setname_np(tid, CONTROL_THREAD_NAME) != 0) {
|
|
- LSTACK_LOG(ERR, LSTACK, "pthread_setname_np failed errno=%d\n", errno);
|
|
- }
|
|
- LSTACK_LOG(INFO, LSTACK, "create control_easy_thread success\n");
|
|
+ * Init control plane and dpdk init */
|
|
+ create_control_thread();
|
|
|
|
/*
|
|
- * Phase 7: cancel the core binding from DPDK initialization */
|
|
+ * cancel the core binding from DPDK initialization */
|
|
if (thread_affinity_default() < 0) {
|
|
LSTACK_EXIT(1, "pthread_setaffinity_np failed\n");
|
|
}
|
|
|
|
lstack_log_level_init();
|
|
+ lstack_prelog_uninit();
|
|
|
|
- ret = init_protocol_stack();
|
|
- if (ret != 0) {
|
|
+ if (init_protocol_stack() != 0) {
|
|
LSTACK_EXIT(1, "init_protocol_stack failed\n");
|
|
}
|
|
|
|
/*
|
|
- * Phase 8: nic */
|
|
+ * nic */
|
|
if (!use_ltran()) {
|
|
- ret = init_dpdk_ethdev();
|
|
- if (ret != 0) {
|
|
+ if (init_dpdk_ethdev() != 0) {
|
|
LSTACK_EXIT(1, "init_dpdk_ethdev failed\n");
|
|
}
|
|
}
|
|
|
|
/*
|
|
- * Phase 9: lwip initialization */
|
|
+ * lwip initialization */
|
|
lwip_sock_init();
|
|
|
|
- /*
|
|
- * Phase 10: register core sig handler func to dumped stack */
|
|
- lstack_signal_init();
|
|
-
|
|
/* wait stack thread and kernel_event thread init finish */
|
|
wait_sem_value(&get_protocol_stack_group()->all_init, get_protocol_stack_group()->stack_num);
|
|
if (g_init_fail) {
|
|
LSTACK_EXIT(1, "stack thread or kernel_event thread failed\n");
|
|
}
|
|
|
|
- lstack_prelog_uninit();
|
|
posix_api->is_chld = 0;
|
|
LSTACK_LOG(INFO, LSTACK, "gazelle_network_init success\n");
|
|
rte_smp_mb();
|
|
diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c
|
|
index 8f0b785..565d19b 100644
|
|
--- a/src/lstack/core/lstack_protocol_stack.c
|
|
+++ b/src/lstack/core/lstack_protocol_stack.c
|
|
@@ -217,7 +217,7 @@ static void* gazelle_weakup_thread(void *arg)
|
|
return NULL;
|
|
}
|
|
|
|
-static void init_stack_value(struct protocol_stack *stack, uint16_t queue_id)
|
|
+static int32_t init_stack_value(struct protocol_stack *stack, uint16_t queue_id)
|
|
{
|
|
struct protocol_stack_group *stack_group = get_protocol_stack_group();
|
|
|
|
@@ -241,6 +241,31 @@ static void init_stack_value(struct protocol_stack *stack, uint16_t queue_id)
|
|
stack_stat_init();
|
|
|
|
stack_group->stacks[queue_id] = stack;
|
|
+
|
|
+ cpu_set_t cpuset;
|
|
+ CPU_ZERO(&cpuset);
|
|
+ CPU_SET(stack->cpu_id, &cpuset);
|
|
+ if (rte_thread_set_affinity(&cpuset) != 0) {
|
|
+ LSTACK_LOG(ERR, LSTACK, "rte_thread_set_affinity failed\n");
|
|
+ return -1;
|
|
+ }
|
|
+ RTE_PER_LCORE(_lcore_id) = stack->cpu_id;
|
|
+
|
|
+ stack->socket_id = numa_node_of_cpu(stack->cpu_id);
|
|
+ if (stack->socket_id < 0) {
|
|
+ LSTACK_LOG(ERR, LSTACK, "numa_node_of_cpu failed\n");
|
|
+ return -1;
|
|
+ }
|
|
+
|
|
+ if (pktmbuf_pool_init(stack, stack_group->stack_num) != 0) {
|
|
+ return -1;
|
|
+ }
|
|
+
|
|
+ if (create_shared_ring(stack) != 0) {
|
|
+ return -1;
|
|
+ }
|
|
+
|
|
+ return 0;
|
|
}
|
|
|
|
void wait_sem_value(sem_t *sem, int32_t wait_value)
|
|
@@ -260,33 +285,8 @@ static struct protocol_stack * stack_thread_init(uint16_t queue_id)
|
|
LSTACK_LOG(ERR, LSTACK, "malloc stack failed\n");
|
|
return NULL;
|
|
}
|
|
- init_stack_value(stack, queue_id);
|
|
-
|
|
- cpu_set_t cpuset;
|
|
- CPU_ZERO(&cpuset);
|
|
- CPU_SET(stack->cpu_id, &cpuset);
|
|
- if (rte_thread_set_affinity(&cpuset) != 0) {
|
|
- LSTACK_LOG(ERR, LSTACK, "rte_thread_set_affinity failed\n");
|
|
- free(stack);
|
|
- return NULL;
|
|
- }
|
|
- RTE_PER_LCORE(_lcore_id) = stack->cpu_id;
|
|
-
|
|
- stack->socket_id = numa_node_of_cpu(stack->cpu_id);
|
|
- if (stack->socket_id < 0) {
|
|
- LSTACK_LOG(ERR, LSTACK, "numa_node_of_cpu failed\n");
|
|
- free(stack);
|
|
- return NULL;
|
|
- }
|
|
|
|
- int32_t ret = pktmbuf_pool_init(stack, stack_group->stack_num);
|
|
- if (ret != 0) {
|
|
- free(stack);
|
|
- return NULL;
|
|
- }
|
|
-
|
|
- ret = create_shared_ring(stack);
|
|
- if (ret != 0) {
|
|
+ if (init_stack_value(stack, queue_id) != 0) {
|
|
free(stack);
|
|
return NULL;
|
|
}
|
|
@@ -298,8 +298,7 @@ static struct protocol_stack * stack_thread_init(uint16_t queue_id)
|
|
tcpip_init(NULL, NULL);
|
|
|
|
if (use_ltran()) {
|
|
- ret = client_reg_thrd_ring();
|
|
- if (ret != 0) {
|
|
+ if (client_reg_thrd_ring() != 0) {
|
|
free(stack);
|
|
return NULL;
|
|
}
|
|
@@ -311,15 +310,13 @@ static struct protocol_stack * stack_thread_init(uint16_t queue_id)
|
|
wait_sem_value(&stack_group->ethdev_init, 1);
|
|
}
|
|
|
|
-
|
|
- ret = ethdev_init(stack);
|
|
- if (ret != 0) {
|
|
+ if (ethdev_init(stack) != 0) {
|
|
free(stack);
|
|
return NULL;
|
|
}
|
|
|
|
if (stack_group->wakeup_enable) {
|
|
- ret = create_thread(stack->queue_id, "gazelleweakup", gazelle_weakup_thread);
|
|
+ int32_t ret = create_thread(stack->queue_id, "gazelleweakup", gazelle_weakup_thread);
|
|
if (ret != 0) {
|
|
free(stack);
|
|
return NULL;
|
|
@@ -363,25 +360,37 @@ static void* gazelle_stack_thread(void *arg)
|
|
return NULL;
|
|
}
|
|
|
|
-int32_t init_protocol_stack(void)
|
|
+static int32_t init_protocol_sem(void)
|
|
{
|
|
- struct protocol_stack_group *stack_group = get_protocol_stack_group();
|
|
int32_t ret;
|
|
-
|
|
- stack_group->stack_num = get_global_cfg_params()->num_cpu;
|
|
- stack_group->wakeup_enable = (get_global_cfg_params()->num_wakeup > 0) ? true : false;
|
|
+ struct protocol_stack_group *stack_group = get_protocol_stack_group();
|
|
|
|
if (!use_ltran()) {
|
|
ret = sem_init(&stack_group->ethdev_init, 0, 0);
|
|
if (ret < 0) {
|
|
- LSTACK_LOG(ERR, PORT, "sem_init failed\n");
|
|
+ LSTACK_LOG(ERR, PORT, "sem_init failed ret=%d errno=%d\n", ret, errno);
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
ret = sem_init(&stack_group->thread_phase1, 0, 0);
|
|
if (ret < 0) {
|
|
- LSTACK_LOG(ERR, PORT, "sem_init failed\n");
|
|
+ LSTACK_LOG(ERR, PORT, "sem_init failed ret=%d errno=%d\n", ret, errno);
|
|
+ return -1;
|
|
+ }
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+int32_t init_protocol_stack(void)
|
|
+{
|
|
+ struct protocol_stack_group *stack_group = get_protocol_stack_group();
|
|
+ int32_t ret;
|
|
+
|
|
+ stack_group->stack_num = get_global_cfg_params()->num_cpu;
|
|
+ stack_group->wakeup_enable = (get_global_cfg_params()->num_wakeup > 0) ? true : false;
|
|
+
|
|
+ if (init_protocol_sem() != 0) {
|
|
return -1;
|
|
}
|
|
|
|
--
|
|
2.23.0
|
|
|