nfe_defrag() routine in nividia ethernet driver

John Baldwin jhb at freebsd.org
Fri Dec 17 12:56:42 UTC 2010


On Thursday, December 16, 2010 10:53:16 pm abcde abcde wrote:
> Hi, we ported the nvidia ethernet driver to our product.  It's been OK until 
> recently we ran into an error condition where packets would get dropped quietly. 
> The root cause resides in the nfe_encap() routine, where we call nfe_defrag() to 
> try to reduce the length of the mbuf chain to 32, if it's longer than 32. In the 
> event the 32 mbufs need more than 32 segments, the subsequent call to 
> bus_dmamap_load_mbuf_sg() would cause it to return an error then the packet is 
> subsequently dropped. 
> 
> 
> My questions are,
> 
> 1. there appears to be a generic m_defrag() routine available, which doesn't 
> stop at 32 and is used by a couple of other drivers (Intel, Broadcom, to name a 
> few). What was the need for a nvidia version of the defrag routine?

The nfe_defrag() routine is a copy of a similar method from another driver.  It
is now called m_collapse() in newer versions of FreeBSD.  m_collapse() is less
expensive than m_defrag() in that it can avoid extra allocations if they aren't
needed.  You can use m_defrag() if you wish, but I would still try nfe_defrag()
first and only fall back to m_defrag() if that fails.

> 2. The NFE_MAX_SCATTER constant, which limits how many segments can be used, is 
> defined to be 32, while the corresponding constants for other drivers are 100 or 
> 64 (again Intel or Broadcom). How was the value 32 picked? Anybody knows the 
> reasoning behind them?

It may very well be a chip-dependent limitation due to something in the hardware or
firmware of the nfe(4) devices.

-- 
John Baldwin


More information about the freebsd-net mailing list