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