nfp: avoid reading TX queue indexes from the device
authorJakub Kicinski <jakub.kicinski@netronome.com>
Fri, 28 Apr 2017 04:06:18 +0000 (21:06 -0700)
committerDavid S. Miller <davem@davemloft.net>
Mon, 1 May 2017 02:37:00 +0000 (22:37 -0400)
Reading TX queue indexes from the device memory on each interrupt
is expensive.  It's doubly expensive with XDP running since we have
two TX rings to check there.  If the software indexes indicate that
the TX queue is completely empty, however, we don't need to look at
the device completion index at all.

The queuing CPU is doing a wmb() before kicking the device TX so
we should be safe to assume on the CPU handling the completions will
never see old value of the software copy of the index.

Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/netronome/nfp/nfp_net_common.c

index 4fbda0eb47761a37febc3b28541f9b4809c89e3b..c763a5b3bd6b4373662d88ec45e0048dda88e4bc 100644 (file)
@@ -927,6 +927,9 @@ static void nfp_net_tx_complete(struct nfp_net_tx_ring *tx_ring)
        int fidx;
        int idx;
 
+       if (tx_ring->wr_p == tx_ring->rd_p)
+               return;
+
        /* Work out how many descriptors have been transmitted */
        qcp_rd_p = nfp_qcp_rd_ptr_read(tx_ring->qcp_q);
 
@@ -1001,6 +1004,9 @@ static void nfp_net_xdp_complete(struct nfp_net_tx_ring *tx_ring)
        int idx, todo;
        u32 qcp_rd_p;
 
+       if (tx_ring->wr_p == tx_ring->rd_p)
+               return;
+
        /* Work out how many descriptors have been transmitted */
        qcp_rd_p = nfp_qcp_rd_ptr_read(tx_ring->qcp_q);