0edf18eee2
To support high bandwidth network interfaces, all rates (port, subport level token bucket and traffic class rates, pipe level token bucket and traffic class rates) and stats counters defined in public data structures (rte_sched.h) are modified to support 64 bit counters. Signed-off-by: Jasvinder Singh <jasvinder.singh@intel.com> Signed-off-by: Lukasz Krakowiak <lukaszx.krakowiak@intel.com> Acked-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
373 lines
9.6 KiB
C
373 lines
9.6 KiB
C
/* SPDX-License-Identifier: BSD-3-Clause
|
|
* Copyright(c) 2010-2014 Intel Corporation
|
|
*/
|
|
|
|
#include <unistd.h>
|
|
#include <string.h>
|
|
|
|
#include "main.h"
|
|
|
|
int
|
|
qavg_q(uint16_t port_id, uint32_t subport_id, uint32_t pipe_id, uint8_t tc,
|
|
uint8_t q)
|
|
{
|
|
struct rte_sched_queue_stats stats;
|
|
struct rte_sched_port *port;
|
|
uint16_t qlen;
|
|
uint32_t count, i, queue_id = 0;
|
|
uint32_t average;
|
|
|
|
for (i = 0; i < nb_pfc; i++) {
|
|
if (qos_conf[i].tx_port == port_id)
|
|
break;
|
|
}
|
|
|
|
if (i == nb_pfc ||
|
|
subport_id >= port_params.n_subports_per_port ||
|
|
pipe_id >= subport_params[subport_id].n_pipes_per_subport_enabled ||
|
|
tc >= RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE ||
|
|
q >= RTE_SCHED_BE_QUEUES_PER_PIPE ||
|
|
(tc < RTE_SCHED_TRAFFIC_CLASS_BE && q > 0))
|
|
return -1;
|
|
|
|
port = qos_conf[i].sched_port;
|
|
for (i = 0; i < subport_id; i++)
|
|
queue_id += subport_params[i].n_pipes_per_subport_enabled *
|
|
RTE_SCHED_QUEUES_PER_PIPE;
|
|
if (tc < RTE_SCHED_TRAFFIC_CLASS_BE)
|
|
queue_id += pipe_id * RTE_SCHED_QUEUES_PER_PIPE + tc;
|
|
else
|
|
queue_id += pipe_id * RTE_SCHED_QUEUES_PER_PIPE + tc + q;
|
|
|
|
average = 0;
|
|
for (count = 0; count < qavg_ntimes; count++) {
|
|
rte_sched_queue_read_stats(port, queue_id, &stats, &qlen);
|
|
average += qlen;
|
|
usleep(qavg_period);
|
|
}
|
|
|
|
average /= qavg_ntimes;
|
|
|
|
printf("\nAverage queue size: %" PRIu32 " bytes.\n\n", average);
|
|
|
|
return 0;
|
|
}
|
|
|
|
int
|
|
qavg_tcpipe(uint16_t port_id, uint32_t subport_id, uint32_t pipe_id,
|
|
uint8_t tc)
|
|
{
|
|
struct rte_sched_queue_stats stats;
|
|
struct rte_sched_port *port;
|
|
uint16_t qlen;
|
|
uint32_t count, i, queue_id = 0;
|
|
uint32_t average, part_average;
|
|
|
|
for (i = 0; i < nb_pfc; i++) {
|
|
if (qos_conf[i].tx_port == port_id)
|
|
break;
|
|
}
|
|
|
|
if (i == nb_pfc || subport_id >= port_params.n_subports_per_port ||
|
|
pipe_id >= subport_params[subport_id].n_pipes_per_subport_enabled ||
|
|
tc >= RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE)
|
|
return -1;
|
|
|
|
port = qos_conf[i].sched_port;
|
|
|
|
for (i = 0; i < subport_id; i++)
|
|
queue_id +=
|
|
subport_params[i].n_pipes_per_subport_enabled *
|
|
RTE_SCHED_QUEUES_PER_PIPE;
|
|
|
|
queue_id += pipe_id * RTE_SCHED_QUEUES_PER_PIPE + tc;
|
|
|
|
average = 0;
|
|
|
|
for (count = 0; count < qavg_ntimes; count++) {
|
|
part_average = 0;
|
|
|
|
if (tc < RTE_SCHED_TRAFFIC_CLASS_BE) {
|
|
rte_sched_queue_read_stats(port, queue_id,
|
|
&stats, &qlen);
|
|
part_average += qlen;
|
|
} else {
|
|
for (i = 0; i < RTE_SCHED_BE_QUEUES_PER_PIPE; i++) {
|
|
rte_sched_queue_read_stats(port, queue_id + i,
|
|
&stats, &qlen);
|
|
part_average += qlen;
|
|
}
|
|
average += part_average / RTE_SCHED_BE_QUEUES_PER_PIPE;
|
|
}
|
|
usleep(qavg_period);
|
|
}
|
|
|
|
average /= qavg_ntimes;
|
|
|
|
printf("\nAverage queue size: %" PRIu32 " bytes.\n\n", average);
|
|
|
|
return 0;
|
|
}
|
|
|
|
int
|
|
qavg_pipe(uint16_t port_id, uint32_t subport_id, uint32_t pipe_id)
|
|
{
|
|
struct rte_sched_queue_stats stats;
|
|
struct rte_sched_port *port;
|
|
uint16_t qlen;
|
|
uint32_t count, i, queue_id = 0;
|
|
uint32_t average, part_average;
|
|
|
|
for (i = 0; i < nb_pfc; i++) {
|
|
if (qos_conf[i].tx_port == port_id)
|
|
break;
|
|
}
|
|
|
|
if (i == nb_pfc ||
|
|
subport_id >= port_params.n_subports_per_port ||
|
|
pipe_id >= subport_params[subport_id].n_pipes_per_subport_enabled)
|
|
return -1;
|
|
|
|
port = qos_conf[i].sched_port;
|
|
|
|
for (i = 0; i < subport_id; i++)
|
|
queue_id += subport_params[i].n_pipes_per_subport_enabled *
|
|
RTE_SCHED_QUEUES_PER_PIPE;
|
|
|
|
queue_id += pipe_id * RTE_SCHED_QUEUES_PER_PIPE;
|
|
|
|
average = 0;
|
|
|
|
for (count = 0; count < qavg_ntimes; count++) {
|
|
part_average = 0;
|
|
for (i = 0; i < RTE_SCHED_QUEUES_PER_PIPE; i++) {
|
|
rte_sched_queue_read_stats(port, queue_id + i,
|
|
&stats, &qlen);
|
|
part_average += qlen;
|
|
}
|
|
average += part_average / RTE_SCHED_QUEUES_PER_PIPE;
|
|
usleep(qavg_period);
|
|
}
|
|
|
|
average /= qavg_ntimes;
|
|
|
|
printf("\nAverage queue size: %" PRIu32 " bytes.\n\n", average);
|
|
|
|
return 0;
|
|
}
|
|
|
|
int
|
|
qavg_tcsubport(uint16_t port_id, uint32_t subport_id, uint8_t tc)
|
|
{
|
|
struct rte_sched_queue_stats stats;
|
|
struct rte_sched_port *port;
|
|
uint16_t qlen;
|
|
uint32_t queue_id, count, i, j, subport_queue_id = 0;
|
|
uint32_t average, part_average;
|
|
|
|
for (i = 0; i < nb_pfc; i++) {
|
|
if (qos_conf[i].tx_port == port_id)
|
|
break;
|
|
}
|
|
|
|
if (i == nb_pfc ||
|
|
subport_id >= port_params.n_subports_per_port ||
|
|
tc >= RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE)
|
|
return -1;
|
|
|
|
port = qos_conf[i].sched_port;
|
|
|
|
for (i = 0; i < subport_id; i++)
|
|
subport_queue_id +=
|
|
subport_params[i].n_pipes_per_subport_enabled *
|
|
RTE_SCHED_QUEUES_PER_PIPE;
|
|
|
|
average = 0;
|
|
|
|
for (count = 0; count < qavg_ntimes; count++) {
|
|
uint32_t n_pipes_per_subport =
|
|
subport_params[subport_id].n_pipes_per_subport_enabled;
|
|
|
|
part_average = 0;
|
|
for (i = 0; i < n_pipes_per_subport; i++) {
|
|
if (tc < RTE_SCHED_TRAFFIC_CLASS_BE) {
|
|
queue_id = subport_queue_id +
|
|
i * RTE_SCHED_QUEUES_PER_PIPE + tc;
|
|
rte_sched_queue_read_stats(port, queue_id,
|
|
&stats, &qlen);
|
|
part_average += qlen;
|
|
} else {
|
|
for (j = 0; j < RTE_SCHED_BE_QUEUES_PER_PIPE; j++) {
|
|
queue_id = subport_queue_id +
|
|
i * RTE_SCHED_QUEUES_PER_PIPE +
|
|
tc + j;
|
|
rte_sched_queue_read_stats(port, queue_id,
|
|
&stats, &qlen);
|
|
part_average += qlen;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (tc < RTE_SCHED_TRAFFIC_CLASS_BE)
|
|
average += part_average /
|
|
(subport_params[subport_id].n_pipes_per_subport_enabled);
|
|
else
|
|
average += part_average /
|
|
(subport_params[subport_id].n_pipes_per_subport_enabled) *
|
|
RTE_SCHED_BE_QUEUES_PER_PIPE;
|
|
|
|
usleep(qavg_period);
|
|
}
|
|
|
|
average /= qavg_ntimes;
|
|
|
|
printf("\nAverage queue size: %" PRIu32 " bytes.\n\n", average);
|
|
|
|
return 0;
|
|
}
|
|
|
|
int
|
|
qavg_subport(uint16_t port_id, uint32_t subport_id)
|
|
{
|
|
struct rte_sched_queue_stats stats;
|
|
struct rte_sched_port *port;
|
|
uint16_t qlen;
|
|
uint32_t queue_id, count, i, j, subport_queue_id = 0;
|
|
uint32_t average, part_average;
|
|
|
|
for (i = 0; i < nb_pfc; i++) {
|
|
if (qos_conf[i].tx_port == port_id)
|
|
break;
|
|
}
|
|
|
|
if (i == nb_pfc ||
|
|
subport_id >= port_params.n_subports_per_port)
|
|
return -1;
|
|
|
|
port = qos_conf[i].sched_port;
|
|
|
|
for (i = 0; i < subport_id; i++)
|
|
subport_queue_id += subport_params[i].n_pipes_per_subport_enabled *
|
|
RTE_SCHED_QUEUES_PER_PIPE;
|
|
|
|
average = 0;
|
|
|
|
for (count = 0; count < qavg_ntimes; count++) {
|
|
uint32_t n_pipes_per_subport =
|
|
subport_params[subport_id].n_pipes_per_subport_enabled;
|
|
|
|
part_average = 0;
|
|
for (i = 0; i < n_pipes_per_subport; i++) {
|
|
queue_id = subport_queue_id + i * RTE_SCHED_QUEUES_PER_PIPE;
|
|
|
|
for (j = 0; j < RTE_SCHED_QUEUES_PER_PIPE; j++) {
|
|
rte_sched_queue_read_stats(port, queue_id + j,
|
|
&stats, &qlen);
|
|
part_average += qlen;
|
|
}
|
|
}
|
|
|
|
average += part_average /
|
|
(subport_params[subport_id].n_pipes_per_subport_enabled *
|
|
RTE_SCHED_QUEUES_PER_PIPE);
|
|
usleep(qavg_period);
|
|
}
|
|
|
|
average /= qavg_ntimes;
|
|
|
|
printf("\nAverage queue size: %" PRIu32 " bytes.\n\n", average);
|
|
|
|
return 0;
|
|
}
|
|
|
|
int
|
|
subport_stat(uint16_t port_id, uint32_t subport_id)
|
|
{
|
|
struct rte_sched_subport_stats stats;
|
|
struct rte_sched_port *port;
|
|
uint32_t tc_ov[RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE];
|
|
uint8_t i;
|
|
|
|
for (i = 0; i < nb_pfc; i++) {
|
|
if (qos_conf[i].tx_port == port_id)
|
|
break;
|
|
}
|
|
|
|
if (i == nb_pfc || subport_id >= port_params.n_subports_per_port)
|
|
return -1;
|
|
|
|
port = qos_conf[i].sched_port;
|
|
memset(tc_ov, 0, sizeof(tc_ov));
|
|
|
|
rte_sched_subport_read_stats(port, subport_id, &stats, tc_ov);
|
|
|
|
printf("\n");
|
|
printf("+----+-------------+-------------+-------------+-------------+-------------+\n");
|
|
printf("| TC | Pkts OK |Pkts Dropped | Bytes OK |Bytes Dropped| OV Status |\n");
|
|
printf("+----+-------------+-------------+-------------+-------------+-------------+\n");
|
|
|
|
for (i = 0; i < RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE; i++) {
|
|
printf("| %d | %11" PRIu64 " | %11" PRIu64 " | %11" PRIu64 " | %11" PRIu64 " | %11" PRIu32 " |\n",
|
|
i, stats.n_pkts_tc[i], stats.n_pkts_tc_dropped[i],
|
|
stats.n_bytes_tc[i], stats.n_bytes_tc_dropped[i], tc_ov[i]);
|
|
printf("+----+-------------+-------------+-------------+-------------+-------------+\n");
|
|
}
|
|
printf("\n");
|
|
|
|
return 0;
|
|
}
|
|
|
|
int
|
|
pipe_stat(uint16_t port_id, uint32_t subport_id, uint32_t pipe_id)
|
|
{
|
|
struct rte_sched_queue_stats stats;
|
|
struct rte_sched_port *port;
|
|
uint16_t qlen;
|
|
uint8_t i, j;
|
|
uint32_t queue_id = 0;
|
|
|
|
for (i = 0; i < nb_pfc; i++) {
|
|
if (qos_conf[i].tx_port == port_id)
|
|
break;
|
|
}
|
|
|
|
if (i == nb_pfc ||
|
|
subport_id >= port_params.n_subports_per_port ||
|
|
pipe_id >= subport_params[subport_id].n_pipes_per_subport_enabled)
|
|
return -1;
|
|
|
|
port = qos_conf[i].sched_port;
|
|
for (i = 0; i < subport_id; i++)
|
|
queue_id += subport_params[i].n_pipes_per_subport_enabled *
|
|
RTE_SCHED_QUEUES_PER_PIPE;
|
|
|
|
queue_id += pipe_id * RTE_SCHED_QUEUES_PER_PIPE;
|
|
|
|
printf("\n");
|
|
printf("+----+-------+-------------+-------------+-------------+-------------+-------------+\n");
|
|
printf("| TC | Queue | Pkts OK |Pkts Dropped | Bytes OK |Bytes Dropped| Length |\n");
|
|
printf("+----+-------+-------------+-------------+-------------+-------------+-------------+\n");
|
|
|
|
for (i = 0; i < RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE; i++) {
|
|
if (i < RTE_SCHED_TRAFFIC_CLASS_BE) {
|
|
rte_sched_queue_read_stats(port, queue_id + i, &stats, &qlen);
|
|
printf("| %d | %d | %11" PRIu64 " | %11" PRIu64 " | %11" PRIu64 " | %11" PRIu64 " | %11i |\n",
|
|
i, 0, stats.n_pkts, stats.n_pkts_dropped, stats.n_bytes,
|
|
stats.n_bytes_dropped, qlen);
|
|
printf("+----+-------+-------------+-------------+-------------+-------------+-------------+\n");
|
|
} else {
|
|
for (j = 0; j < RTE_SCHED_BE_QUEUES_PER_PIPE; j++) {
|
|
rte_sched_queue_read_stats(port, queue_id + i + j,
|
|
&stats, &qlen);
|
|
printf("| %d | %d | %11" PRIu64 " | %11" PRIu64 " | %11" PRIu64 " | %11" PRIu64 " | %11i |\n",
|
|
i, j, stats.n_pkts, stats.n_pkts_dropped, stats.n_bytes,
|
|
stats.n_bytes_dropped, qlen);
|
|
printf("+----+-------+-------------+-------------+-------------+-------------+-------------+\n");
|
|
}
|
|
}
|
|
}
|
|
printf("\n");
|
|
|
|
return 0;
|
|
}
|