Commit de31049a authored by Jakub Kicinski's avatar Jakub Kicinski Committed by David S. Miller

nfp: move temporary variables in nfp_net_tx_complete()

Move temporary variables in scope of the loop in nfp_net_tx_complete(),
and add a temp for txbuf software structure.  This saves us 0.2% of CPU.
Signed-off-by: default avatarJakub Kicinski <jakub.kicinski@netronome.com>
Reviewed-by: default avatarDirk van der Merwe <dirk.vandermerwe@netronome.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 95862749
...@@ -940,14 +940,10 @@ static void nfp_net_tx_complete(struct nfp_net_tx_ring *tx_ring, int budget) ...@@ -940,14 +940,10 @@ static void nfp_net_tx_complete(struct nfp_net_tx_ring *tx_ring, int budget)
{ {
struct nfp_net_r_vector *r_vec = tx_ring->r_vec; struct nfp_net_r_vector *r_vec = tx_ring->r_vec;
struct nfp_net_dp *dp = &r_vec->nfp_net->dp; struct nfp_net_dp *dp = &r_vec->nfp_net->dp;
const struct skb_frag_struct *frag;
struct netdev_queue *nd_q; struct netdev_queue *nd_q;
u32 done_pkts = 0, done_bytes = 0; u32 done_pkts = 0, done_bytes = 0;
struct sk_buff *skb;
int todo, nr_frags;
u32 qcp_rd_p; u32 qcp_rd_p;
int fidx; int todo;
int idx;
if (tx_ring->wr_p == tx_ring->rd_p) if (tx_ring->wr_p == tx_ring->rd_p)
return; return;
...@@ -961,26 +957,33 @@ static void nfp_net_tx_complete(struct nfp_net_tx_ring *tx_ring, int budget) ...@@ -961,26 +957,33 @@ static void nfp_net_tx_complete(struct nfp_net_tx_ring *tx_ring, int budget)
todo = D_IDX(tx_ring, qcp_rd_p - tx_ring->qcp_rd_p); todo = D_IDX(tx_ring, qcp_rd_p - tx_ring->qcp_rd_p);
while (todo--) { while (todo--) {
const struct skb_frag_struct *frag;
struct nfp_net_tx_buf *tx_buf;
struct sk_buff *skb;
int fidx, nr_frags;
int idx;
idx = D_IDX(tx_ring, tx_ring->rd_p++); idx = D_IDX(tx_ring, tx_ring->rd_p++);
tx_buf = &tx_ring->txbufs[idx];
skb = tx_ring->txbufs[idx].skb; skb = tx_buf->skb;
if (!skb) if (!skb)
continue; continue;
nr_frags = skb_shinfo(skb)->nr_frags; nr_frags = skb_shinfo(skb)->nr_frags;
fidx = tx_ring->txbufs[idx].fidx; fidx = tx_buf->fidx;
if (fidx == -1) { if (fidx == -1) {
/* unmap head */ /* unmap head */
dma_unmap_single(dp->dev, tx_ring->txbufs[idx].dma_addr, dma_unmap_single(dp->dev, tx_buf->dma_addr,
skb_headlen(skb), DMA_TO_DEVICE); skb_headlen(skb), DMA_TO_DEVICE);
done_pkts += tx_ring->txbufs[idx].pkt_cnt; done_pkts += tx_buf->pkt_cnt;
done_bytes += tx_ring->txbufs[idx].real_len; done_bytes += tx_buf->real_len;
} else { } else {
/* unmap fragment */ /* unmap fragment */
frag = &skb_shinfo(skb)->frags[fidx]; frag = &skb_shinfo(skb)->frags[fidx];
dma_unmap_page(dp->dev, tx_ring->txbufs[idx].dma_addr, dma_unmap_page(dp->dev, tx_buf->dma_addr,
skb_frag_size(frag), DMA_TO_DEVICE); skb_frag_size(frag), DMA_TO_DEVICE);
} }
...@@ -988,9 +991,9 @@ static void nfp_net_tx_complete(struct nfp_net_tx_ring *tx_ring, int budget) ...@@ -988,9 +991,9 @@ static void nfp_net_tx_complete(struct nfp_net_tx_ring *tx_ring, int budget)
if (fidx == nr_frags - 1) if (fidx == nr_frags - 1)
napi_consume_skb(skb, budget); napi_consume_skb(skb, budget);
tx_ring->txbufs[idx].dma_addr = 0; tx_buf->dma_addr = 0;
tx_ring->txbufs[idx].skb = NULL; tx_buf->skb = NULL;
tx_ring->txbufs[idx].fidx = -2; tx_buf->fidx = -2;
} }
tx_ring->qcp_rd_p = qcp_rd_p; tx_ring->qcp_rd_p = qcp_rd_p;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment