From 1c771f0af29dad27d29af371b13ab3013efc44c3 Mon Sep 17 00:00:00 2001 From: Lemmy Huang Date: Tue, 20 Jun 2023 17:30:34 +0800 Subject: [PATCH] lstack: cfg add app_exclude_cpus Signed-off-by: Lemmy Huang --- src/lstack/core/lstack_cfg.c | 55 ++++++++++++++++--- src/lstack/include/lstack_cfg.h | 2 + 2 files changed, 49 insertions(+), 8 deletions(-) diff --git a/src/lstack/core/lstack_cfg.c b/src/lstack/core/lstack_cfg.c index daf49ea..8a627d5 100644 --- a/src/lstack/core/lstack_cfg.c +++ b/src/lstack/core/lstack_cfg.c @@ -47,6 +47,8 @@ static config_t g_config; static int32_t parse_host_addr(void); static int32_t parse_low_power_mode(void); static int32_t parse_stack_cpu_number(void); +static int32_t parse_app_bind_numa(void); +static int32_t parse_app_exclude_cpus(void); static int32_t parse_use_ltran(void); static int32_t parse_mask_addr(void); static int32_t parse_devices(void); @@ -54,7 +56,6 @@ static int32_t parse_dpdk_args(void); 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_main_thread_affinity(void); static int32_t parse_unix_prefix(void); static int32_t parse_read_connect_number(void); @@ -111,6 +112,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 }, + { "app_exclude_cpus", parse_app_exclude_cpus }, { "main_thread_affinity", parse_main_thread_affinity }, { "unix_prefix", parse_unix_prefix }, { "tcp_conn_count", parse_tcp_conn_count }, @@ -391,6 +393,46 @@ static int32_t parse_stack_cpu_number(void) return 0; } +static int32_t parse_app_bind_numa(void) +{ + int32_t ret; + PARSE_ARG(g_config_params.app_bind_numa, "app_bind_numa", 1, 0, 1, ret); + return ret; +} + +static int32_t parse_app_exclude_cpus(void) +{ + const config_setting_t *num_cpus = NULL; + const char *args = NULL; + char *tmp_arg; + int32_t cnt; + + g_config_params.app_exclude_num_cpu = 0; + if (!g_config_params.app_bind_numa) { + return 0; + } + + num_cpus = config_lookup(&g_config, "app_exclude_cpus"); + if (num_cpus == NULL) { + return 0; + } + + args = config_setting_get_string(num_cpus); + if (args == NULL) { + return -EINVAL; + } + + tmp_arg = strdup(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) { + return -EINVAL; + } + + g_config_params.app_exclude_num_cpu = cnt; + return 0; +} + static int32_t numa_to_cpusnum(unsigned socket_id, uint32_t *cpulist, int32_t num) { char path[PATH_MAX] = {0}; @@ -458,6 +500,10 @@ int32_t init_stack_numa_cpuset(struct protocol_stack *stack) } } + for (int32_t idx = 0; idx < cfg->app_exclude_num_cpu; ++idx) { + CPU_SET(cfg->app_exclude_cpus[idx], &stack_cpuset); + } + ret = stack_idle_cpuset(stack, &stack_cpuset); if (ret < 0) { LSTACK_LOG(ERR, LSTACK, "thread_get_cpuset stack(%u) failed\n", stack->tid); @@ -836,13 +882,6 @@ static int32_t parse_listen_shadow(void) return ret; } -static int32_t parse_app_bind_numa(void) -{ - int32_t ret; - PARSE_ARG(g_config_params.app_bind_numa, "app_bind_numa", 1, 0, 1, ret); - return ret; -} - static int32_t parse_main_thread_affinity(void) { int32_t ret; diff --git a/src/lstack/include/lstack_cfg.h b/src/lstack/include/lstack_cfg.h index b000519..6da18cf 100644 --- a/src/lstack/include/lstack_cfg.h +++ b/src/lstack/include/lstack_cfg.h @@ -68,6 +68,8 @@ struct cfg_params { uint32_t cpus[CFG_MAX_CPUS]; uint32_t send_cpus[CFG_MAX_CPUS]; uint32_t recv_cpus[CFG_MAX_CPUS]; + uint16_t app_exclude_num_cpu; + uint32_t app_exclude_cpus[CFG_MAX_CPUS]; uint8_t num_ports; uint16_t ports[CFG_MAX_PORTS]; char log_file[PATH_MAX]; -- 2.33.0