diff --git a/0217-sepeate_string_to-array-add-error-args-handle.patch b/0217-sepeate_string_to-array-add-error-args-handle.patch new file mode 100644 index 0000000..1150d95 --- /dev/null +++ b/0217-sepeate_string_to-array-add-error-args-handle.patch @@ -0,0 +1,243 @@ +From db72811dedba01003a24bc85eaa6fccb65342ef0 Mon Sep 17 00:00:00 2001 +From: jiangheng12 +Date: Fri, 24 Mar 2023 10:12:53 +0800 +Subject: [PATCH] sepeate_string_to array add error args handle + +--- + src/common/gazelle_base_func.h | 2 +- + src/common/gazelle_opt.h | 2 + + src/common/gazelle_parse_config.c | 89 ++++++++++++++++--------------- + src/lstack/core/lstack_cfg.c | 25 +++++---- + src/ltran/ltran_param.c | 3 +- + 5 files changed, 67 insertions(+), 54 deletions(-) + +diff --git a/src/common/gazelle_base_func.h b/src/common/gazelle_base_func.h +index 22d7a7f..d21ef5f 100644 +--- a/src/common/gazelle_base_func.h ++++ b/src/common/gazelle_base_func.h +@@ -28,7 +28,7 @@ + #define NODE_ENTRY(node, type, member) \ + ((type*)((char*)(node) - (size_t)&((type*)0)->member)) + +-int32_t separate_str_to_array(char *args, uint32_t *array, int32_t array_size); ++int32_t separate_str_to_array(char *args, uint32_t *array, int32_t array_size, int32_t max_value); + + int32_t check_and_set_run_dir(void); + +diff --git a/src/common/gazelle_opt.h b/src/common/gazelle_opt.h +index fe0483b..4420ba4 100644 +--- a/src/common/gazelle_opt.h ++++ b/src/common/gazelle_opt.h +@@ -88,6 +88,8 @@ + #define GAZELLE_PRIMARY_START_PATH "/var/run/gazelle/gazelle_primary" + #define GAZELLE_FILE_PERMISSION 0700 + ++#define GAZELLE_MAX_PORTS_VALUE (UINT16_MAX - 1) ++ + #define SEND_TIME_WAIT_NS 20000 + #define SECOND_NSECOND 1000000000 + +diff --git a/src/common/gazelle_parse_config.c b/src/common/gazelle_parse_config.c +index fc286d9..a2bdde1 100644 +--- a/src/common/gazelle_parse_config.c ++++ b/src/common/gazelle_parse_config.c +@@ -31,58 +31,63 @@ + #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) ++int32_t separate_str_to_array(char *args, uint32_t *array, int32_t array_size, int32_t max_value) + { +- const char *delim = "-"; +- char *elem = NULL; +- char *next_token = NULL; +- char *endptr = NULL; +- int32_t cnt = 0; +- int64_t start, end; ++ uint32_t count = 0; ++ char *end = NULL; ++ int32_t min, max; ++ int32_t idx; + +- elem = strtok_s(args, delim, &next_token); +- start = strtol(elem, &endptr, 0); +- if (endptr == elem) { +- return cnt; ++ for (idx = 0; idx < array_size; idx++) { ++ array[idx] = 0; + } + +- elem = strtok_s(NULL, delim, &next_token); +- if (elem == NULL) { +- /* just a single data */ +- array[cnt++] = (uint32_t)start; +- return cnt; +- } +- end = strtol(elem, &endptr, 0); +- if (endptr == elem) { +- array[cnt++] = start; +- return cnt; ++ while (isblank(*args)) { ++ args++; + } + +- for (int64_t i = start; i <= end && cnt < array_size; i++) { +- if (i < 0 || i > UINT_MAX) { +- break; ++ min = array_size; ++ do { ++ while (isblank(*args)) { ++ args++; + } +- array[cnt++] = (uint32_t)i; +- } +- +- return cnt; +-} +- +-/* support '-' and ',' */ +-int32_t separate_str_to_array(char *args, uint32_t *array, int32_t array_size) +-{ +- const char *delim = ","; +- char *elem = NULL; +- char *next_token = NULL; +- int32_t cnt = 0; ++ if (*args == '\0') { ++ return -1; ++ } ++ errno = 0; ++ idx = strtol(args, &end, 10); /* 10: decimal */ ++ if (errno || end == NULL) { ++ return -1; ++ } ++ if (idx < 0 || idx >= max_value) { ++ return -1; ++ } ++ while (isblank(*end)) { ++ end++; ++ } ++ if (*end == '-') { ++ min = idx; ++ } else if ((*end == ',') || (*end == '\0') || (*end == '\n')) { ++ max = idx; ++ if (min == array_size) { ++ min = idx; ++ } ++ for (idx = min; idx <= max; idx++) { ++ array[count] = idx; ++ count++; ++ } ++ min = array_size; ++ } else { ++ return -1; ++ } ++ args = end + 1; ++ } while (*end != '\0' && *end != '\n'); + +- elem = strtok_s(args, delim, &next_token); +- while (elem != NULL && cnt < array_size) { +- cnt += parse_str_data(elem, &array[cnt], array_size - cnt); +- elem = strtok_s(NULL, delim, &next_token); ++ if (count == 0) { ++ return -1; + } + +- return cnt; ++ return count; + } + + int32_t check_and_set_run_dir(void) +diff --git a/src/lstack/core/lstack_cfg.c b/src/lstack/core/lstack_cfg.c +index bed102e..f033fa7 100644 +--- a/src/lstack/core/lstack_cfg.c ++++ b/src/lstack/core/lstack_cfg.c +@@ -309,7 +309,7 @@ static int32_t parse_stack_cpu_number(void) + } + + char *tmp_arg = strdup(args); +- int32_t cnt = separate_str_to_array(tmp_arg, g_config_params.cpus, CFG_MAX_CPUS); ++ 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) { + return -EINVAL; +@@ -342,7 +342,7 @@ static int32_t parse_stack_cpu_number(void) + } + + char *tmp_arg_send = strdup(args); +- int32_t cnt = separate_str_to_array(tmp_arg_send, g_config_params.send_cpus, CFG_MAX_CPUS); ++ 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); + + // recv_num_cpus +@@ -368,15 +368,15 @@ static int32_t parse_stack_cpu_number(void) + } + + char *tmp_arg_recv = strdup(args); +- cnt = separate_str_to_array(tmp_arg_recv, g_config_params.recv_cpus, CFG_MAX_CPUS); ++ 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); + +- if (cnt <= 0 || cnt > CFG_MAX_CPUS / 2) { ++ if (send_cpu_cnt <= 0 || send_cpu_cnt > CFG_MAX_CPUS / 2 || send_cpu_cnt != recv_cpu_cnt) { + return -EINVAL; + } + +- g_config_params.num_cpu = cnt; +- g_config_params.num_queue = (uint16_t)cnt * 2; ++ g_config_params.num_cpu = send_cpu_cnt; ++ g_config_params.num_queue = (uint16_t)send_cpu_cnt * 2; + g_config_params.tot_queue_num = g_config_params.num_queue; + } + +@@ -407,7 +407,7 @@ static int32_t numa_to_cpusnum(unsigned socket_id, uint32_t *cpulist, int32_t nu + return -1; + } + +- int32_t count = separate_str_to_array(strbuf, cpulist, num); ++ int32_t count = separate_str_to_array(strbuf, cpulist, num, CFG_MAX_CPUS); + return count; + } + +@@ -492,9 +492,14 @@ static int32_t gazelle_parse_socket_mem(const char *arg, struct secondary_attach + return -1; + } + +- int32_t count = separate_str_to_array(socket_mem, sec_attach_arg->socket_per_size, GAZELLE_MAX_NUMA_NODES); ++ int32_t count = separate_str_to_array(socket_mem, sec_attach_arg->socket_per_size, GAZELLE_MAX_NUMA_NODES, GAZELLE_MAX_PORTS_VALUE); ++ ++ if (count < 0) { ++ return -1; ++ } ++ + for (uint32_t i = 0; i < count; i++) { +- mem_size += sec_attach_arg->socket_per_size[count]; ++ mem_size += sec_attach_arg->socket_per_size[i]; + } + mem_size *= 1024LL; + mem_size *= 1024LL; +@@ -993,7 +998,7 @@ static int32_t parse_process_numa(void) + return 0; + } + +- ret = separate_str_to_array((char *)args, g_config_params.process_numa, PROTOCOL_STACK_MAX); ++ ret = separate_str_to_array((char *)args, g_config_params.process_numa, PROTOCOL_STACK_MAX, GAZELLE_MAX_NUMA_NODES); + if (ret <= 0) { + return -EINVAL; + } +diff --git a/src/ltran/ltran_param.c b/src/ltran/ltran_param.c +index 1b9d82b..7cf3423 100644 +--- a/src/ltran/ltran_param.c ++++ b/src/ltran/ltran_param.c +@@ -339,7 +339,8 @@ static int32_t parse_bond_ports(const config_t *config, const char *key, struct + return GAZELLE_ERR; + } + +- ltran_config->bond.port_num = separate_str_to_array(port_str, ltran_config->bond.portmask, GAZELLE_MAX_BOND_NUM); ++ ltran_config->bond.port_num = separate_str_to_array(port_str, ltran_config->bond.portmask, GAZELLE_MAX_BOND_NUM, GAZELLE_MAX_PORTS_VALUE); ++ + if (ltran_config->bond.port_num > GAZELLE_MAX_BOND_NUM) { + free(port_str); + gazelle_set_errno(GAZELLE_ERANGE); +-- +2.23.0 + diff --git a/gazelle.spec b/gazelle.spec index 7783522..eddc08e 100644 --- a/gazelle.spec +++ b/gazelle.spec @@ -2,7 +2,7 @@ Name: gazelle Version: 1.0.1 -Release: 54 +Release: 55 Summary: gazelle is a high performance user-mode stack License: MulanPSL-2.0 URL: https://gitee.com/openeuler/gazelle @@ -231,6 +231,7 @@ Patch9213: 0213-discard-wakeup_num-parameter.patch Patch9214: 0214-fix-parse-args-error.patch Patch9215: 0215-gazelle-send-recv-thread-bind-numa.patch Patch9216: 0216-waiting-when-primary-process-not-start-already.patch +Patch9217: 0217-sepeate_string_to-array-add-error-args-handle.patch %description %{name} is a high performance user-mode stack. @@ -271,6 +272,9 @@ install -Dpm 0640 %{_builddir}/%{name}-%{version}/src/ltran/ltran.conf %{b %config(noreplace) %{conf_path}/ltran.conf %changelog +* Thu Apr 20 2023 sunsuwan - 1.0.1-55 +- sepeate_string_to array add error args handle + * Thu Apr 20 UTC wu-changsheng - 1.0.1-54 - waiting when primary process not start already - gazelle send/recv thread bind numa