Date: Tue, 2 Feb 2016 06:34:48 +0100 From: Luigi Rizzo <rizzo@iet.unipi.it> To: Xiaoye Sun <Xiaoye.Sun@rice.edu> Cc: Pavel Odintsov <pavel.odintsov@gmail.com>, "freebsd-net@freebsd.org" <freebsd-net@freebsd.org> Subject: Re: swaping ring slots between NIC ring and Host ring does not always success Message-ID: <CA%2BhQ2%2BhjnuGo1xKgc8CQ7gP35tiaZG7%2BroZBmX8aBgb8qWnLgg@mail.gmail.com> In-Reply-To: <CAJnByziDzdR2C6DcSRNPtrWACLq0XFpe4X1Ek9yXtFP9ivqWQw@mail.gmail.com> References: <CAJnByzj6Dj3vouZ2NbxqvCV-2-7TVtTR4FaWKuCFaaRN2X%2ByAA@mail.gmail.com> <CALgsdbd3XuE3wMYp4ey%2B1aer%2BHSVNojLYoVqwqTBPAXXdf9i%2BQ@mail.gmail.com> <CAJnByzirLXdCe-kwHV2s_E6ytGJG0Dth=0Ms12RrEk7FK_%2B8Og@mail.gmail.com> <CA%2BhQ2%2BgMWY0eabjHGw0=PJCAkS-wO=RBrN5brSbaqWc3_AOYoQ@mail.gmail.com> <CAJnByziBS8o6LtmpUrUu5xtRUd008Z2hnCsp=WVFv35r2J0rHw@mail.gmail.com> <CA%2BhQ2%2Bim9nFfYnqDS2HgRbAzdf5D0iaLCmCYhfXQVVRMouUFuw@mail.gmail.com> <CAJnByzht-qfDcm8oEg1aSRyVBZ1ygPvc2eMuoyJcq4geueTZ0Q@mail.gmail.com> <CA%2BhQ2%2BiERgWJ=cdFB-cByfT3r11T1kKr-5HiuCYZY-rxbjf=XA@mail.gmail.com> <CAJnByziDzdR2C6DcSRNPtrWACLq0XFpe4X1Ek9yXtFP9ivqWQw@mail.gmail.com>
next in thread | previous in thread | raw e-mail | index | archive | help
On Tue, Feb 2, 2016 at 6:23 AM, Xiaoye Sun <Xiaoye.Sun@rice.edu> wrote: > Hi Luigi, > > I have to clarify about the *jumping issue* about the slot indexes. > In the bridge.c program, the slot index never jumps and it increases > sequentially. > In the receiver.c program, the udp packet seq jumps and I showed the slot > index that each udp packet uses. So the slot index jumps together with the > udp seq (at the receiver program only). So let me understand, is the "slot" some information written in the packet by bridge.c (referring to the rx or tx slot, I am not sure) and then read and printed by receiver.c (which gets the packet through recvfrom so there isn't really any slot index) ? Do you see any ordering inversion when the receiver gets packets through the NETMAP API (e.g. using bridge.c instead of receiver.c) ? Are you using native netmap drivers or the emulated mode ? You can check that by playing with the "admode" sysctl entry (or sysfs on linux) - try setting to 1 and 2 and see if the behaviour changes. dev.netmap.admode: 0 Controls the use of native or emulated adapter mode. 0 uses the best available option, 1 forces native and fails if not available, 2 forces emulated hence never fails. cheers luigi > > There is really one ring (tx and rx) for NIC and one ring (tx and rx) for > the host. > I also doubt that there might be multiple tx rings for the host. It seems > like that bridge program swap packet to multiple host rings and the udp recv > program drains packets from these rings. But this is not the case here. > > The bridge program prints a line like this > *515.277263 main [277] Ready to go, eth3 0x1/1 <-> eth3 0x0/1.* > this is printed by the following line the original program > *D("Ready to go, %s 0x%x/%d <-> %s 0x%x/%d.", pa->req.nr_name, > pa->first_rx_ring, pa->req.nr_rx_rings, pb->req.nr_name, pb->first_rx_ring, > pb->req.nr_rx_rings);* > > I think this shows that there is really one NIC ring and one HOST ring. > > Is there another way to verify the number of ring that netmap has? > > Thanks! > Xiaoye > > On Mon, Feb 1, 2016 at 10:48 PM, Luigi Rizzo <rizzo@iet.unipi.it> wrote: >> >> Hi, >> there must be some wrong with your setting because >> slot indexes must be sequential and in your case they >> are not (see the jump from 295 to 474 and then >> back from 485 to 296, and the numerous interleavings >> that you are seeing later). >> >> I have no idea of the cause but typically this pattern >> is what you see when there are multiple input rings and >> not just one. >> >> Cheers >> Luigi >> >> >> >> >> On Tue, Feb 2, 2016 at 12:24 AM, Xiaoye Sun <Xiaoye.Sun@rice.edu> wrote: >> > Hi Luigi, >> > >> > Thanks for the detailed advice. >> > >> > With more detailed experiments, actually I found that the udp >> > sender/receiver packet reorder issue *might* be irrelevant to the >> > original >> > issue I posted. However, I think we should solve the udp sender/receiver >> > issue first. >> > I run the experiment with more detailed log. Here is my findings. >> > >> > 1. I am running a netmap version available since about Oct 13rd from >> > github >> > (https://github.com/luigirizzo/netmap). So I think this is not the one >> > related to the buffer allocation issue. I tried to running the newest >> > version, however, that version causes problem when I exit the bridge >> > program >> > (something like kernel error which make the os crash). >> > >> > 2 & 3. I changed the receiver.c & bridge.c so that I can get more >> > information (more detailed log). >> > The reorder happens multiple times (about 10 times) within a second. >> > Here is >> > one example trace collected from the above two programs. (remembering >> > that >> > we have udp sender running on one machine; netmap bridge and udp >> > receiver >> > are running on another machine). >> > There is only one pair of rings each with 512 slots (511 slot usable) on >> > the >> > receiver machine. >> > >> > =================== packet trace collected from receiver.c >> > =================== >> > ===== together with the slot and buf_idx of the corresponding netmap >> > ring >> > slots ====== >> > [seq] [slot] [buf_idx] >> > 8208 294 1833 >> > 8209 295 1834 >> > 8388 474 2013 >> > ... (packet received in order) >> > 8398 484 2023 >> > 8399 485 2024 >> > 8210 296 1835 >> > 8211 297 1836 >> > ... (packet received in order) >> > ... >> > 8222 308 1847 >> > 8400 486 2025 >> > 8223 309 1848 >> > 8401 487 2026 >> > 8224 310 1849 >> > 8402 488 2027 >> > 8225 311 1850 >> > 8403 489 2028 >> > 8226 312 1851 >> > 8404 450 2029 >> > 8227 313 1852 >> > 8228 314 1853 >> > =================================================================== >> > As we can see that the udp receiver got packet 8210 after it got 8399, >> > which >> > is the first reorder. Then, the receiver got 8211 to 8222 sequentially. >> > Then >> > it got packet from 8223-8227 and 8400-8404 interleaved. >> > >> > >> > ==================== event order seen by netmap bridge >> > ================== >> > get 8209 >> > poll called >> > get 8210 >> > ... >> > ... >> > get 8228 >> > poll called >> > get 8229 >> > ... >> > ... >> > get 8383 >> > poll called >> > get 8384 >> > ... >> > get 8387 >> > poll called >> > get 8388 >> > ... >> > get 8393 >> > poll called >> > get 8394 >> > ... >> > get 8399 >> > poll called >> > get 8400 >> > ... >> > get 8404 >> > poll called >> > get 8405 >> > =================================================================== >> > As we can see, from the event ordering see by the bridge.c, all the >> > packets >> > are receiver in order, which means the the reorder happens when the >> > bridge >> > code swap the buf_idx between the nic ring(slot) and the host >> > ring(slot). >> > The reordered seq usually right before or after the poll function call. >> > >> > Best, >> > Xiaoye >> > >> > >> > >> > >> > >> > >> > >> > >> > On Fri, Jan 29, 2016 at 4:27 PM, Luigi Rizzo <rizzo@iet.unipi.it> wrote: >> >> >> >> On Fri, Jan 29, 2016 at 2:12 PM, Xiaoye Sun <Xiaoye.Sun@rice.edu> >> >> wrote: >> >> > Hi Luigi, >> >> > >> >> > Thanks for your advice. >> >> > I forgot to mention that I use the command "ethtool -L eth1 combined >> >> > 1" >> >> > to >> >> > set the number of rings of the nic to 1. The host also only has one >> >> > ring. >> >> > I understand the situation where the first tx ring is full so the >> >> > bridge >> >> > will swap the packets to the second tx ring and then the host/nic >> >> > might >> >> > drain either rings. But this is not the case in the experiment. >> >> >> >> ok good to know that. >> >> >> >> So if we have ruled out multiqueue and iommu, let's look at >> >> the internal allocator and at bridge.c >> >> >> >> 1. are you running the most recent version of netmap ? >> >> Some older version (probably 1-2 years ago) had a bug >> >> in the buffer allocator and some buffers were allocated >> >> twice. >> >> >> >> 2. can you tweak your receiver.c to report some more info >> >> on how often you get out of sequence packets, how much >> >> out of sequence they are ? >> >> Also it would be useful to report gaps on the increasing side >> >> (i.e. new_seq != old_seq +1 ) >> >> >> >> 3. can you tweak bridge.c so that it writes into the packet >> >> the netmap buffer indexes and slots on the rx and tx side, >> >> so when you detect a sequence error we can figure out >> >> where it is happening. >> >> Ideally you could also add the sequence number detection >> >> code in bridge.c so we can check whether the errors appear >> >> on the input or output sides. >> >> >> >> cheers >> >> luigi >> >> >> > >> >> >> >> -- >> -----------------------------------------+------------------------------- >> Prof. Luigi RIZZO, rizzo@iet.unipi.it . Dip. di Ing. dell'Informazione >> http://www.iet.unipi.it/~luigi/ . Universita` di Pisa >> TEL +39-050-2217533 . via Diotisalvi 2 >> Mobile +39-338-6809875 . 56122 PISA (Italy) >> -----------------------------------------+------------------------------- >> > -- -----------------------------------------+------------------------------- Prof. Luigi RIZZO, rizzo@iet.unipi.it . Dip. di Ing. dell'Informazione http://www.iet.unipi.it/~luigi/ . Universita` di Pisa TEL +39-050-2217533 . via Diotisalvi 2 Mobile +39-338-6809875 . 56122 PISA (Italy) -----------------------------------------+-------------------------------
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CA%2BhQ2%2BhjnuGo1xKgc8CQ7gP35tiaZG7%2BroZBmX8aBgb8qWnLgg>