[RFC,2/2] example/qos_sched: subport bandwidth profile config
Checks
Commit Message
qos sched application uses the new apis introduced as part of dynamic
configuration of subport bandwidth to configure the deafult subport
bandwidth profile while buidling the hirerachical scheduler.
Signed-off-by: Savinay Dharmappa <savinay.dharmappa@intel.com>
Signed-off-by: Jasvinder Singh <jasvinder.singh@intel.com>
---
examples/qos_sched/cfg_file.c | 158 ++++++++++++++++++++++++-----------------
examples/qos_sched/cfg_file.h | 4 ++
examples/qos_sched/init.c | 24 +++++--
examples/qos_sched/main.h | 1 +
examples/qos_sched/profile.cfg | 3 +
5 files changed, 120 insertions(+), 70 deletions(-)
Comments
> -----Original Message-----
> From: Dharmappa, Savinay <savinay.dharmappa@intel.com>
> Sent: Wednesday, July 15, 2020 7:28 PM
> To: Dharmappa, Savinay <savinay.dharmappa@intel.com>; Singh, Jasvinder
> <jasvinder.singh@intel.com>; dev@dpdk.org
> Subject: [RFC PATCH 2/2] example/qos_sched: subport bandwidth profile
> config
>
> qos sched application uses the new apis introduced as part of dynamic
> configuration of subport bandwidth to configure the deafult subport
> bandwidth profile while buidling the hirerachical scheduler.
>
> Signed-off-by: Savinay Dharmappa <savinay.dharmappa@intel.com>
> Signed-off-by: Jasvinder Singh <jasvinder.singh@intel.com>
> ---
> examples/qos_sched/cfg_file.c | 158 ++++++++++++++++++++++++-------------
> ----
> examples/qos_sched/cfg_file.h | 4 ++
> examples/qos_sched/init.c | 24 +++++--
> examples/qos_sched/main.h | 1 +
> examples/qos_sched/profile.cfg | 3 +
> 5 files changed, 120 insertions(+), 70 deletions(-)
>
> diff --git a/examples/qos_sched/cfg_file.c b/examples/qos_sched/cfg_file.c
> index f078e4f..9e1341c 100644
> --- a/examples/qos_sched/cfg_file.c
> +++ b/examples/qos_sched/cfg_file.c
> @@ -53,8 +53,11 @@ cfg_load_pipe(struct rte_cfgfile *cfg, struct
> rte_sched_pipe_params *pipe_params
> if (!cfg || !pipe_params)
> return -1;
>
> - profiles = rte_cfgfile_num_sections(cfg, "pipe profile", sizeof("pipe
> profile") - 1);
> - subport_params[0].n_pipe_profiles = profiles;
> + profiles = rte_cfgfile_num_sections(cfg, "pipe profile",
> + sizeof("pipe profile") - 1);
> + port_params.n_subport_profiles = profiles;
> +
> + printf(" profiles = %d", profiles);
>
> for (j = 0; j < profiles; j++) {
> char pipe_name[32];
> @@ -143,6 +146,93 @@ cfg_load_pipe(struct rte_cfgfile *cfg, struct
> rte_sched_pipe_params *pipe_params }
>
> 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) {
> const char *entry;
> @@ -267,70 +357,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 2eccf1c..0dc458a 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
> 9626c15..541adb7 100644
> --- a/examples/qos_sched/init.c
> +++ b/examples/qos_sched/init.c
> @@ -196,15 +196,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,
> @@ -289,6 +294,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, };
>
> @@ -320,8 +328,15 @@ 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]);
> if (err) {
> - rte_exit(EXIT_FAILURE, "Unable to config sched
> subport %u, err=%d\n",
> - subport, err);
> + rte_exit(EXIT_FAILURE, "Unable to config schedi "
> + "subport %u, err=%d\n", subport, err);
> + }
> +
> + err = rte_sched_subport_profile_config(port, subport, 0);
> + if (err) {
> + rte_exit(EXIT_FAILURE, "failed to configure "
> + "profile err=%d\n", err);
> +
> }
>
> uint32_t n_pipes_per_subport =
> @@ -354,6 +369,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 23bc418..0d6815a 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 61b8b70..4486d27 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.7.4
+ Cristian
@@ -53,8 +53,11 @@ cfg_load_pipe(struct rte_cfgfile *cfg, struct rte_sched_pipe_params *pipe_params
if (!cfg || !pipe_params)
return -1;
- profiles = rte_cfgfile_num_sections(cfg, "pipe profile", sizeof("pipe profile") - 1);
- subport_params[0].n_pipe_profiles = profiles;
+ profiles = rte_cfgfile_num_sections(cfg, "pipe profile",
+ sizeof("pipe profile") - 1);
+ port_params.n_subport_profiles = profiles;
+
+ printf(" profiles = %d", profiles);
for (j = 0; j < profiles; j++) {
char pipe_name[32];
@@ -143,6 +146,93 @@ cfg_load_pipe(struct rte_cfgfile *cfg, struct rte_sched_pipe_params *pipe_params
}
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)
{
const char *entry;
@@ -267,70 +357,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
@@ -196,15 +196,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,
@@ -289,6 +294,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,
};
@@ -320,8 +328,15 @@ 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]);
if (err) {
- rte_exit(EXIT_FAILURE, "Unable to config sched subport %u, err=%d\n",
- subport, err);
+ rte_exit(EXIT_FAILURE, "Unable to config schedi "
+ "subport %u, err=%d\n", subport, err);
+ }
+
+ err = rte_sched_subport_profile_config(port, subport, 0);
+ if (err) {
+ rte_exit(EXIT_FAILURE, "failed to configure "
+ "profile err=%d\n", err);
+
}
uint32_t n_pipes_per_subport =
@@ -354,6 +369,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