From: Willem de Bruijn <willemdebruijn.ker...@gmail.com> > By the > > if ((status & handle_rx) && (chan < priv->plat->rx_queues_to_use)) { > stmmac_disable_dma_irq(priv, priv->ioaddr, chan); > napi_schedule_irqoff(&ch->rx_napi); > } > > branch directly above? If so, is it possible to have fewer rx than tx > queues and miss this?
Yes, it is possible. > this logic seems more complex than needed? > > if (status) > status |= handle_rx | handle_tx; > > if ((status & handle_rx) && (chan < priv->plat->rx_queues_to_use)) { > > } > > if ((status & handle_tx) && (chan < priv->plat->tx_queues_to_use)) { > > } > > status & handle_rx implies status & handle_tx and vice versa. This is removed in patch 09/10. > > - if (work_done < budget && napi_complete_done(napi, work_done)) > > - stmmac_enable_dma_irq(priv, priv->ioaddr, chan); > > + if (work_done < budget) > > + napi_complete_done(napi, work_done); > > It does seem odd that stmmac_napi_poll_rx and stmmac_napi_poll_tx both > call stmmac_enable_dma_irq(..) independent of the other. Shouldn't the > IRQ remain masked while either is active or scheduled? That is almost > what this patch does, though not exactly. After patch 09/10 the interrupts will only be disabled by RX NAPI and re-enabled by it again. I can do some tests on whether disabling interrupts independently gives more performance but I wouldn't expect so because the real bottleneck when I do iperf3 tests is the RX path ...