Commit cc14db11 authored by Jesse Brandeburg's avatar Jesse Brandeburg Committed by Tony Nguyen

ice: use prefetch methods

The kernel provides some prefetch mechanisms to speed up commonly
cold cache line accesses during receive processing. Since these are
software structures it helps to have these strategically placed
prefetches.

Be careful to call BQL prefetch complete only for non XDP queues.
Co-developed-by: default avatarPiotr Raczynski <piotr.raczynski@intel.com>
Signed-off-by: default avatarPiotr Raczynski <piotr.raczynski@intel.com>
Signed-off-by: default avatarJesse Brandeburg <jesse.brandeburg@intel.com>
Tested-by: default avatarGurucharan G <gurucharanx.g@intel.com>
Signed-off-by: default avatarTony Nguyen <anthony.l.nguyen@intel.com>
parent 1c96c168
...@@ -3,8 +3,9 @@ ...@@ -3,8 +3,9 @@
/* The driver transmit and receive code */ /* The driver transmit and receive code */
#include <linux/prefetch.h>
#include <linux/mm.h> #include <linux/mm.h>
#include <linux/netdevice.h>
#include <linux/prefetch.h>
#include <linux/bpf_trace.h> #include <linux/bpf_trace.h>
#include <net/dsfield.h> #include <net/dsfield.h>
#include <net/xdp.h> #include <net/xdp.h>
...@@ -219,6 +220,10 @@ static bool ice_clean_tx_irq(struct ice_tx_ring *tx_ring, int napi_budget) ...@@ -219,6 +220,10 @@ static bool ice_clean_tx_irq(struct ice_tx_ring *tx_ring, int napi_budget)
struct ice_tx_desc *tx_desc; struct ice_tx_desc *tx_desc;
struct ice_tx_buf *tx_buf; struct ice_tx_buf *tx_buf;
/* get the bql data ready */
if (!ice_ring_is_xdp(tx_ring))
netdev_txq_bql_complete_prefetchw(txring_txq(tx_ring));
tx_buf = &tx_ring->tx_buf[i]; tx_buf = &tx_ring->tx_buf[i];
tx_desc = ICE_TX_DESC(tx_ring, i); tx_desc = ICE_TX_DESC(tx_ring, i);
i -= tx_ring->count; i -= tx_ring->count;
...@@ -232,6 +237,9 @@ static bool ice_clean_tx_irq(struct ice_tx_ring *tx_ring, int napi_budget) ...@@ -232,6 +237,9 @@ static bool ice_clean_tx_irq(struct ice_tx_ring *tx_ring, int napi_budget)
if (!eop_desc) if (!eop_desc)
break; break;
/* follow the guidelines of other drivers */
prefetchw(&tx_buf->skb->users);
smp_rmb(); /* prevent any other reads prior to eop_desc */ smp_rmb(); /* prevent any other reads prior to eop_desc */
ice_trace(clean_tx_irq, tx_ring, tx_desc, tx_buf); ice_trace(clean_tx_irq, tx_ring, tx_desc, tx_buf);
...@@ -2265,6 +2273,9 @@ ice_xmit_frame_ring(struct sk_buff *skb, struct ice_tx_ring *tx_ring) ...@@ -2265,6 +2273,9 @@ ice_xmit_frame_ring(struct sk_buff *skb, struct ice_tx_ring *tx_ring)
return NETDEV_TX_BUSY; return NETDEV_TX_BUSY;
} }
/* prefetch for bql data which is infrequently used */
netdev_txq_bql_enqueue_prefetchw(txring_txq(tx_ring));
offload.tx_ring = tx_ring; offload.tx_ring = tx_ring;
/* record the location of the first descriptor for this packet */ /* record the location of the first descriptor for this packet */
......
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