Credits are updated by fetching subport profile parameters from
subport profile table.

Signed-off-by: Savinay Dharmappa <savinay.dharma...@intel.com>
Signed-off-by: Jasvinder Singh <jasvinder.si...@intel.com>
---
 lib/librte_sched/rte_sched.c | 49 ++++++++++++++++++++++++++++----------------
 1 file changed, 31 insertions(+), 18 deletions(-)

diff --git a/lib/librte_sched/rte_sched.c b/lib/librte_sched/rte_sched.c
index ba5700a..8e66d08 100644
--- a/lib/librte_sched/rte_sched.c
+++ b/lib/librte_sched/rte_sched.c
@@ -124,6 +124,7 @@ struct rte_sched_grinder {
        uint32_t productive;
        uint32_t pindex;
        struct rte_sched_subport *subport;
+       struct rte_sched_subport_profile *subport_params;
        struct rte_sched_pipe *pipe;
        struct rte_sched_pipe_profile *pipe_params;
 
@@ -2280,14 +2281,16 @@ grinder_credits_update(struct rte_sched_port *port,
        struct rte_sched_grinder *grinder = subport->grinder + pos;
        struct rte_sched_pipe *pipe = grinder->pipe;
        struct rte_sched_pipe_profile *params = grinder->pipe_params;
+       struct rte_sched_subport_profile *sp_params = grinder->subport_params;
        uint64_t n_periods;
        uint32_t i;
 
        /* Subport TB */
-       n_periods = (port->time - subport->tb_time) / subport->tb_period;
-       subport->tb_credits += n_periods * subport->tb_credits_per_period;
-       subport->tb_credits = RTE_MIN(subport->tb_credits, subport->tb_size);
-       subport->tb_time += n_periods * subport->tb_period;
+       n_periods = (port->time - subport->tb_time) / sp_params->sp_tb_period;
+       subport->tb_credits += n_periods * sp_params->sp_tb_credits_per_period;
+       subport->tb_credits = RTE_MIN(subport->tb_credits,
+                               sp_params->sp_tb_size);
+       subport->tb_time += n_periods * sp_params->sp_tb_period;
 
        /* Pipe TB */
        n_periods = (port->time - pipe->tb_time) / params->tb_period;
@@ -2298,9 +2301,10 @@ grinder_credits_update(struct rte_sched_port *port,
        /* Subport TCs */
        if (unlikely(port->time >= subport->tc_time)) {
                for (i = 0; i < RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE; i++)
-                       subport->tc_credits[i] = 
subport->tc_credits_per_period[i];
+                       subport->tc_credits[i] =
+                                       sp_params->sp_tc_credits_per_period[i];
 
-               subport->tc_time = port->time + subport->tc_period;
+               subport->tc_time = port->time + sp_params->sp_tc_period;
        }
 
        /* Pipe TCs */
@@ -2316,8 +2320,10 @@ grinder_credits_update(struct rte_sched_port *port,
 
 static inline uint64_t
 grinder_tc_ov_credits_update(struct rte_sched_port *port,
-       struct rte_sched_subport *subport)
+       struct rte_sched_subport *subport, uint32_t pos)
 {
+       struct rte_sched_grinder *grinder = subport->grinder + pos;
+       struct rte_sched_subport_profile *sp_params = grinder->subport_params;
        uint64_t tc_ov_consumption[RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE];
        uint64_t tc_consumption = 0, tc_ov_consumption_max;
        uint64_t tc_ov_wm = subport->tc_ov_wm;
@@ -2327,17 +2333,17 @@ grinder_tc_ov_credits_update(struct rte_sched_port 
*port,
                return subport->tc_ov_wm_max;
 
        for (i = 0; i < RTE_SCHED_TRAFFIC_CLASS_BE; i++) {
-               tc_ov_consumption[i] =
-                       subport->tc_credits_per_period[i] - 
subport->tc_credits[i];
+               tc_ov_consumption[i] = sp_params->sp_tc_credits_per_period[i]
+                                       -  subport->tc_credits[i];
                tc_consumption += tc_ov_consumption[i];
        }
 
        tc_ov_consumption[RTE_SCHED_TRAFFIC_CLASS_BE] =
-               subport->tc_credits_per_period[RTE_SCHED_TRAFFIC_CLASS_BE] -
+       sp_params->sp_tc_credits_per_period[RTE_SCHED_TRAFFIC_CLASS_BE] -
                subport->tc_credits[RTE_SCHED_TRAFFIC_CLASS_BE];
 
        tc_ov_consumption_max =
-               subport->tc_credits_per_period[RTE_SCHED_TRAFFIC_CLASS_BE] -
+       sp_params->sp_tc_credits_per_period[RTE_SCHED_TRAFFIC_CLASS_BE] -
                        tc_consumption;
 
        if (tc_ov_consumption[RTE_SCHED_TRAFFIC_CLASS_BE] >
@@ -2363,14 +2369,16 @@ grinder_credits_update(struct rte_sched_port *port,
        struct rte_sched_grinder *grinder = subport->grinder + pos;
        struct rte_sched_pipe *pipe = grinder->pipe;
        struct rte_sched_pipe_profile *params = grinder->pipe_params;
+       struct rte_sched_subport_profile *sp_params = grinder->subport_params;
        uint64_t n_periods;
        uint32_t i;
 
        /* Subport TB */
-       n_periods = (port->time - subport->tb_time) / subport->tb_period;
-       subport->tb_credits += n_periods * subport->tb_credits_per_period;
-       subport->tb_credits = RTE_MIN(subport->tb_credits, subport->tb_size);
-       subport->tb_time += n_periods * subport->tb_period;
+       n_periods = (port->time - subport->tb_time) / sp_params->sp_tb_period;
+       subport->tb_credits += n_periods * sp_params->sp_tb_credits_per_period;
+       subport->tb_credits = RTE_MIN(subport->tb_credits,
+                               sp_params->sp_tb_size);
+       subport->tb_time += n_periods * sp_params->sp_tb_period;
 
        /* Pipe TB */
        n_periods = (port->time - pipe->tb_time) / params->tb_period;
@@ -2380,12 +2388,14 @@ grinder_credits_update(struct rte_sched_port *port,
 
        /* Subport TCs */
        if (unlikely(port->time >= subport->tc_time)) {
-               subport->tc_ov_wm = grinder_tc_ov_credits_update(port, subport);
+               subport->tc_ov_wm =
+                       grinder_tc_ov_credits_update(port, subport, pos);
 
                for (i = 0; i < RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE; i++)
-                       subport->tc_credits[i] = 
subport->tc_credits_per_period[i];
+                       subport->tc_credits[i] =
+                               sp_params->sp_tc_credits_per_period[i];
 
-               subport->tc_time = port->time + subport->tc_period;
+               subport->tc_time = port->time + sp_params->sp_tc_period;
                subport->tc_ov_period_id++;
        }
 
@@ -2908,6 +2918,9 @@ grinder_handle(struct rte_sched_port *port,
                struct rte_sched_pipe *pipe = grinder->pipe;
 
                grinder->pipe_params = subport->pipe_profiles + pipe->profile;
+               grinder->subport_params = port->subport_profiles +
+                                               subport->profile;
+
                grinder_prefetch_tc_queue_arrays(subport, pos);
                grinder_credits_update(port, subport, pos);
 
-- 
2.7.4

Reply via email to