vtnet: fix computation of sysctl variables

Fix the aggregation of the interface level counters
* dev.vtnet.X.tx_task_rescheduled,
* dev.vtnet.X.tx_tso_offloaded,
* dev.vtnet.X.tx_csum_offloaded,
* dev.vtnet.X.rx_task_rescheduled,
* dev.vtnet.X.rx_csum_offloaded, and
* dev.vtnet.X.rx_csum_failed.
Also ensure that dev.vtnet.X.tx_defrag_failed only counts the number
of times m_defrag() fails.
While there, mark sysctl-variables used for exporting statistics as
such (CTLFLAG_STATS).

Reviewed by:		Timo Völker
Differential Revision:	https://reviews.freebsd.org/D51999

(cherry picked from commit 03da4395158d374b5e38623f6744ce31302b530c)
This commit is contained in:
Michael Tuexen 2025-08-28 11:27:00 +02:00 committed by Franco Fichtner
parent 85edba454c
commit eb0203b1a3

View file

@ -2549,8 +2549,10 @@ vtnet_txq_enqueue_buf(struct vtnet_txq *txq, struct mbuf **m_head,
error = sglist_append_mbuf(sg, m);
if (error) {
m = m_defrag(m, M_NOWAIT);
if (m == NULL)
if (m == NULL) {
sc->vtnet_stats.tx_defrag_failed++;
goto fail;
}
*m_head = m;
sc->vtnet_stats.tx_defragged++;
@ -2566,7 +2568,6 @@ vtnet_txq_enqueue_buf(struct vtnet_txq *txq, struct mbuf **m_head,
return (error);
fail:
sc->vtnet_stats.tx_defrag_failed++;
m_freem(*m_head);
*m_head = NULL;
@ -4171,6 +4172,102 @@ vtnet_setup_queue_sysctl(struct vtnet_softc *sc)
}
}
static int
vtnet_sysctl_rx_csum_failed(SYSCTL_HANDLER_ARGS)
{
struct vtnet_softc *sc = (struct vtnet_softc *)arg1;
struct vtnet_statistics *stats = &sc->vtnet_stats;
struct vtnet_rxq_stats *rxst;
int i;
stats->rx_csum_failed = 0;
for (i = 0; i < sc->vtnet_max_vq_pairs; i++) {
rxst = &sc->vtnet_rxqs[i].vtnrx_stats;
stats->rx_csum_failed += rxst->vrxs_csum_failed;
}
return (sysctl_handle_64(oidp, NULL, stats->rx_csum_failed, req));
}
static int
vtnet_sysctl_rx_csum_offloaded(SYSCTL_HANDLER_ARGS)
{
struct vtnet_softc *sc = (struct vtnet_softc *)arg1;
struct vtnet_statistics *stats = &sc->vtnet_stats;
struct vtnet_rxq_stats *rxst;
int i;
stats->rx_csum_offloaded = 0;
for (i = 0; i < sc->vtnet_max_vq_pairs; i++) {
rxst = &sc->vtnet_rxqs[i].vtnrx_stats;
stats->rx_csum_offloaded += rxst->vrxs_csum;
}
return (sysctl_handle_64(oidp, NULL, stats->rx_csum_offloaded, req));
}
static int
vtnet_sysctl_rx_task_rescheduled(SYSCTL_HANDLER_ARGS)
{
struct vtnet_softc *sc = (struct vtnet_softc *)arg1;
struct vtnet_statistics *stats = &sc->vtnet_stats;
struct vtnet_rxq_stats *rxst;
int i;
stats->rx_task_rescheduled = 0;
for (i = 0; i < sc->vtnet_max_vq_pairs; i++) {
rxst = &sc->vtnet_rxqs[i].vtnrx_stats;
stats->rx_task_rescheduled += rxst->vrxs_rescheduled;
}
return (sysctl_handle_64(oidp, NULL, stats->rx_task_rescheduled, req));
}
static int
vtnet_sysctl_tx_csum_offloaded(SYSCTL_HANDLER_ARGS)
{
struct vtnet_softc *sc = (struct vtnet_softc *)arg1;
struct vtnet_statistics *stats = &sc->vtnet_stats;
struct vtnet_txq_stats *txst;
int i;
stats->tx_csum_offloaded = 0;
for (i = 0; i < sc->vtnet_max_vq_pairs; i++) {
txst = &sc->vtnet_txqs[i].vtntx_stats;
stats->tx_csum_offloaded += txst->vtxs_csum;
}
return (sysctl_handle_64(oidp, NULL, stats->tx_csum_offloaded, req));
}
static int
vtnet_sysctl_tx_tso_offloaded(SYSCTL_HANDLER_ARGS)
{
struct vtnet_softc *sc = (struct vtnet_softc *)arg1;
struct vtnet_statistics *stats = &sc->vtnet_stats;
struct vtnet_txq_stats *txst;
int i;
stats->tx_tso_offloaded = 0;
for (i = 0; i < sc->vtnet_max_vq_pairs; i++) {
txst = &sc->vtnet_txqs[i].vtntx_stats;
stats->tx_tso_offloaded += txst->vtxs_tso;
}
return (sysctl_handle_64(oidp, NULL, stats->tx_tso_offloaded, req));
}
static int
vtnet_sysctl_tx_task_rescheduled(SYSCTL_HANDLER_ARGS)
{
struct vtnet_softc *sc = (struct vtnet_softc *)arg1;
struct vtnet_statistics *stats = &sc->vtnet_stats;
struct vtnet_txq_stats *txst;
int i;
stats->tx_task_rescheduled = 0;
for (i = 0; i < sc->vtnet_max_vq_pairs; i++) {
txst = &sc->vtnet_txqs[i].vtntx_stats;
stats->tx_task_rescheduled += txst->vtxs_rescheduled;
}
return (sysctl_handle_64(oidp, NULL, stats->tx_task_rescheduled, req));
}
static void
vtnet_setup_stat_sysctl(struct sysctl_ctx_list *ctx,
struct sysctl_oid_list *child, struct vtnet_softc *sc)
@ -4215,14 +4312,17 @@ vtnet_setup_stat_sysctl(struct sysctl_ctx_list *ctx,
SYSCTL_ADD_UQUAD(ctx, child, OID_AUTO, "rx_csum_bad_proto",
CTLFLAG_RD, &stats->rx_csum_bad_proto,
"Received checksum offloaded buffer with incorrect protocol");
SYSCTL_ADD_UQUAD(ctx, child, OID_AUTO, "rx_csum_failed",
CTLFLAG_RD, &stats->rx_csum_failed,
SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "rx_csum_failed",
CTLTYPE_U64 | CTLFLAG_RD | CTLFLAG_STATS,
sc, 0, vtnet_sysctl_rx_csum_failed, "QU",
"Received buffer checksum offload failed");
SYSCTL_ADD_UQUAD(ctx, child, OID_AUTO, "rx_csum_offloaded",
CTLFLAG_RD, &stats->rx_csum_offloaded,
SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "rx_csum_offloaded",
CTLTYPE_U64 | CTLFLAG_RD | CTLFLAG_STATS,
sc, 0, vtnet_sysctl_rx_csum_offloaded, "QU",
"Received buffer checksum offload succeeded");
SYSCTL_ADD_UQUAD(ctx, child, OID_AUTO, "rx_task_rescheduled",
CTLFLAG_RD, &stats->rx_task_rescheduled,
SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "rx_task_rescheduled",
CTLTYPE_U64 | CTLFLAG_RD | CTLFLAG_STATS,
sc, 0, vtnet_sysctl_rx_task_rescheduled, "QU",
"Times the receive interrupt task rescheduled itself");
SYSCTL_ADD_UQUAD(ctx, child, OID_AUTO, "tx_csum_unknown_ethtype",
@ -4245,14 +4345,17 @@ vtnet_setup_stat_sysctl(struct sysctl_ctx_list *ctx,
SYSCTL_ADD_UQUAD(ctx, child, OID_AUTO, "tx_defrag_failed",
CTLFLAG_RD, &stats->tx_defrag_failed,
"Aborted transmit of buffer because defrag failed");
SYSCTL_ADD_UQUAD(ctx, child, OID_AUTO, "tx_csum_offloaded",
CTLFLAG_RD, &stats->tx_csum_offloaded,
SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "tx_csum_offloaded",
CTLTYPE_U64 | CTLFLAG_RD | CTLFLAG_STATS,
sc, 0, vtnet_sysctl_tx_csum_offloaded, "QU",
"Offloaded checksum of transmitted buffer");
SYSCTL_ADD_UQUAD(ctx, child, OID_AUTO, "tx_tso_offloaded",
CTLFLAG_RD, &stats->tx_tso_offloaded,
SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "tx_tso_offloaded",
CTLTYPE_U64 | CTLFLAG_RD | CTLFLAG_STATS,
sc, 0, vtnet_sysctl_tx_tso_offloaded, "QU",
"Segmentation offload of transmitted buffer");
SYSCTL_ADD_UQUAD(ctx, child, OID_AUTO, "tx_task_rescheduled",
CTLFLAG_RD, &stats->tx_task_rescheduled,
SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "tx_task_rescheduled",
CTLTYPE_U64 | CTLFLAG_RD | CTLFLAG_STATS,
sc, 0, vtnet_sysctl_tx_task_rescheduled, "QU",
"Times the transmit interrupt task rescheduled itself");
}