summaryrefslogtreecommitdiffstats
path: root/sys/dev/sfxge
diff options
context:
space:
mode:
authorarybchik <arybchik@FreeBSD.org>2017-01-14 10:19:44 +0000
committerarybchik <arybchik@FreeBSD.org>2017-01-14 10:19:44 +0000
commit1c2212fa90534e4bcd313e475bb51ad7cc3aaf29 (patch)
tree85fbf71f7bec51f675dff9c9ee62a2246bcf2fca /sys/dev/sfxge
parent5cc4b854b7ddd056e374dca1a486fdb4bafe361f (diff)
downloadFreeBSD-src-1c2212fa90534e4bcd313e475bb51ad7cc3aaf29.zip
FreeBSD-src-1c2212fa90534e4bcd313e475bb51ad7cc3aaf29.tar.gz
MFC r311977
sfxge(4): add tunable to configure MAC stats update period Sponsored by: Solarflare Communications, Inc.
Diffstat (limited to 'sys/dev/sfxge')
-rw-r--r--sys/dev/sfxge/sfxge.h1
-rw-r--r--sys/dev/sfxge/sfxge_port.c34
2 files changed, 33 insertions, 2 deletions
diff --git a/sys/dev/sfxge/sfxge.h b/sys/dev/sfxge/sfxge.h
index 90914da..ed8b49d 100644
--- a/sys/dev/sfxge/sfxge.h
+++ b/sys/dev/sfxge/sfxge.h
@@ -248,6 +248,7 @@ struct sfxge_port {
#endif
struct sfxge_hw_stats phy_stats;
struct sfxge_hw_stats mac_stats;
+ uint16_t stats_update_period_ms;
efx_link_mode_t link_mode;
uint8_t mcast_addrs[EFX_MAC_MULTICAST_LIST_MAX *
EFX_MAC_ADDR_LEN];
diff --git a/sys/dev/sfxge/sfxge_port.c b/sys/dev/sfxge/sfxge_port.c
index cb574f0..3585f0d 100644
--- a/sys/dev/sfxge/sfxge_port.c
+++ b/sys/dev/sfxge/sfxge_port.c
@@ -43,6 +43,15 @@ __FBSDID("$FreeBSD$");
#include "sfxge.h"
+#define SFXGE_PARAM_STATS_UPDATE_PERIOD_MS \
+ SFXGE_PARAM(stats_update_period_ms)
+static int sfxge_stats_update_period_ms = SFXGE_STATS_UPDATE_PERIOD_MS;
+TUNABLE_INT(SFXGE_PARAM_STATS_UPDATE_PERIOD_MS,
+ &sfxge_stats_update_period_ms);
+SYSCTL_INT(_hw_sfxge, OID_AUTO, stats_update_period_ms, CTLFLAG_RDTUN,
+ &sfxge_stats_update_period_ms, 0,
+ "netstat interface statistics update period in milliseconds");
+
static int sfxge_phy_cap_mask(struct sfxge_softc *, int, uint32_t *);
static int
@@ -62,7 +71,7 @@ sfxge_mac_stat_update(struct sfxge_softc *sc)
goto out;
}
- min_ticks = (unsigned int)hz * SFXGE_STATS_UPDATE_PERIOD_MS / 1000;
+ min_ticks = (unsigned int)hz * port->stats_update_period_ms / 1000;
now = ticks;
if ((unsigned int)(now - port->mac_stats.update_time) < min_ticks) {
@@ -515,7 +524,7 @@ sfxge_port_start(struct sfxge_softc *sc)
/* Update MAC stats by DMA every period */
if ((rc = efx_mac_stats_periodic(enp, &port->mac_stats.dma_buf,
- SFXGE_STATS_UPDATE_PERIOD_MS,
+ port->stats_update_period_ms,
B_FALSE)) != 0)
goto fail6;
@@ -673,6 +682,26 @@ sfxge_port_fini(struct sfxge_softc *sc)
port->sc = NULL;
}
+static uint16_t
+sfxge_port_stats_update_period_ms(struct sfxge_softc *sc)
+{
+ int period_ms = sfxge_stats_update_period_ms;
+
+ if (period_ms < 0) {
+ device_printf(sc->dev,
+ "treat negative stats update period %d as 0 (disable)\n",
+ period_ms);
+ period_ms = 0;
+ } else if (period_ms > UINT16_MAX) {
+ device_printf(sc->dev,
+ "treat too big stats update period %d as %u\n",
+ period_ms, UINT16_MAX);
+ period_ms = UINT16_MAX;
+ }
+
+ return period_ms;
+}
+
int
sfxge_port_init(struct sfxge_softc *sc)
{
@@ -721,6 +750,7 @@ sfxge_port_init(struct sfxge_softc *sc)
M_SFXGE, M_WAITOK | M_ZERO);
if ((rc = sfxge_dma_alloc(sc, EFX_MAC_STATS_SIZE, mac_stats_buf)) != 0)
goto fail2;
+ port->stats_update_period_ms = sfxge_port_stats_update_period_ms(sc);
sfxge_mac_stat_init(sc);
port->init_state = SFXGE_PORT_INITIALIZED;
OpenPOWER on IntegriCloud