Skip to content

Commit

Permalink
net: stmmac: Fix overall budget calculation for rxtx_napi
Browse files Browse the repository at this point in the history
commit 81d0885 upstream.

tx_done is not used for napi_complete_done(). Thus, NAPI busy polling
mechanism by gro_flush_timeout and napi_defer_hard_irqs will not able
be triggered after a packet is transmitted when there is no receive
packet.

Fix this by taking the maximum value between tx_done and rx_done as
overall budget completed by the rxtx NAPI poll to ensure XDP Tx ZC
operation is continuously polling for next Tx frame. This gives
benefit of lower packet submission processing latency and jitter
under XDP Tx ZC mode.

Performance of tx-only using xdp-sock on Intel ADL-S platform is
the same with and without this patch.

root@intel-corei7-64:~# ./xdpsock -i enp0s30f4 -t -z -q 1 -n 10
 sock0@enp0s30f4:1 txonly xdp-drv
                   pps            pkts           10.00
rx                 0              0
tx                 511630         8659520

 sock0@enp0s30f4:1 txonly xdp-drv
                   pps            pkts           10.00
rx                 0              0
tx                 511625         13775808

 sock0@enp0s30f4:1 txonly xdp-drv
                   pps            pkts           10.00
rx                 0              0
tx                 511619         18892032

Fixes: 132c32e ("net: stmmac: Add TX via XDP zero-copy socket")
Cc: <stable@vger.kernel.org> # 5.13.x
Co-developed-by: Ong Boon Leong <boon.leong.ong@intel.com>
Signed-off-by: Ong Boon Leong <boon.leong.ong@intel.com>
Signed-off-by: Song Yoong Siang <yoong.siang.song@intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
yoongsiang2 authored and gregkh committed Sep 18, 2021
1 parent 897f50b commit 92137a2
Showing 1 changed file with 6 additions and 4 deletions.
10 changes: 6 additions & 4 deletions drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
Expand Up @@ -5358,7 +5358,7 @@ static int stmmac_napi_poll_rxtx(struct napi_struct *napi, int budget)
struct stmmac_channel *ch =
container_of(napi, struct stmmac_channel, rxtx_napi);
struct stmmac_priv *priv = ch->priv_data;
int rx_done, tx_done;
int rx_done, tx_done, rxtx_done;
u32 chan = ch->index;

priv->xstats.napi_poll++;
Expand All @@ -5368,14 +5368,16 @@ static int stmmac_napi_poll_rxtx(struct napi_struct *napi, int budget)

rx_done = stmmac_rx_zc(priv, budget, chan);

rxtx_done = max(tx_done, rx_done);

/* If either TX or RX work is not complete, return budget
* and keep pooling
*/
if (tx_done >= budget || rx_done >= budget)
if (rxtx_done >= budget)
return budget;

/* all work done, exit the polling mode */
if (napi_complete_done(napi, rx_done)) {
if (napi_complete_done(napi, rxtx_done)) {
unsigned long flags;

spin_lock_irqsave(&ch->lock, flags);
Expand All @@ -5386,7 +5388,7 @@ static int stmmac_napi_poll_rxtx(struct napi_struct *napi, int budget)
spin_unlock_irqrestore(&ch->lock, flags);
}

return min(rx_done, budget - 1);
return min(rxtx_done, budget - 1);
}

/**
Expand Down

0 comments on commit 92137a2

Please sign in to comment.