we need to always schedule another rx ring refill callout
in case we fail to do it at the spot.  previously what would
happen is that say we have 2 clusters on the rx ring and we
schedule an rxrefill callout that fails to update the ring.
then we still have those 2 clusters around.  under heavy
load ix (82598 specifically) would stall and stop producing
rx interrupts until you send a packet: it would trigger an
rxrefill and unstick the rx ring.

this also explains the "< 2" nonsense that i've argued for
in the past.

ok?

diff --git dev/pci/if_ix.c dev/pci/if_ix.c
index 8ab83f8..02e5315 100644
--- dev/pci/if_ix.c
+++ dev/pci/if_ix.c
@@ -961,8 +961,8 @@ ixgbe_legacy_irq(void *arg)
                        /* Advance the Rx Queue "Tail Pointer" */
                        IXGBE_WRITE_REG(&sc->hw, IXGBE_RDT(que->rxr->me),
                            que->rxr->last_desc_filled);
-               } else if (que->rxr->rx_ndescs < 2)
-                       timeout_add(&sc->rx_refill, 0);
+               } else
+                       timeout_add(&sc->rx_refill, 1);
        }
 
        if (ifp->if_flags & IFF_RUNNING && !IFQ_IS_EMPTY(&ifp->if_snd))
@@ -2747,7 +2747,7 @@ ixgbe_rxrefill(void *xsc)
                /* Advance the Rx Queue "Tail Pointer" */
                IXGBE_WRITE_REG(&sc->hw, IXGBE_RDT(que->rxr->me),
                    que->rxr->last_desc_filled);
-       } else if (que->rxr->rx_ndescs < 2)
+       } else
                timeout_add(&sc->rx_refill, 1);
        splx(s);
 }

Reply via email to