Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 30 Jul 2026 05:15:13 +0000
From:      Kevin Bowling <kbowling@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: d2cd0b57532b - main - e1000: Sample statistics at timer cadence
Message-ID:  <6a6adde1.33b98.771273ba@gitrepo.freebsd.org>

index | next in thread | raw e-mail

The branch main has been updated by kbowling:

URL: https://cgit.FreeBSD.org/src/commit/?id=d2cd0b57532ba35fe39744a60d53b90e6f13b5e4

commit d2cd0b57532ba35fe39744a60d53b90e6f13b5e4
Author:     Kevin Bowling <kbowling@FreeBSD.org>
AuthorDate: 2026-07-29 09:11:19 +0000
Commit:     Kevin Bowling <kbowling@FreeBSD.org>
CommitDate: 2026-07-30 05:11:31 +0000

    e1000: Sample statistics at timer cadence
    
    Mailbox and link interrupts share iflib admin service with the periodic
    timer. Mark timer-driven passes explicitly and run the hardware
    statistics sweep only for those samples instead of repeating 66 PF MMIO
    reads for every VF mailbox message.
    
    DTrace on the I350 DUT measured the PF sweep at about 79 us on average.
    The normal hz/2 timer continues to extend clear-on-read counters
    safely; exported counters may trail hardware by up to 500 ms.
    
    Sponsored by:   BBOX.io
---
 sys/dev/e1000/if_em.c   | 15 ++++++++++++++-
 sys/dev/e1000/if_em.h   |  1 +
 sys/dev/e1000/if_igbv.c |  3 ++-
 3 files changed, 17 insertions(+), 2 deletions(-)

diff --git a/sys/dev/e1000/if_em.c b/sys/dev/e1000/if_em.c
index 4612653cf1bc..d8bde14c6c20 100644
--- a/sys/dev/e1000/if_em.c
+++ b/sys/dev/e1000/if_em.c
@@ -1626,6 +1626,7 @@ em_if_attach_post(if_ctx_t ctx)
 		sc->ustats.stats = (struct e1000_hw_stats){};
 
 	em_update_stats_counters(sc);
+	atomic_readandclear_32(&sc->stats_pending);
 	hw->mac.get_link_status = 1;
 	if (sc->vf_ifp)
 		igbv_if_update_admin_status(ctx);
@@ -2595,9 +2596,13 @@ em_if_multi_set(if_ctx_t ctx)
 static void
 em_if_timer(if_ctx_t ctx, uint16_t qid)
 {
+	struct e1000_softc *sc;
+
 	if (qid != 0)
 		return;
 
+	sc = iflib_get_softc(ctx);
+	atomic_set_32(&sc->stats_pending, 1);
 	iflib_admin_intr_deferred(ctx);
 }
 
@@ -2733,7 +2738,15 @@ em_if_update_admin_status(if_ctx_t ctx)
 			iflib_link_state_change(ctx, LINK_STATE_DOWN, 0);
 		igb_iov_ping_all_vfs(sc);
 	}
-	em_update_stats_counters(sc);
+	/*
+	 * Mailbox, link, and timer events share this admin task.  The PF
+	 * statistics sweep performs 66 MMIO reads, so run it only when the
+	 * ordinary iflib timer requests a sample rather than once per mailbox
+	 * message.  Exported counters can consequently trail hardware by the
+	 * timer interval (normally 500 ms).
+	 */
+	if (atomic_readandclear_32(&sc->stats_pending) != 0)
+		em_update_stats_counters(sc);
 
 	/* Reset LAA into RAR[0] on 82571 */
 	if (hw->mac.type == e1000_82571 && e1000_get_laa_state_82571(hw))
diff --git a/sys/dev/e1000/if_em.h b/sys/dev/e1000/if_em.h
index 1692fdf41295..9cdf013c994a 100644
--- a/sys/dev/e1000/if_em.h
+++ b/sys/dev/e1000/if_em.h
@@ -596,6 +596,7 @@ struct e1000_softc {
 	int			link_mask;
 	int			tso_automasked;
 	u32			promisc_pending;
+	u32			stats_pending;
 
 #ifdef PCI_IOV
 	struct igb_vf		*vfs;
diff --git a/sys/dev/e1000/if_igbv.c b/sys/dev/e1000/if_igbv.c
index 4f869388ce81..378a0065242b 100644
--- a/sys/dev/e1000/if_igbv.c
+++ b/sys/dev/e1000/if_igbv.c
@@ -151,7 +151,8 @@ igbv_if_update_admin_status(if_ctx_t ctx)
 		iflib_admin_intr_deferred(ctx);
 	}
 	/* em_if_init() establishes a new counter baseline after the reset. */
-	if (!sc->vf_reset_pending)
+	if (!sc->vf_reset_pending &&
+	    atomic_readandclear_32(&sc->stats_pending) != 0)
 		em_update_stats_counters(sc);
 }
 


home | help

Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?6a6adde1.33b98.771273ba>