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 19, 2012, at 8:02 PM, Matt Thomas wrote:
>
> On Apr 19, 2012, at 4:54 PM, Joerg Sonnenberger wrote:
>
>> On Thu, Apr 19, 2012 at 07:45:35PM -0400, Beverly Schwartz wrote:
>>> That won't work in this case. If bnx_get_buf succeeds in getting
>>> an mbuf cluster, it then puts it in the rx ring. If we haven't
>>> removed the mbuf first, there will be no place to put the new mbuf.
>>
>> That's circular reasoning. There are three places currently using
>> bnx_get_buf:
>>
>> bnx_init_rx_chain
>> bnx_rx_intr
>> bnx_tick
>>
>> The last one can be dropped with the changed semantic, since the RX ring
>> will never be depleted. The rest is solved by properly splitting up the
>> actions into allocating a mbuf cluster for the RX ring, loading a
>> cluster into the RX ring and unloading an already mapped entry.
>> bnx_init_rx_chain wants to the first two in order, bnx_rx_intr wants to
>> alloc, if that works: unload and load new cluster.
>
> Unfortunately, that can lead to receiver livelock (spend all the time
> servicing interrupts without making progress). The best thing to do is pass
> the packet up the stack and just another packet to the hardware. Instead use
> bnx_tick to add mbufs if needed. This gives the stack a chance to run and
> hopefully free some mbufs.
I tried that. And at first, things move along. But eventually, bnx_rx_intr
never gets called, because
if (sblk->status_rx_quick_consumer_index0 != sc->nw_rx_cons)
in bnx_intr always fails.
-Bev
Home |
Main Index |
Thread Index |
Old Index