Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 16 Oct 2019 17:13:47 +0000 (UTC)
From:      Eric Joyner <erj@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r353656 - head/sys/dev/e1000
Message-ID:  <201910161713.x9GHDlMG068177@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: erj
Date: Wed Oct 16 17:13:46 2019
New Revision: 353656
URL: https://svnweb.freebsd.org/changeset/base/353656

Log:
  e1000: correctly set isc_pause_frames only when XOFF increases
  
  From Jake:
  The e1000 driver sets the iflib shared context isc_pause_frames value to
  the number of received xoff frames. This is done so that the iflib
  watchdog timer won't trigger a Tx Hang due to pause frames.
  
  Unfortunately, the function simply sets it to the value of the xoffrxc
  counter. Once the device has received a single XOFF packet, the driver
  always reports that we received pause frames. This will prevent the Tx
  hang detection entirely from that point on.
  
  Fix this by assigning isc_pause_frames to a non-zero value if we
  received any XOFF packets in the last timer interval.
  
  We could attempt to calculate the total number of received packets by
  doing a subtraction, but the iflib stack only seems to check if
  isc_pause_frames is non-zero.
  
  Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
  
  Submitted by:	Jacob Keller <jacob.e.keller@intel.com>
  Reviewed by:	gallatin@
  Sponsored by:	Intel Corporation
  Differential Revision:	https://reviews.freebsd.org/D21868

Modified:
  head/sys/dev/e1000/if_em.c

Modified: head/sys/dev/e1000/if_em.c
==============================================================================
--- head/sys/dev/e1000/if_em.c	Wed Oct 16 17:11:18 2019	(r353655)
+++ head/sys/dev/e1000/if_em.c	Wed Oct 16 17:13:46 2019	(r353656)
@@ -3903,6 +3903,7 @@ em_disable_aspm(struct adapter *adapter)
 static void
 em_update_stats_counters(struct adapter *adapter)
 {
+	u64 prev_xoffrxc = adapter->stats.xoffrxc;
 
 	if(adapter->hw.phy.media_type == e1000_media_type_copper ||
 	   (E1000_READ_REG(&adapter->hw, E1000_STATUS) & E1000_STATUS_LU)) {
@@ -3926,7 +3927,8 @@ em_update_stats_counters(struct adapter *adapter)
 	 ** For watchdog management we need to know if we have been
 	 ** paused during the last interval, so capture that here.
 	*/
-	adapter->shared->isc_pause_frames = adapter->stats.xoffrxc;
+	if (adapter->stats.xoffrxc != prev_xoffrxc)
+		adapter->shared->isc_pause_frames = 1;
 	adapter->stats.xofftxc += E1000_READ_REG(&adapter->hw, E1000_XOFFTXC);
 	adapter->stats.fcruc += E1000_READ_REG(&adapter->hw, E1000_FCRUC);
 	adapter->stats.prc64 += E1000_READ_REG(&adapter->hw, E1000_PRC64);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201910161713.x9GHDlMG068177>