Dropped vs. missed packets in the ixgbe driver

Manish Vachharajani manishv at lineratesystems.com
Thu Aug 20 17:34:13 UTC 2009


Whoops, the correct fix is below.  Forgot to use missed_rx_cum when summing:

diff --git a/fbsd/ixgbe-1.7.4/ixgbe.c b/fbsd/ixgbe-1.7.4/ixgbe.c
index f1fa728..262d64d 100644
--- a/fbsd/ixgbe-1.7.4/ixgbe.c
+++ b/fbsd/ixgbe-1.7.4/ixgbe.c
@@ -4294,7 +4294,7 @@ ixgbe_update_stats_counters(struct adapter *adapter)
 {
        struct ifnet   *ifp = adapter->ifp;;
        struct ixgbe_hw *hw = &adapter->hw;
-       u32  missed_rx = 0, bprc, lxon, lxoff, total;
+       u32  missed_rx = 0, missed_rx_cum = 0, bprc, lxon, lxoff, total;

        adapter->stats.crcerrs += IXGBE_READ_REG(hw, IXGBE_CRCERRS);

@@ -4303,6 +4303,7 @@ ixgbe_update_stats_counters(struct adapter *adapter)
                mp = IXGBE_READ_REG(hw, IXGBE_MPC(i));
                missed_rx += mp;
                adapter->stats.mpc[i] += mp;
+               missed_rx_cum += adapter->stats.mpc[i];
                adapter->stats.rnbc[i] += IXGBE_READ_REG(hw, IXGBE_RNBC(i));
        }

@@ -4370,7 +4371,7 @@ ixgbe_update_stats_counters(struct adapter *adapter)
        ifp->if_collisions = 0;

        /* Rx Errors */
-       ifp->if_ierrors = missed_rx + adapter->stats.crcerrs +
+       ifp->if_ierrors = missed_rx_cum + adapter->stats.crcerrs +
                adapter->stats.rlec;
 }



On Thu, Aug 20, 2009 at 11:32 AM, Manish
Vachharajani<manishv at lineratesystems.com> wrote:
> My co-founder, John, just pointed out the problem.
>
> The MPC register on ixgbe is clear on read.  stats.mpc[i] correctly
> accumulates the misses, but missed_rx gets set to 0 on any interval
> where there are no misses and subsequently, if_errors gets set to 0
> (assuming no crcerrs or rlecs.)  I believe the correct fix is in the
> patch below:
>
> diff --git a/fbsd/ixgbe-1.7.4/ixgbe.c b/fbsd/ixgbe-1.7.4/ixgbe.c
> index f1fa728..9cbaec6 100644
> --- a/fbsd/ixgbe-1.7.4/ixgbe.c
> +++ b/fbsd/ixgbe-1.7.4/ixgbe.c
> @@ -4294,7 +4294,7 @@ ixgbe_update_stats_counters(struct adapter *adapter)
>  {
>        struct ifnet   *ifp = adapter->ifp;;
>        struct ixgbe_hw *hw = &adapter->hw;
> -       u32  missed_rx = 0, bprc, lxon, lxoff, total;
> +       u32  missed_rx = 0, missed_rx_cum = 0, bprc, lxon, lxoff, total;
>
>        adapter->stats.crcerrs += IXGBE_READ_REG(hw, IXGBE_CRCERRS);
>
> @@ -4303,6 +4303,7 @@ ixgbe_update_stats_counters(struct adapter *adapter)
>                mp = IXGBE_READ_REG(hw, IXGBE_MPC(i));
>                missed_rx += mp;
>                adapter->stats.mpc[i] += mp;
> +               missed_rx_cum += adapter->stats.mpc[i];
>                adapter->stats.rnbc[i] += IXGBE_READ_REG(hw, IXGBE_RNBC(i));
>        }
>
> (Note that it may not apply since I've pulled the driver out into a
> separate directory structure)
>
> We need the missed_rx_cum that is the total number of rx misses seen
> because missed_rx is decremented from gprc to work around a hardware
> issue and so needs to be the misses seen on this call to the function.
>
> Manish
>
>
> On Thu, Aug 20, 2009 at 11:23 AM, Manish
> Vachharajani<manishv at lineratesystems.com> wrote:
>> I noticed the bogus XON, XOFF numbers.  I'm glad to see it will be
>> fixed so I can cross it off my todo list.  :)  I don't think the issue
>> is related though, but you never know.
>>
>> Barney pointed out that missed_rx in the ixgbe_update_stats_counters
>> function accumulates the missed packet registers into the missed_rx
>> field.  At the end of the function, these are summed into
>> ifp->if_ierrors which should be reported under Ierrs by netstat -idh.
>> However that count is zero as reported via netstat.  The stats printfs
>> activated via sysctl dev.ix.#.stats=1 prints stats.mpc[0].  This
>> number is large (around 400k on the machine I've been using to find
>> the problem).  If you look at the code, missed_rx and mpc[i] are
>> updated with the same variables.  Given that missed_rx is unsigned, I
>> don't understand how the number fails to make it into ifp->if_ierrors,
>> but I have yet to dive into debugging this seriously.
>>
>> Initially, I thought the fix was simple since I didn't see the
>> missed_rx getting added to ierrors.  But now, I am not sure where the
>> problem is.  Hopefully, it will be more obvious to you than it is to
>> me.  I'm sure it is something simple that I am missing.
>>
>> Manish
>>
>> On Thu, Aug 20, 2009 at 11:08 AM, Jack Vogel<jfvogel at gmail.com> wrote:
>>> I've been looking at the code due to another problem of bogus flow control
>>> numbers, and there are some changes needed, things that should be 82599 vs
>>> 82598 and were not seperated properly. Will be forthcoming. Not sure if it
>>> has any relevance to this, but its possible.
>>>
>>> Jack
>>>
>>>
>>> On Thu, Aug 20, 2009 at 9:53 AM, Manish Vachharajani
>>> <manishv at lineratesystems.com> wrote:
>>>>
>>>> Oh whoops, sorry didn't see that.  So the plot thickens.  Why don't
>>>> these errors show up in the netstat output I forwarded originally?
>>>> Ierrs was 0 but the dmesg output clearly shows missed packets.  Any
>>>> thoughts on what is going on?  Looking at the code, missed_rx should
>>>> certainly get counted in the ierrors field as you said.
>>>>
>>>> Is the Ierrs in the netstat output some other counter?  If so, how do
>>>> I get the if_ierrors variable from the command line?
>>>>
>>>> Manish
>>>>
>>>> On Thu, Aug 20, 2009 at 6:49 AM, Barney Cordoba<barney_cordoba at yahoo.com>
>>>> wrote:
>>>> >
>>>> >
>>>> > --- On Wed, 8/19/09, Manish Vachharajani <manishv at lineratesystems.com>
>>>> > wrote:
>>>> >
>>>> >> From: Manish Vachharajani <manishv at lineratesystems.com>
>>>> >> Subject: Re: Dropped vs. missed packets in the ixgbe driver
>>>> >> To: "Barney Cordoba" <barney_cordoba at yahoo.com>
>>>> >> Cc: freebsd-net at freebsd.org
>>>> >> Date: Wednesday, August 19, 2009, 2:46 PM
>>>> >> Agreed, the errors are reported but
>>>> >> missed packets are not.  The
>>>> >> question is, is the correct fix to just add stats.mpc[0] to
>>>> >> if_ierrors
>>>> >> in that line or to add it to if_iqdrops.  The fix is
>>>> >> easy once we
>>>> >> agree on what the correct behavior is.
>>>> >>
>>>> >> Manish
>>>> >>
>>>> >> > Barney wrote:
>>>> >> >
>>>> >> > if you look in ixgbe_update_stats_counters at the
>>>> >> bottom:
>>>> >> >
>>>> >> >        ifp->if_ierrors = missed_rx +
>>>> >> adapter->stats.crcerrs +
>>>> >> >                adapter->stats.rlec;
>>>> >> >
>>>> >> > the errors are added in.
>>>> >> >
>>>> >> > BC
>>>> >
>>>> > Huh? missed_rx are the missed packets. So they are counted.
>>>> >
>>>> > BC
>>>> >
>>>> >
>>>> >
>>>> >
>>>> >
>>>>
>>>>
>>>>
>>>> --
>>>> Manish Vachharajani
>>
>>>> _______________________________________________
>>>> freebsd-net at freebsd.org mailing list
>>>> http://lists.freebsd.org/mailman/listinfo/freebsd-net
>>>> To unsubscribe, send any mail to "freebsd-net-unsubscribe at freebsd.org"
>>>
>>>
>>
>> --
>> Manish Vachharajani
>>
>



-- 
Manish Vachharajani
Founder
LineRate Systems
manishv at lineratesystems.com
(609)635-9531 M


More information about the freebsd-net mailing list