diff options
author | arybchik <arybchik@FreeBSD.org> | 2017-01-14 10:59:25 +0000 |
---|---|---|
committer | arybchik <arybchik@FreeBSD.org> | 2017-01-14 10:59:25 +0000 |
commit | 63e9762403d383a2b83c99d38a775a126cec2894 (patch) | |
tree | 61e9c687ef3f3544eca9b4b13b15d710429112bf | |
parent | e0fad153d5543c4de3346181fc2996d26fa4bc52 (diff) | |
download | FreeBSD-src-63e9762403d383a2b83c99d38a775a126cec2894.zip FreeBSD-src-63e9762403d383a2b83c99d38a775a126cec2894.tar.gz |
MFC r311983
sfxge(4): add sysctl to change MAC stats update period
The sysctl controls the period per interface.
Sponsored by: Solarflare Communications, Inc.
-rw-r--r-- | share/man/man4/sfxge.4 | 2 | ||||
-rw-r--r-- | sys/dev/sfxge/sfxge_port.c | 47 |
2 files changed, 49 insertions, 0 deletions
diff --git a/share/man/man4/sfxge.4 b/share/man/man4/sfxge.4 index b269c8a..9e80991 100644 --- a/share/man/man4/sfxge.4 +++ b/share/man/man4/sfxge.4 @@ -166,6 +166,8 @@ 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. +The period may also be changed after the driver is loaded using the sysctl +.Va dev.sfxge.%d.stats_update_period_ms . .El .Sh SUPPORT For general information and support, diff --git a/sys/dev/sfxge/sfxge_port.c b/sys/dev/sfxge/sfxge_port.c index 083a779..edc88ec 100644 --- a/sys/dev/sfxge/sfxge_port.c +++ b/sys/dev/sfxge/sfxge_port.c @@ -675,6 +675,48 @@ sfxge_port_stats_update_period_ms(struct sfxge_softc *sc) return period_ms; } +static int +sfxge_port_stats_update_period_ms_handler(SYSCTL_HANDLER_ARGS) +{ + struct sfxge_softc *sc; + struct sfxge_port *port; + unsigned int period_ms; + int error; + + sc = arg1; + port = &sc->port; + + if (req->newptr != NULL) { + error = SYSCTL_IN(req, &period_ms, sizeof(period_ms)); + if (error != 0) + return (error); + + if (period_ms > UINT16_MAX) + return (EINVAL); + + SFXGE_PORT_LOCK(port); + + if (port->stats_update_period_ms != period_ms) { + if (port->init_state == SFXGE_PORT_STARTED) + error = efx_mac_stats_periodic(sc->enp, + &port->mac_stats.dma_buf, + period_ms, B_FALSE); + if (error == 0) + port->stats_update_period_ms = period_ms; + } + + SFXGE_PORT_UNLOCK(port); + } else { + SFXGE_PORT_LOCK(port); + period_ms = port->stats_update_period_ms; + SFXGE_PORT_UNLOCK(port); + + error = SYSCTL_OUT(req, &period_ms, sizeof(period_ms)); + } + + return (error); +} + int sfxge_port_init(struct sfxge_softc *sc) { @@ -726,6 +768,11 @@ sfxge_port_init(struct sfxge_softc *sc) port->stats_update_period_ms = sfxge_port_stats_update_period_ms(sc); sfxge_mac_stat_init(sc); + SYSCTL_ADD_PROC(sysctl_ctx, SYSCTL_CHILDREN(sysctl_tree), OID_AUTO, + "stats_update_period_ms", CTLTYPE_UINT|CTLFLAG_RW, sc, 0, + sfxge_port_stats_update_period_ms_handler, "IU", + "interface statistics refresh period"); + port->init_state = SFXGE_PORT_INITIALIZED; DBGPRINT(sc->dev, "success"); |