> hmmm, but in thie case, no buffers would should be set to > be available for rx, so nowthing should pass RGE_OWN() at > L1245 i'd hope. i still see the problem with everything > being depleted, but then it should just stop getting any > rx packets at all... > > networking folks, am i missing something here? i see the > same problem in wm(4) as well. if wm_add_rxbuf() fails, > where will this ring entry's mbuf ever be replaced again?
i see the thing i missed. i was looking at openbsd if_rge.c 1.16, which m_free()s the mbuf in this case, which in our tree has nothing that would refill it, but our if_rge.c has this comment: * If allocating a replacement mbuf fails, * reload the current one. which means that when we have a mbuf allocation error, we basically drop the current packet, and leave the mbuf in place ready for use next time. that means there is no mbuf leak in our current code, and i think the only part of openbsd if_rge.c 1.16 we want is the if_ierrors++ (that we call if_statinc(ifp, if_ierrors).) i think i see the problem (no, really, this time :-). when we have a memory failure, we don't re-load the map with bus_dmamap_unload(), so that's why it has zero size. the fix isn't simple because the load of the new mbuf can fail, and then we want to reload the old one, but it was the load event that failed, why would it work again for the old mbuf now? seems like we need to have a (very short) timer that tries to realloc it again, but i'm hoping someone else has solved this problem and we can use their method.. .mrg.