On 2024-04-02 at 20:23:04, Paul Barker (paul.barker.ct@xxxxxxxxxxxxxx) wrote: > The TX queue should be serviced each time the poll function is called, > even if the full RX work budget has been consumed. This prevents > starvation of the TX queue when RX bandwidth usage is high. > > Fixes: c156633f1353 ("Renesas Ethernet AVB driver proper") > Signed-off-by: Paul Barker <paul.barker.ct@xxxxxxxxxxxxxx> > --- > Changes from v1: > * Use the correct 'Fixes' tag. > * Call the new variable 'unmask' and drop the unnecessary initializer, > as requested by Sergey. > > drivers/net/ethernet/renesas/ravb_main.c | 7 +++++-- > 1 file changed, 5 insertions(+), 2 deletions(-) > > diff --git a/drivers/net/ethernet/renesas/ravb_main.c b/drivers/net/ethernet/renesas/ravb_main.c > index d1be030c8848..48803050abdb 100644 > --- a/drivers/net/ethernet/renesas/ravb_main.c > +++ b/drivers/net/ethernet/renesas/ravb_main.c > @@ -1324,12 +1324,12 @@ static int ravb_poll(struct napi_struct *napi, int budget) > int q = napi - priv->napi; > int mask = BIT(q); > int quota = budget; > + bool unmask; > > /* Processing RX Descriptor Ring */ > /* Clear RX interrupt */ > ravb_write(ndev, ~(mask | RIS0_RESERVED), RIS0); > - if (ravb_rx(ndev, "a, q)) > - goto out; > + unmask = !ravb_rx(ndev, "a, q); > > /* Processing TX Descriptor Ring */ AFAIU, TX is processed without any budget. This wont result in rx work starvation if TX traffic is more ? > spin_lock_irqsave(&priv->lock, flags); > @@ -1339,6 +1339,9 @@ static int ravb_poll(struct napi_struct *napi, int budget) > netif_wake_subqueue(ndev, q); > spin_unlock_irqrestore(&priv->lock, flags); > > + if (!unmask) > + goto out; > + > napi_complete(napi); > > /* Re-enable RX/TX interrupts */ > > base-commit: ea2a1cfc3b2019bdea6324acd3c03606b60d71ad > -- > 2.39.2 >