I have been following this, and thinking about it. I still am working from a theoretical standpoint, but based on a patch I got quite a long time back and never quite groked, I believe now that I might have a solution.
The original PR and patch was kern/150516 from Beezar Liu, I was never quite comfortable with the code changes, nor convinced that it was a real issue and not a misunderstanding. However I think now that this very report might be behind what we are seeing today. I have a slightly different approach to solving it, of course it remains to be seen if it handles it properly. Please try the patch I've attached, I'm open to further correction or polishing of the changes. And thanks to Beezar for his original report and changes, this is not for em, but if this eliminates the problem its clearly needed in all drivers. Jack
ProxyChains-3.1 (http://proxychains.sf.net) Index: if_igb.c =================================================================== --- if_igb.c (revision 218463) +++ if_igb.c (working copy) @@ -4312,6 +4312,7 @@ struct mbuf *sendmp, *mh, *mp; struct igb_rx_buf *rxbuf; u16 hlen, plen, hdr, vtag; + int commit; bool eop = FALSE; cur = &rxr->rx_base[i]; @@ -4440,10 +4441,22 @@ bus_dmamap_sync(rxr->rxdma.dma_tag, rxr->rxdma.dma_map, BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); + commit = i; /* capture the old index */ + /* Advance our pointers to the next descriptor. */ if (++i == adapter->num_rx_desc) i = 0; /* + ** Sanity test for ring full, if this + ** happens we need to refresh immediately + ** or refresh may deadlock. + */ + if (i == rxr->next_to_refresh) { + igb_refresh_mbufs(rxr, commit); + processed = 0; + } + + /* ** Send to the stack or LRO */ if (sendmp != NULL) {
_______________________________________________ freebsd-net@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-net To unsubscribe, send any mail to "freebsd-net-unsubscr...@freebsd.org"