mirror of https://gitee.com/openkylin/linux.git
mlxsw: spectrum_qdisc: Extract a per-TC stat function
Extract from mlxsw_sp_qdisc_get_prio_stats() two new functions: mlxsw_sp_qdisc_collect_tc_stats() to accumulate stats for that one TC only, and mlxsw_sp_qdisc_update_stats() that makes the stats relative to base values stored earlier. Use them from mlxsw_sp_qdisc_get_red_stats(). Signed-off-by: Petr Machata <petrm@mellanox.com> Signed-off-by: Ido Schimmel <idosch@mellanox.com> Acked-by: Jiri Pirko <jiri@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
ef6aadcc76
commit
cf9af379cd
|
@ -227,6 +227,52 @@ mlxsw_sp_qdisc_bstats_per_priority_get(struct mlxsw_sp_port_xstats *xstats,
|
|||
}
|
||||
}
|
||||
|
||||
static void
|
||||
mlxsw_sp_qdisc_collect_tc_stats(struct mlxsw_sp_port *mlxsw_sp_port,
|
||||
struct mlxsw_sp_qdisc *mlxsw_sp_qdisc,
|
||||
u64 *p_tx_bytes, u64 *p_tx_packets,
|
||||
u64 *p_drops, u64 *p_backlog)
|
||||
{
|
||||
u8 tclass_num = mlxsw_sp_qdisc->tclass_num;
|
||||
struct mlxsw_sp_port_xstats *xstats;
|
||||
u64 tx_bytes, tx_packets;
|
||||
|
||||
xstats = &mlxsw_sp_port->periodic_hw_stats.xstats;
|
||||
mlxsw_sp_qdisc_bstats_per_priority_get(xstats,
|
||||
mlxsw_sp_qdisc->prio_bitmap,
|
||||
&tx_packets, &tx_bytes);
|
||||
|
||||
*p_tx_packets += tx_packets;
|
||||
*p_tx_bytes += tx_bytes;
|
||||
*p_drops += xstats->wred_drop[tclass_num] +
|
||||
mlxsw_sp_xstats_tail_drop(xstats, tclass_num);
|
||||
*p_backlog += mlxsw_sp_xstats_backlog(xstats, tclass_num);
|
||||
}
|
||||
|
||||
static void
|
||||
mlxsw_sp_qdisc_update_stats(struct mlxsw_sp *mlxsw_sp,
|
||||
struct mlxsw_sp_qdisc *mlxsw_sp_qdisc,
|
||||
u64 tx_bytes, u64 tx_packets,
|
||||
u64 drops, u64 backlog,
|
||||
struct tc_qopt_offload_stats *stats_ptr)
|
||||
{
|
||||
struct mlxsw_sp_qdisc_stats *stats_base = &mlxsw_sp_qdisc->stats_base;
|
||||
|
||||
tx_bytes -= stats_base->tx_bytes;
|
||||
tx_packets -= stats_base->tx_packets;
|
||||
drops -= stats_base->drops;
|
||||
backlog -= stats_base->backlog;
|
||||
|
||||
_bstats_update(stats_ptr->bstats, tx_bytes, tx_packets);
|
||||
stats_ptr->qstats->drops += drops;
|
||||
stats_ptr->qstats->backlog += mlxsw_sp_cells_bytes(mlxsw_sp, backlog);
|
||||
|
||||
stats_base->backlog += backlog;
|
||||
stats_base->drops += drops;
|
||||
stats_base->tx_bytes += tx_bytes;
|
||||
stats_base->tx_packets += tx_packets;
|
||||
}
|
||||
|
||||
static int
|
||||
mlxsw_sp_tclass_congestion_enable(struct mlxsw_sp_port *mlxsw_sp_port,
|
||||
int tclass_num, u32 min, u32 max,
|
||||
|
@ -403,41 +449,30 @@ mlxsw_sp_qdisc_get_red_stats(struct mlxsw_sp_port *mlxsw_sp_port,
|
|||
struct mlxsw_sp_qdisc *mlxsw_sp_qdisc,
|
||||
struct tc_qopt_offload_stats *stats_ptr)
|
||||
{
|
||||
u64 tx_bytes, tx_packets, overlimits, drops, backlog;
|
||||
u8 tclass_num = mlxsw_sp_qdisc->tclass_num;
|
||||
struct mlxsw_sp_qdisc_stats *stats_base;
|
||||
struct mlxsw_sp_port_xstats *xstats;
|
||||
u64 tx_packets = 0;
|
||||
u64 tx_bytes = 0;
|
||||
u64 backlog = 0;
|
||||
u64 overlimits;
|
||||
u64 drops = 0;
|
||||
|
||||
xstats = &mlxsw_sp_port->periodic_hw_stats.xstats;
|
||||
stats_base = &mlxsw_sp_qdisc->stats_base;
|
||||
|
||||
mlxsw_sp_qdisc_bstats_per_priority_get(xstats,
|
||||
mlxsw_sp_qdisc->prio_bitmap,
|
||||
&tx_packets, &tx_bytes);
|
||||
tx_bytes = tx_bytes - stats_base->tx_bytes;
|
||||
tx_packets = tx_packets - stats_base->tx_packets;
|
||||
|
||||
mlxsw_sp_qdisc_collect_tc_stats(mlxsw_sp_port, mlxsw_sp_qdisc,
|
||||
&tx_bytes, &tx_packets,
|
||||
&drops, &backlog);
|
||||
overlimits = xstats->wred_drop[tclass_num] + xstats->ecn -
|
||||
stats_base->overlimits;
|
||||
drops = xstats->wred_drop[tclass_num] +
|
||||
mlxsw_sp_xstats_tail_drop(xstats, tclass_num) -
|
||||
stats_base->drops;
|
||||
backlog = mlxsw_sp_xstats_backlog(xstats, tclass_num);
|
||||
|
||||
_bstats_update(stats_ptr->bstats, tx_bytes, tx_packets);
|
||||
mlxsw_sp_qdisc_update_stats(mlxsw_sp_port->mlxsw_sp, mlxsw_sp_qdisc,
|
||||
tx_bytes, tx_packets, drops, backlog,
|
||||
stats_ptr);
|
||||
stats_ptr->qstats->overlimits += overlimits;
|
||||
stats_ptr->qstats->drops += drops;
|
||||
stats_ptr->qstats->backlog +=
|
||||
mlxsw_sp_cells_bytes(mlxsw_sp_port->mlxsw_sp,
|
||||
backlog) -
|
||||
mlxsw_sp_cells_bytes(mlxsw_sp_port->mlxsw_sp,
|
||||
stats_base->backlog);
|
||||
|
||||
stats_base->backlog = backlog;
|
||||
stats_base->drops += drops;
|
||||
stats_base->overlimits += overlimits;
|
||||
stats_base->tx_bytes += tx_bytes;
|
||||
stats_base->tx_packets += tx_packets;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -628,37 +663,23 @@ mlxsw_sp_qdisc_get_prio_stats(struct mlxsw_sp_port *mlxsw_sp_port,
|
|||
struct mlxsw_sp_qdisc *mlxsw_sp_qdisc,
|
||||
struct tc_qopt_offload_stats *stats_ptr)
|
||||
{
|
||||
u64 tx_bytes, tx_packets, drops = 0, backlog = 0;
|
||||
struct mlxsw_sp_qdisc_stats *stats_base;
|
||||
struct mlxsw_sp_port_xstats *xstats;
|
||||
struct rtnl_link_stats64 *stats;
|
||||
struct mlxsw_sp_qdisc *tc_qdisc;
|
||||
u64 tx_packets = 0;
|
||||
u64 tx_bytes = 0;
|
||||
u64 backlog = 0;
|
||||
u64 drops = 0;
|
||||
int i;
|
||||
|
||||
xstats = &mlxsw_sp_port->periodic_hw_stats.xstats;
|
||||
stats = &mlxsw_sp_port->periodic_hw_stats.stats;
|
||||
stats_base = &mlxsw_sp_qdisc->stats_base;
|
||||
|
||||
tx_bytes = stats->tx_bytes - stats_base->tx_bytes;
|
||||
tx_packets = stats->tx_packets - stats_base->tx_packets;
|
||||
|
||||
for (i = 0; i < IEEE_8021QAZ_MAX_TCS; i++) {
|
||||
drops += mlxsw_sp_xstats_tail_drop(xstats, i);
|
||||
drops += xstats->wred_drop[i];
|
||||
backlog += mlxsw_sp_xstats_backlog(xstats, i);
|
||||
tc_qdisc = &mlxsw_sp_port->tclass_qdiscs[i];
|
||||
mlxsw_sp_qdisc_collect_tc_stats(mlxsw_sp_port, tc_qdisc,
|
||||
&tx_bytes, &tx_packets,
|
||||
&drops, &backlog);
|
||||
}
|
||||
drops = drops - stats_base->drops;
|
||||
|
||||
_bstats_update(stats_ptr->bstats, tx_bytes, tx_packets);
|
||||
stats_ptr->qstats->drops += drops;
|
||||
stats_ptr->qstats->backlog +=
|
||||
mlxsw_sp_cells_bytes(mlxsw_sp_port->mlxsw_sp,
|
||||
backlog) -
|
||||
mlxsw_sp_cells_bytes(mlxsw_sp_port->mlxsw_sp,
|
||||
stats_base->backlog);
|
||||
stats_base->backlog = backlog;
|
||||
stats_base->drops += drops;
|
||||
stats_base->tx_bytes += tx_bytes;
|
||||
stats_base->tx_packets += tx_packets;
|
||||
mlxsw_sp_qdisc_update_stats(mlxsw_sp_port->mlxsw_sp, mlxsw_sp_qdisc,
|
||||
tx_bytes, tx_packets, drops, backlog,
|
||||
stats_ptr);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue