Date: Sat, 4 Oct 2008 02:05:20 +0400 (MSD) From: Dmitry Tejblum <tejblum@yandex-team.ru> To: FreeBSD-gnats-submit@FreeBSD.org Subject: kern/127834: [patch] [ixgbe] wrong error counting Message-ID: <200810032205.m93M5K0P016551@noc.yandex.net> Resent-Message-ID: <200810032230.m93MU6q2023348@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 127834 >Category: kern >Synopsis: [patch] [ixgbe] wrong error counting >Confidential: no >Severity: non-critical >Priority: low >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Fri Oct 03 22:30:05 UTC 2008 >Closed-Date: >Last-Modified: >Originator: Dmitry Tejblum >Release: FreeBSD 7.1-PRERELEASE amd64 >Organization: OOO Yandex >Environment: 7.1-PRERELEASE >Description: 1. In one place, the driver do if_ierrors++. The increase get lost, since the driver recompute if_ierrors from scratch in ixgbe_update_stats_counters() 2. "Missed Packed Counter" (MPC) registers reset to 0 after reading. The code in ixgbe_update_stats_counters() does not correctly account for it. For this reason, netstat -i usually show 0 errors on 'ix' interfaces, even though there were missed packets some time ago. >How-To-Repeat: >Fix: --- ixgbe.c 2008-07-01 04:33:19.000000000 +0400 +++ ixgbe.c 2008-10-04 01:45:53.000000000 +0400 @@ -3337,7 +3337,7 @@ ixgbe_rxeof(struct rx_ring *rxr, int cou rxr->lmp = NULL; } } else { - ifp->if_ierrors++; + adapter->dropped_pkts++; discard: /* Reuse loaded DMA map and just update mbuf chain */ mp = rxr->rx_buffers[i].m_head; @@ -3553,6 +3553,7 @@ ixgbe_update_stats_counters(struct adapt struct ifnet *ifp = adapter->ifp;; struct ixgbe_hw *hw = &adapter->hw; u32 missed_rx = 0, bprc, lxon, lxoff, total; + u64 missed_rx_total = 0; adapter->stats.crcerrs += IXGBE_READ_REG(hw, IXGBE_CRCERRS); @@ -3561,6 +3562,7 @@ ixgbe_update_stats_counters(struct adapt mp = IXGBE_READ_REG(hw, IXGBE_MPC(i)); missed_rx += mp; adapter->stats.mpc[i] += mp; + missed_rx_total += adapter->stats.mpc[i]; adapter->stats.rnbc[i] += IXGBE_READ_REG(hw, IXGBE_RNBC(i)); } @@ -3628,8 +3630,8 @@ ixgbe_update_stats_counters(struct adapt ifp->if_collisions = 0; /* Rx Errors */ - ifp->if_ierrors = missed_rx + adapter->stats.crcerrs + - adapter->stats.rlec; + ifp->if_ierrors = missed_rx_total + adapter->stats.crcerrs + + adapter->stats.rlec + adapter->dropped_pkts; } >Release-Note: >Audit-Trail: >Unformatted:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200810032205.m93M5K0P016551>