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:
parent
ac6fcb841b
commit
802d214dc8
@ -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];
|
||||
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user