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 <savinay.dharmappa@intel.com>
Acked-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
This commit is contained in:
Savinay Dharmappa 2020-10-09 13:39:15 +01:00 committed by Thomas Monjalon
parent ac6fcb841b
commit 802d214dc8
5 changed files with 110 additions and 69 deletions

View File

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

View File

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

View File

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

View File

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

View File

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