Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 19 Oct 2012 09:53:07 +0200
From:      Fabien Thomas <fabien.thomas@netasq.com>
To:        Jack Vogel <jfvogel@gmail.com>
Cc:        "Alexander V. Chernikov" <melifaro@freebsd.org>, Luigi Rizzo <rizzo@iet.unipi.it>, net@freebsd.org
Subject:   Re: ixgbe & if_igb RX ring locking
Message-ID:  <390AF360-AEC3-495E-881A-1ACCFEF42815@netasq.com>
In-Reply-To: <CAFOYbcnT0tT0S6Q8Eos9oEDoSSZZZSr8GD5f9oO4bgpo-t6vNg@mail.gmail.com>
References:  <5079A9A1.4070403@FreeBSD.org> <20121013182223.GA73341@onelab2.iet.unipi.it> <5080020E.1010603@networx.ch> <CAFOYbcnT0tT0S6Q8Eos9oEDoSSZZZSr8GD5f9oO4bgpo-t6vNg@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help

Le 18 oct. 2012 =E0 20:09, Jack Vogel a =E9crit :

> On Thu, Oct 18, 2012 at 6:20 AM, Andre Oppermann =
<oppermann@networx.ch>wrote:
>=20
>> On 13.10.2012 20:22, Luigi Rizzo wrote:
>>=20
>>> On Sat, Oct 13, 2012 at 09:49:21PM +0400, Alexander V. Chernikov =
wrote:
>>>=20
>>>> Hello list!
>>>>=20
>>>>=20
>>>> Packets receiving code for both ixgbe and if_igb looks like the
>>>> following:
>>>>=20
>>>>=20
>>>> ixgbe_msix_que
>>>>=20
>>>> -- ixgbe_rxeof()
>>>>    {
>>>>       IXGBE_RX_LOCK(rxr);
>>>>         while
>>>>         {
>>>>            get_packet;
>>>>=20
>>>>            -- ixgbe_rx_input()
>>>>               {
>>>>                  ++ IXGBE_RX_UNLOCK(rxr);
>>>>                  if_input(packet);
>>>>                  ++ IXGBE_RX_LOCK(rxr);
>>>>               }
>>>>=20
>>>>         }
>>>>       IXGBE_RX_UNLOCK(rxr);
>>>>     }
>>>>=20
>>>> Lines marked with ++ appeared in r209068(igb) and r217593(ixgbe).
>>>>=20
>>>> These lines probably do LORs masking (if any) well.
>>>> However, such change introduce quite significant performance drop:
>>>>=20
>>>> On my routing setup (nearly the same from previous -Intel 10G =
thread in
>>>> -net) adding lock/unlock causes 2.8MPPS decrease to 2.3MPPS which =
is
>>>> nearly 20%.
>>>>=20
>>>=20
>>> one option could be (same as it is done in the timer
>>> routine in dummynet) to build a list of all the packets
>>> that need to be sent to if_input(), and then call
>>> if_input with the entire list outside the lock.
>>>=20
>>> It would be even easier if we modify the various *_input()
>>> routines to handle a list of mbufs instead of just one.
>>>=20
>>=20
>> Not really. You'd just run into tons of layering complexity.
>> Somewhere the decomposition and serialization has to be done.
>>=20
>> Perhaps the right place is to dequeue a batch of packets from
>> the HW ring and then have a task/thread send it up the stack
>> one by one.
>>=20
>=20
> I was thinking about how to code this, something like what I did with
> the refresh routine, in any case I will experiment with it.

This modified version for mq polling create a list of packet that are =
injected later (mc is the list).
=
http://www.gitorious.org/~fabient/freebsd/fabient-freebsd/blobs/work/polln=
g_mq_stable_8/sys/dev/ixgbe/ixgbe.c#line4615


>=20
> Jack
> _______________________________________________
> freebsd-net@freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-net
> To unsubscribe, send any mail to "freebsd-net-unsubscribe@freebsd.org"




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?390AF360-AEC3-495E-881A-1ACCFEF42815>