svn commit: r353656 - head/sys/dev/e1000
Eric Joyner
erj at FreeBSD.org
Wed Oct 16 17:13:47 UTC 2019
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 at intel.com>
Submitted by: Jacob Keller <jacob.e.keller at 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);
More information about the svn-src-all
mailing list