Commit f1b1f409 authored by Maciej Fijalkowski's avatar Maciej Fijalkowski Committed by Tony Nguyen

ice: store the result of ice_rx_offset() onto ice_ring

Output of ice_rx_offset() is based on ethtool's priv flag setting, which
when changed, causes PF reset (disables napi, frees irqs, loads
different Rx mem model, etc.). This means that within napi its result is
constant and there is no reason to call it per each processed frame.

Add new 'rx_offset' field to ice_ring that is meant to hold the
ice_rx_offset() result and use it within ice_clean_rx_irq().
Furthermore, use it within ice_alloc_mapped_page().
Reviewed-by: default avatarBjörn Töpel <bjorn.topel@intel.com>
Signed-off-by: default avatarMaciej Fijalkowski <maciej.fijalkowski@intel.com>
Tested-by: default avatarTony Brelinski <tonyx.brelinski@intel.com>
Signed-off-by: default avatarTony Nguyen <anthony.l.nguyen@intel.com>
parent f7bb0d71
...@@ -443,6 +443,22 @@ void ice_free_rx_ring(struct ice_ring *rx_ring) ...@@ -443,6 +443,22 @@ void ice_free_rx_ring(struct ice_ring *rx_ring)
} }
} }
/**
* ice_rx_offset - Return expected offset into page to access data
* @rx_ring: Ring we are requesting offset of
*
* Returns the offset value for ring into the data buffer.
*/
static unsigned int ice_rx_offset(struct ice_ring *rx_ring)
{
if (ice_ring_uses_build_skb(rx_ring))
return ICE_SKB_PAD;
else if (ice_is_xdp_ena_vsi(rx_ring->vsi))
return XDP_PACKET_HEADROOM;
return 0;
}
/** /**
* ice_setup_rx_ring - Allocate the Rx descriptors * ice_setup_rx_ring - Allocate the Rx descriptors
* @rx_ring: the Rx ring to set up * @rx_ring: the Rx ring to set up
...@@ -477,6 +493,7 @@ int ice_setup_rx_ring(struct ice_ring *rx_ring) ...@@ -477,6 +493,7 @@ int ice_setup_rx_ring(struct ice_ring *rx_ring)
rx_ring->next_to_use = 0; rx_ring->next_to_use = 0;
rx_ring->next_to_clean = 0; rx_ring->next_to_clean = 0;
rx_ring->rx_offset = ice_rx_offset(rx_ring);
if (ice_is_xdp_ena_vsi(rx_ring->vsi)) if (ice_is_xdp_ena_vsi(rx_ring->vsi))
WRITE_ONCE(rx_ring->xdp_prog, rx_ring->vsi->xdp_prog); WRITE_ONCE(rx_ring->xdp_prog, rx_ring->vsi->xdp_prog);
...@@ -494,22 +511,6 @@ int ice_setup_rx_ring(struct ice_ring *rx_ring) ...@@ -494,22 +511,6 @@ int ice_setup_rx_ring(struct ice_ring *rx_ring)
return -ENOMEM; return -ENOMEM;
} }
/**
* ice_rx_offset - Return expected offset into page to access data
* @rx_ring: Ring we are requesting offset of
*
* Returns the offset value for ring into the data buffer.
*/
static unsigned int ice_rx_offset(struct ice_ring *rx_ring)
{
if (ice_ring_uses_build_skb(rx_ring))
return ICE_SKB_PAD;
else if (ice_is_xdp_ena_vsi(rx_ring->vsi))
return XDP_PACKET_HEADROOM;
return 0;
}
static unsigned int static unsigned int
ice_rx_frame_truesize(struct ice_ring *rx_ring, unsigned int __maybe_unused size) ice_rx_frame_truesize(struct ice_ring *rx_ring, unsigned int __maybe_unused size)
{ {
...@@ -518,8 +519,8 @@ ice_rx_frame_truesize(struct ice_ring *rx_ring, unsigned int __maybe_unused size ...@@ -518,8 +519,8 @@ ice_rx_frame_truesize(struct ice_ring *rx_ring, unsigned int __maybe_unused size
#if (PAGE_SIZE < 8192) #if (PAGE_SIZE < 8192)
truesize = ice_rx_pg_size(rx_ring) / 2; /* Must be power-of-2 */ truesize = ice_rx_pg_size(rx_ring) / 2; /* Must be power-of-2 */
#else #else
truesize = ice_rx_offset(rx_ring) ? truesize = rx_ring->rx_offset ?
SKB_DATA_ALIGN(ice_rx_offset(rx_ring) + size) + SKB_DATA_ALIGN(rx_ring->rx_offset + size) +
SKB_DATA_ALIGN(sizeof(struct skb_shared_info)) : SKB_DATA_ALIGN(sizeof(struct skb_shared_info)) :
SKB_DATA_ALIGN(size); SKB_DATA_ALIGN(size);
#endif #endif
...@@ -652,7 +653,7 @@ ice_alloc_mapped_page(struct ice_ring *rx_ring, struct ice_rx_buf *bi) ...@@ -652,7 +653,7 @@ ice_alloc_mapped_page(struct ice_ring *rx_ring, struct ice_rx_buf *bi)
bi->dma = dma; bi->dma = dma;
bi->page = page; bi->page = page;
bi->page_offset = ice_rx_offset(rx_ring); bi->page_offset = rx_ring->rx_offset;
page_ref_add(page, USHRT_MAX - 1); page_ref_add(page, USHRT_MAX - 1);
bi->pagecnt_bias = USHRT_MAX; bi->pagecnt_bias = USHRT_MAX;
...@@ -805,7 +806,7 @@ ice_add_rx_frag(struct ice_ring *rx_ring, struct ice_rx_buf *rx_buf, ...@@ -805,7 +806,7 @@ ice_add_rx_frag(struct ice_ring *rx_ring, struct ice_rx_buf *rx_buf,
struct sk_buff *skb, unsigned int size) struct sk_buff *skb, unsigned int size)
{ {
#if (PAGE_SIZE >= 8192) #if (PAGE_SIZE >= 8192)
unsigned int truesize = SKB_DATA_ALIGN(size + ice_rx_offset(rx_ring)); unsigned int truesize = SKB_DATA_ALIGN(size + rx_ring->rx_offset);
#else #else
unsigned int truesize = ice_rx_pg_size(rx_ring) / 2; unsigned int truesize = ice_rx_pg_size(rx_ring) / 2;
#endif #endif
...@@ -1071,6 +1072,7 @@ int ice_clean_rx_irq(struct ice_ring *rx_ring, int budget) ...@@ -1071,6 +1072,7 @@ int ice_clean_rx_irq(struct ice_ring *rx_ring, int budget)
{ {
unsigned int total_rx_bytes = 0, total_rx_pkts = 0, frame_sz = 0; unsigned int total_rx_bytes = 0, total_rx_pkts = 0, frame_sz = 0;
u16 cleaned_count = ICE_DESC_UNUSED(rx_ring); u16 cleaned_count = ICE_DESC_UNUSED(rx_ring);
unsigned int offset = rx_ring->rx_offset;
unsigned int xdp_res, xdp_xmit = 0; unsigned int xdp_res, xdp_xmit = 0;
struct sk_buff *skb = rx_ring->skb; struct sk_buff *skb = rx_ring->skb;
struct bpf_prog *xdp_prog = NULL; struct bpf_prog *xdp_prog = NULL;
...@@ -1085,7 +1087,6 @@ int ice_clean_rx_irq(struct ice_ring *rx_ring, int budget) ...@@ -1085,7 +1087,6 @@ int ice_clean_rx_irq(struct ice_ring *rx_ring, int budget)
/* start the loop to process Rx packets bounded by 'budget' */ /* start the loop to process Rx packets bounded by 'budget' */
while (likely(total_rx_pkts < (unsigned int)budget)) { while (likely(total_rx_pkts < (unsigned int)budget)) {
unsigned int offset = ice_rx_offset(rx_ring);
union ice_32b_rx_flex_desc *rx_desc; union ice_32b_rx_flex_desc *rx_desc;
struct ice_rx_buf *rx_buf; struct ice_rx_buf *rx_buf;
unsigned char *hard_start; unsigned char *hard_start;
......
...@@ -294,6 +294,7 @@ struct ice_ring { ...@@ -294,6 +294,7 @@ struct ice_ring {
struct rcu_head rcu; /* to avoid race on free */ struct rcu_head rcu; /* to avoid race on free */
struct bpf_prog *xdp_prog; struct bpf_prog *xdp_prog;
struct xsk_buff_pool *xsk_pool; struct xsk_buff_pool *xsk_pool;
u16 rx_offset;
/* CL3 - 3rd cacheline starts here */ /* CL3 - 3rd cacheline starts here */
struct xdp_rxq_info xdp_rxq; struct xdp_rxq_info xdp_rxq;
struct sk_buff *skb; struct sk_buff *skb;
......
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