buf_ring in HEAD is racy
Ryan Stone
rysto32 at gmail.com
Wed Dec 18 03:37:45 UTC 2013
On Tue, Dec 17, 2013 at 11:49 AM, Adrian Chadd <adrian at freebsd.org> wrote:
> Try:
>
> Index: sys/dev/ixgbe/ixgbe.c
> ===================================================================
> --- sys/dev/ixgbe/ixgbe.c (revision 2995)
> +++ sys/dev/ixgbe/ixgbe.c (working copy)
> @@ -5178,6 +5178,7 @@
> struct ixgbe_hw *hw = &adapter->hw;
> u32 missed_rx = 0, bprc, lxon, lxoff, total;
> u64 total_missed_rx = 0;
> + u64 odrops = 0;
>
> adapter->stats.crcerrs += IXGBE_READ_REG(hw, IXGBE_CRCERRS);
> adapter->stats.illerrc += IXGBE_READ_REG(hw, IXGBE_ILLERRC);
> @@ -5308,6 +5309,11 @@
> adapter->stats.fcoedwtc += IXGBE_READ_REG(hw, IXGBE_FCOEDWTC);
> }
>
> + /* TX drops */
> + for (int i = 0; i < adapter->num_queues; i++) {
> + odrops += adapter->tx_rings[i].br->br_drops;
> + }
> +
> /* Fill out the OS statistics structure */
> ifp->if_ipackets = adapter->stats.gprc;
> ifp->if_opackets = adapter->stats.gptc;
> @@ -5317,6 +5323,9 @@
> ifp->if_omcasts = adapter->stats.mptc;
> ifp->if_collisions = 0;
>
> + /* TX drops are stored in if_snd for now, not the top level counters */
> + ifp->if_snd.ifq_drops = odrops;
> +
> /* Rx Errors */
> ifp->if_iqdrops = total_missed_rx;
> ifp->if_ierrors = adapter->stats.crcerrs + adapter->stats.rlec;
>
>
> -adrian
The trick with this is that if ALTQ is enabled then we will use if_snd
queue instead of the buf ring, and if that queue drops then ifq_drops
will be incremented. With this patch if ALTQ is in use then we will
not count any drops (as you will be overwriting the drop count from
the queue).
More information about the freebsd-net
mailing list