Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 12 Nov 1997 14:41:43 -0200 (EDT)
From:      Rodolfo Heitor Gevaerd de Faria <rodolfo@ravel.ufrj.br>
To:        aalves@dei.uc.pt
Cc:        freebsd-atm@FreeBSD.ORG
Subject:   Re: ATM driver & udp stream
Message-ID:  <199711121641.OAA00538@galileo.ravel.ufrj.br>
In-Reply-To: <Pine.BSF.3.96.971112005854.20573A-100000@zorg.dei.uc.pt> from Antonio Luis Alves at "Nov 12, 97 03:06:46 am"

next in thread | previous in thread | raw e-mail | index | archive | help
Antonio Luis Alves was saying that,
^ 
^ I have been working on a port to FreeBSD of a major manufacturer atm

If you don't mind, what is the "major manufacturer" which you're porting ?

^ implementation which includes classical ip and lan emulation. The most
^ difficult part was the development of the low level code to drive the pci
^ adapters as this was my first project working inside the kernel and also
^ on FreeBSD. At this time most of the work as been done and I have only the
^ lan emu code and ILMI to finish the port.
^ 
^ We have been running the port for several months on Pentium machines with
^ FreeBSD 2.2.2 Release without any problems, until two weeks ago when I
^ started to do some performance tests. One of tests ( a UDP stream ) was
^ crashing the driver allays at the same place in the pdu receive routine.
^ 
^ The driver allocs several buffers at init time to be used by the card to
^ write the received pdu's. The supply routine allocs an mbuf for each
^ buffer and supplies the card with the dma address of the buffer and
^ the mbuf handle. When the card interrupts, the pdu receive routine reads
^ the receive pdu queue. Each entry in this queue is a receive pdu
^ descriptor. Each descriptor contains several information related to the
^ received pdu, including several segments to form the pdu. Each segment
^ contains the mbuf handle ( allocated by the supply routine ) and the
^ number of bytes in the buffer written by the card. At this time I use 4k
^ buffers and each pdu descriptor with max 16 segments to be able to receive
^ a max pdu of 64k. The mbuf handles are read by the card from the supply
^ queue and written to the segment descriptors after the buffers have been
^ filled with cells payloads.
^ The mbuf chain forming the received pdu is formed and the pdu is send
^ upstairs. Each mbuf in the chain as the ext_buf pointing to the buffer,
^ and pointers to the external_free_routine and an external_ref_function.
^ The buffers will return to the free buffer pool on the driver as soon as
^ the external_free_routine is called and the reference count allows it.
^ These buffers are then used again by the supply routine.
^ When the card is low on buffers, the pdu receive routine does not send the
^ external buffers upstairs, instead it copies the data to mbufs with
^ clusters, so the buffers are made available again to the card faster. 
^ 
^ All was working well until I made a UDP stream test. The sender was a
^ Pentium 233mmx and on the receive side a Pentium 166. The test is a normal
^ netperf UDP_STREAM with default values for the datagram, which is the max
^ udp datagram 9216. The driver crashes at the pdu receive routine when
^ accessing the segments which form the pdu. With the debugger I can see that
^ the mbuf handles are correct but the data on the mbuf is not. Some times
^ the m_type is MT_FREE and m->next as got a valid pointer on it, and other
^ times all the members of the mbuf are zero. On a normal situation the
^ mbufs would be of type MT_DATA, and correctly initialized with the
^ pointers to the external free and reference function, m_len, ext_size and
^ ext_buffer.
^ >From the firmware guide it says the card never touches the mbuf, it just
^ pass the mbuf handle received from the supply routine to the segments on
^ the received pdu descriptor.
^ 
^ These problem only happens when there is fragmentation and reassembly of
^ packets. If I make the test with the udp datagram below the mtu of the
^ interface ( 9188 ) it goes well without any problems. Also if I pace the
^ transfer with delays and small burst it also works for the max datagram. I
^ made also other tests from a sun as the sending machine ( which is very
^ slow compared with the Pentiums we have here ) and it works ok even with
^ the max datagram of 9216.
^ 
^ So I suppose there is something related to the full blast of the Pentium
^ 233mmx and the reassembly of the packets at the ip layer. I also think
^ that at this speed ( 155MPS cards ) most of the fragments ( mbuf w/
^ external buffer ) are kept at the ip fragment queue and then as soon as
^ the card gets low on buffers , the copy to mbufs w/ clusters routine
^ enters the game and starts asking the system for a lot of mbufs and
^ clusters.
^ 
^ At this time I am running out of ideas of where to look to find the
^ problem, so I decided to do a post here and ask for some ideas.
^ I have made already lots of modifications in the driver with lots of
^ paranoid checks but without any success.
^ 
^ Sorry for the long post, but I tried to explain as much as possible for a
^ better evaluation of this problem.
^ 
^ Thank you.
^ 
^ 
^ Antonio Alves
^ 

       

	Rodolfo H G Faria
       <rodolfo@ravel.ufrj.br>




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199711121641.OAA00538>