[v3,10/15] sched: update queue stats read for config flexibility
Checks
Commit Message
Modify pipe queue stats read function to allow different subports
of the same port to have different configuration in terms of number
of pipes, pipe queue sizes, etc.
Signed-off-by: Jasvinder Singh <jasvinder.singh@intel.com>
Signed-off-by: Lukasz Krakowiak <lukaszx.krakowiak@intel.com>
---
lib/librte_sched/rte_sched.c | 28 +++++++++++++++-------------
1 file changed, 15 insertions(+), 13 deletions(-)
@@ -282,16 +282,6 @@ enum rte_sched_subport_array {
e_RTE_SCHED_SUBPORT_ARRAY_TOTAL,
};
-#ifdef RTE_SCHED_COLLECT_STATS
-
-static inline uint32_t
-rte_sched_port_queues_per_subport(struct rte_sched_port *port)
-{
- return RTE_SCHED_QUEUES_PER_PIPE * port->n_pipes_per_subport;
-}
-
-#endif
-
static inline uint32_t
rte_sched_subport_pipe_queues(struct rte_sched_subport *subport)
{
@@ -320,7 +310,12 @@ struct rte_sched_subport *subport, uint32_t qindex)
static inline uint32_t
rte_sched_port_queues_per_port(struct rte_sched_port *port)
{
- return RTE_SCHED_QUEUES_PER_PIPE * port->n_pipes_per_subport * port->n_subports_per_port;
+ uint32_t n_queues = 0, i;
+
+ for (i = 0; i < port->n_subports_per_port; i++)
+ n_queues += rte_sched_subport_pipe_queues(port->subports[i]);
+
+ return n_queues;
}
static inline uint16_t
@@ -1474,8 +1469,10 @@ rte_sched_queue_read_stats(struct rte_sched_port *port,
struct rte_sched_queue_stats *stats,
uint16_t *qlen)
{
+ struct rte_sched_subport *s;
struct rte_sched_queue *q;
struct rte_sched_queue_extra *qe;
+ uint32_t subport_id, subport_qmask, subport_qindex;
/* Check user parameters */
if (port == NULL) {
@@ -1501,8 +1498,13 @@ rte_sched_queue_read_stats(struct rte_sched_port *port,
"%s: Incorrect value for parameter qlen\n", __func__);
return -EINVAL;
}
- q = port->queue + queue_id;
- qe = port->queue_extra + queue_id;
+ subport_qmask = port->n_pipes_per_subport_log2 + 4;
+ subport_id = (queue_id >> subport_qmask) & (port->n_subports_per_port - 1);
+
+ s = port->subports[subport_id];
+ subport_qindex = ((1 << subport_qmask) - 1) & queue_id;
+ q = s->queue + subport_qindex;
+ qe = s->queue_extra + subport_qindex;
/* Copy queue stats and clear */
memcpy(stats, &qe->stats, sizeof(struct rte_sched_queue_stats));