Author: arybchik
Date: Thu Jan 12 13:00:17 2017
New Revision: 311977
URL: https://svnweb.freebsd.org/changeset/base/311977

Log:
  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

Modified:
  head/share/man/man4/sfxge.4
  head/sys/dev/sfxge/sfxge.h
  head/sys/dev/sfxge/sfxge_port.c

Modified: head/share/man/man4/sfxge.4
==============================================================================
--- head/share/man/man4/sfxge.4 Thu Jan 12 11:53:33 2017        (r311976)
+++ head/share/man/man4/sfxge.4 Thu Jan 12 13:00:17 2017        (r311977)
@@ -158,6 +158,14 @@ The default for each port will be the va
 .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,

Modified: head/sys/dev/sfxge/sfxge.h
==============================================================================
--- head/sys/dev/sfxge/sfxge.h  Thu Jan 12 11:53:33 2017        (r311976)
+++ head/sys/dev/sfxge/sfxge.h  Thu Jan 12 13:00:17 2017        (r311977)
@@ -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];

Modified: head/sys/dev/sfxge/sfxge_port.c
==============================================================================
--- head/sys/dev/sfxge/sfxge_port.c     Thu Jan 12 11:53:33 2017        
(r311976)
+++ head/sys/dev/sfxge/sfxge_port.c     Thu Jan 12 13:00:17 2017        
(r311977)
@@ -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
                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;
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to