From 802d214dc88059fd635fffb0d178b8e790463609 Mon Sep 17 00:00:00 2001 From: Savinay Dharmappa Date: Fri, 9 Oct 2020 13:39:15 +0100 Subject: [PATCH] examples/qos_sched: update subport rate dynamically Modify the qos_sched application to build the hierarchical scheduler with default subport bandwidth profile. It also allows to update a subport with different subport rates dynamically. Signed-off-by: Savinay Dharmappa Acked-by: Cristian Dumitrescu --- examples/qos_sched/cfg_file.c | 151 +++++++++++++++++++-------------- examples/qos_sched/cfg_file.h | 4 + examples/qos_sched/init.c | 20 +++-- examples/qos_sched/main.h | 1 + examples/qos_sched/profile.cfg | 3 + 5 files changed, 110 insertions(+), 69 deletions(-) diff --git a/examples/qos_sched/cfg_file.c b/examples/qos_sched/cfg_file.c index f078e4f7de..cd167bd8e6 100644 --- a/examples/qos_sched/cfg_file.c +++ b/examples/qos_sched/cfg_file.c @@ -142,6 +142,93 @@ cfg_load_pipe(struct rte_cfgfile *cfg, struct rte_sched_pipe_params *pipe_params return 0; } +int +cfg_load_subport_profile(struct rte_cfgfile *cfg, + struct rte_sched_subport_profile_params *subport_profile) +{ + int i; + const char *entry; + int profiles; + + if (!cfg || !subport_profile) + return -1; + + profiles = rte_cfgfile_num_sections(cfg, "subport profile", + sizeof("subport profile") - 1); + subport_params[0].n_pipe_profiles = profiles; + + for (i = 0; i < profiles; i++) { + char sec_name[32]; + snprintf(sec_name, sizeof(sec_name), "subport profile %d", i); + + entry = rte_cfgfile_get_entry(cfg, sec_name, "tb rate"); + if (entry) + subport_profile[i].tb_rate = (uint64_t)atoi(entry); + + entry = rte_cfgfile_get_entry(cfg, sec_name, "tb size"); + if (entry) + subport_profile[i].tb_size = (uint64_t)atoi(entry); + + entry = rte_cfgfile_get_entry(cfg, sec_name, "tc period"); + if (entry) + subport_profile[i].tc_period = (uint64_t)atoi(entry); + + entry = rte_cfgfile_get_entry(cfg, sec_name, "tc 0 rate"); + if (entry) + subport_profile[i].tc_rate[0] = (uint64_t)atoi(entry); + + entry = rte_cfgfile_get_entry(cfg, sec_name, "tc 1 rate"); + if (entry) + subport_profile[i].tc_rate[1] = (uint64_t)atoi(entry); + + entry = rte_cfgfile_get_entry(cfg, sec_name, "tc 2 rate"); + if (entry) + subport_profile[i].tc_rate[2] = (uint64_t)atoi(entry); + + entry = rte_cfgfile_get_entry(cfg, sec_name, "tc 3 rate"); + if (entry) + subport_profile[i].tc_rate[3] = (uint64_t)atoi(entry); + + entry = rte_cfgfile_get_entry(cfg, sec_name, "tc 4 rate"); + if (entry) + subport_profile[i].tc_rate[4] = (uint64_t)atoi(entry); + + entry = rte_cfgfile_get_entry(cfg, sec_name, "tc 5 rate"); + if (entry) + subport_profile[i].tc_rate[5] = (uint64_t)atoi(entry); + + entry = rte_cfgfile_get_entry(cfg, sec_name, "tc 6 rate"); + if (entry) + subport_profile[i].tc_rate[6] = (uint64_t)atoi(entry); + + entry = rte_cfgfile_get_entry(cfg, sec_name, "tc 7 rate"); + if (entry) + subport_profile[i].tc_rate[7] = (uint64_t)atoi(entry); + + entry = rte_cfgfile_get_entry(cfg, sec_name, "tc 8 rate"); + if (entry) + subport_profile[i].tc_rate[8] = (uint64_t)atoi(entry); + + entry = rte_cfgfile_get_entry(cfg, sec_name, "tc 9 rate"); + if (entry) + subport_profile[i].tc_rate[9] = (uint64_t)atoi(entry); + + entry = rte_cfgfile_get_entry(cfg, sec_name, "tc 10 rate"); + if (entry) + subport_profile[i].tc_rate[10] = (uint64_t)atoi(entry); + + entry = rte_cfgfile_get_entry(cfg, sec_name, "tc 11 rate"); + if (entry) + subport_profile[i].tc_rate[11] = (uint64_t)atoi(entry); + + entry = rte_cfgfile_get_entry(cfg, sec_name, "tc 12 rate"); + if (entry) + subport_profile[i].tc_rate[12] = (uint64_t)atoi(entry); + } + + return 0; +} + int cfg_load_subport(struct rte_cfgfile *cfg, struct rte_sched_subport_params *subport_params) { @@ -267,70 +354,6 @@ cfg_load_subport(struct rte_cfgfile *cfg, struct rte_sched_subport_params *subpo } } - entry = rte_cfgfile_get_entry(cfg, sec_name, "tb rate"); - if (entry) - subport_params[i].tb_rate = (uint64_t)atoi(entry); - - entry = rte_cfgfile_get_entry(cfg, sec_name, "tb size"); - if (entry) - subport_params[i].tb_size = (uint64_t)atoi(entry); - - entry = rte_cfgfile_get_entry(cfg, sec_name, "tc period"); - if (entry) - subport_params[i].tc_period = (uint64_t)atoi(entry); - - entry = rte_cfgfile_get_entry(cfg, sec_name, "tc 0 rate"); - if (entry) - subport_params[i].tc_rate[0] = (uint64_t)atoi(entry); - - entry = rte_cfgfile_get_entry(cfg, sec_name, "tc 1 rate"); - if (entry) - subport_params[i].tc_rate[1] = (uint64_t)atoi(entry); - - entry = rte_cfgfile_get_entry(cfg, sec_name, "tc 2 rate"); - if (entry) - subport_params[i].tc_rate[2] = (uint64_t)atoi(entry); - - entry = rte_cfgfile_get_entry(cfg, sec_name, "tc 3 rate"); - if (entry) - subport_params[i].tc_rate[3] = (uint64_t)atoi(entry); - - entry = rte_cfgfile_get_entry(cfg, sec_name, "tc 4 rate"); - if (entry) - subport_params[i].tc_rate[4] = (uint64_t)atoi(entry); - - entry = rte_cfgfile_get_entry(cfg, sec_name, "tc 5 rate"); - if (entry) - subport_params[i].tc_rate[5] = (uint64_t)atoi(entry); - - entry = rte_cfgfile_get_entry(cfg, sec_name, "tc 6 rate"); - if (entry) - subport_params[i].tc_rate[6] = (uint64_t)atoi(entry); - - entry = rte_cfgfile_get_entry(cfg, sec_name, "tc 7 rate"); - if (entry) - subport_params[i].tc_rate[7] = (uint64_t)atoi(entry); - - entry = rte_cfgfile_get_entry(cfg, sec_name, "tc 8 rate"); - if (entry) - subport_params[i].tc_rate[8] = (uint64_t)atoi(entry); - - entry = rte_cfgfile_get_entry(cfg, sec_name, "tc 9 rate"); - if (entry) - subport_params[i].tc_rate[9] = (uint64_t)atoi(entry); - - entry = rte_cfgfile_get_entry(cfg, sec_name, "tc 10 rate"); - if (entry) - subport_params[i].tc_rate[10] = (uint64_t)atoi(entry); - - entry = rte_cfgfile_get_entry(cfg, sec_name, "tc 11 rate"); - if (entry) - subport_params[i].tc_rate[11] = (uint64_t)atoi(entry); - - entry = rte_cfgfile_get_entry(cfg, sec_name, "tc 12 rate"); - if (entry) - subport_params[i].tc_rate[12] = (uint64_t)atoi(entry); - int n_entries = rte_cfgfile_section_num_entries(cfg, sec_name); struct rte_cfgfile_entry entries[n_entries]; diff --git a/examples/qos_sched/cfg_file.h b/examples/qos_sched/cfg_file.h index 2eccf1ca0e..0dc458aa71 100644 --- a/examples/qos_sched/cfg_file.h +++ b/examples/qos_sched/cfg_file.h @@ -14,4 +14,8 @@ int cfg_load_pipe(struct rte_cfgfile *cfg, struct rte_sched_pipe_params *pipe); int cfg_load_subport(struct rte_cfgfile *cfg, struct rte_sched_subport_params *subport); +int cfg_load_subport_profile(struct rte_cfgfile *cfg, + struct rte_sched_subport_profile_params + *subport_profile); + #endif diff --git a/examples/qos_sched/init.c b/examples/qos_sched/init.c index b188c624b0..1abe003fc6 100644 --- a/examples/qos_sched/init.c +++ b/examples/qos_sched/init.c @@ -192,15 +192,20 @@ static struct rte_sched_pipe_params pipe_profiles[MAX_SCHED_PIPE_PROFILES] = { }, }; -struct rte_sched_subport_params subport_params[MAX_SCHED_SUBPORTS] = { +static struct rte_sched_subport_profile_params + subport_profile[MAX_SCHED_SUBPORT_PROFILES] = { { .tb_rate = 1250000000, .tb_size = 1000000, - .tc_rate = {1250000000, 1250000000, 1250000000, 1250000000, 1250000000, 1250000000, 1250000000, 1250000000, 1250000000, 1250000000, 1250000000, 1250000000, 1250000000}, .tc_period = 10, + }, +}; + +struct rte_sched_subport_params subport_params[MAX_SCHED_SUBPORTS] = { + { .n_pipes_per_subport_enabled = 4096, .qsize = {64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64}, .pipe_profiles = pipe_profiles, @@ -285,6 +290,9 @@ struct rte_sched_port_params port_params = { .mtu = 6 + 6 + 4 + 4 + 2 + 1500, .frame_overhead = RTE_SCHED_FRAME_OVERHEAD_DEFAULT, .n_subports_per_port = 1, + .n_subport_profiles = 1, + .subport_profiles = subport_profile, + .n_max_subport_profiles = MAX_SCHED_SUBPORT_PROFILES, .n_pipes_per_subport = MAX_SCHED_PIPES, }; @@ -315,10 +323,11 @@ app_init_sched_port(uint32_t portid, uint32_t socketid) for (subport = 0; subport < port_params.n_subports_per_port; subport ++) { err = rte_sched_subport_config(port, subport, - &subport_params[subport], 0); + &subport_params[subport], + 0); if (err) { - rte_exit(EXIT_FAILURE, "Unable to config sched subport %u, err=%d\n", - subport, err); + rte_exit(EXIT_FAILURE, "Unable to config sched " + "subport %u, err=%d\n", subport, err); } uint32_t n_pipes_per_subport = @@ -351,6 +360,7 @@ app_load_cfg_profile(const char *profile) cfg_load_port(file, &port_params); cfg_load_subport(file, subport_params); + cfg_load_subport_profile(file, subport_profile); cfg_load_pipe(file, pipe_profiles); rte_cfgfile_close(file); diff --git a/examples/qos_sched/main.h b/examples/qos_sched/main.h index 23bc418d97..0d6815ae69 100644 --- a/examples/qos_sched/main.h +++ b/examples/qos_sched/main.h @@ -51,6 +51,7 @@ extern "C" { #define MAX_SCHED_SUBPORTS 8 #define MAX_SCHED_PIPES 4096 #define MAX_SCHED_PIPE_PROFILES 256 +#define MAX_SCHED_SUBPORT_PROFILES 8 #ifndef APP_COLLECT_STAT #define APP_COLLECT_STAT 1 diff --git a/examples/qos_sched/profile.cfg b/examples/qos_sched/profile.cfg index 61b8b7071b..4486d2799e 100644 --- a/examples/qos_sched/profile.cfg +++ b/examples/qos_sched/profile.cfg @@ -26,6 +26,9 @@ number of subports per port = 1 number of pipes per subport = 4096 queue sizes = 64 64 64 64 64 64 64 64 64 64 64 64 64 +subport 0-8 = 0 ; These subports are configured with subport profile 0 + +[subport profile 0] tb rate = 1250000000 ; Bytes per second tb size = 1000000 ; Bytes -- 2.20.1