sfxge(4): add tunable to configure MAC stats update period

Reviewed by:    philip
Sponsored by:   Solarflare Communications, Inc.
MFC after:      2 days
Differential Revision:  https://reviews.freebsd.org/D9151
This commit is contained in:
Andrew Rybchenko 2017-01-12 13:00:17 +00:00
parent 5e946c03c7
commit 58223d5b7a
3 changed files with 41 additions and 2 deletions

View file

@ -158,6 +158,14 @@ The default for each port will be the value of
.Va hw.sfxge.mcdi_logging.
The logging may also be enabled or disabled after the driver is loaded using the sysctl
.Va dev.sfxge.%d.mcdi_logging.
.It Va hw.sfxge.stats_update_period_ms
Period in milliseconds to refresh interface statistics from hardware.
The accepted range is 0 to 65535, the default is 1000 (1 second).
Use zero value to disable periodic statistics update.
Supported on SFN8xxx series adapters with firmware v6.2.1.1033 and later and
SFN5xxx and SFN6xxx series adapters.
SFN7xxx series adapters and SFN8xxx series with earlier firmware use a
fixed 1000 milliseconds statistics update period.
.El
.Sh SUPPORT
For general information and support,

View file

@ -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];

View file

@ -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;