tech-net archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: BNX driver problem when mbuf clusters run out



On Apr 20, 2012, at 9:45 AM, Matt Thomas wrote:

> I don't think you applied the patch properly.
> 
> The "if" for testing the mbuf was changed to a while loop so the breaks 
> just terminate that loop.  
> 
> The patch has been updated a bit to include a missing bus_dmamap_sync

You are correct, I missed the added loop.

My interfaces still freeze.  Here's what I think the problem is.

If bnx_get_buf fails, we still call bnx_add_buf.  The mbuf gets put back in the 
ring.  We break out of the inner loop, and then end up calling ifp->ip_input, 
which eventually frees the mbuf.

I think there are some other problems with this change:

If there are receive frame problems, the mbuf is put back into the ring, and 
the mbuf is also processed.  This will have the same problem as bnx_get_buf 
failure.  However, in this case, we add processing a packet that probably 
shouldn't be processed.

Further down in the inner loop, we check for a VLAN tag.  This has a continue 
statement.  I believe we will now be in an infinite loop.  (There are some 
other weird outcomes I could posit, but in any case, I think we will have 
undesired behavior.)

I also think there's another bug in the original code.  sc->free_rx_bd is 
incremented before we check if the the mbuf pointer is NULL.  Shouldn't we only 
increment free_rx_bd if we're actually processing a packet?

-Bev


Home | Main Index | Thread Index | Old Index