From: Mohammad Heib <[email protected]>

The ATR sample rate is currently stored per-ring and initialized when each
TX ring is configured. Since the sample rate is a global policy that
applies uniformly across all rings, it makes more sense to store it at
the PF level.

Move atr_sample_rate from struct i40e_ring to struct i40e_pf and initialize
it once during i40e_sw_init(). Update i40e_atr() to reference the PF-level
field. Change atr_count from u8 to u32 to match the sample rate type.

Signed-off-by: Mohammad Heib <[email protected]>
---
 drivers/net/ethernet/intel/i40e/i40e.h      | 1 +
 drivers/net/ethernet/intel/i40e/i40e_main.c | 9 +++------
 drivers/net/ethernet/intel/i40e/i40e_txrx.c | 4 ++--
 drivers/net/ethernet/intel/i40e/i40e_txrx.h | 3 +--
 4 files changed, 7 insertions(+), 10 deletions(-)

diff --git a/drivers/net/ethernet/intel/i40e/i40e.h 
b/drivers/net/ethernet/intel/i40e/i40e.h
index 1b6a8fbaa648..88eb40ee45f0 100644
--- a/drivers/net/ethernet/intel/i40e/i40e.h
+++ b/drivers/net/ethernet/intel/i40e/i40e.h
@@ -487,6 +487,7 @@ struct i40e_pf {
        u16 rss_size_max;          /* HW defined max RSS queues */
        u16 fdir_pf_filter_count;  /* num of guaranteed filters for this PF */
        u16 num_alloc_vsi;         /* num VSIs this driver supports */
+       u32 atr_sample_rate;
        bool wol_en;
 
        struct hlist_head fdir_filter_list;
diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c 
b/drivers/net/ethernet/intel/i40e/i40e_main.c
index 1fb86bd1af8e..3834af6c09be 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_main.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_main.c
@@ -3457,12 +3457,7 @@ static int i40e_configure_tx_ring(struct i40e_ring *ring)
                ring->xsk_pool = i40e_xsk_pool(ring);
 
        /* some ATR related tx ring init */
-       if (test_bit(I40E_FLAG_FD_ATR_ENA, vsi->back->flags)) {
-               ring->atr_sample_rate = I40E_DEFAULT_ATR_SAMPLE_RATE;
-               ring->atr_count = 0;
-       } else {
-               ring->atr_sample_rate = 0;
-       }
+       ring->atr_count = 0;
 
        /* configure XPS */
        i40e_config_xps_tx_ring(ring);
@@ -12745,6 +12740,8 @@ static int i40e_sw_init(struct i40e_pf *pf)
                }
        }
 
+       pf->atr_sample_rate = I40E_DEFAULT_ATR_SAMPLE_RATE;
+
        if ((pf->hw.func_caps.fd_filters_guaranteed > 0) ||
            (pf->hw.func_caps.fd_filters_best_effort > 0)) {
                set_bit(I40E_FLAG_FD_ATR_ENA, pf->flags);
diff --git a/drivers/net/ethernet/intel/i40e/i40e_txrx.c 
b/drivers/net/ethernet/intel/i40e/i40e_txrx.c
index 61525ab7d21e..da94cb2ce94d 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_txrx.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_txrx.c
@@ -2882,7 +2882,7 @@ static void i40e_atr(struct i40e_ring *tx_ring, struct 
sk_buff *skb,
                return;
 
        /* if sampling is disabled do nothing */
-       if (!tx_ring->atr_sample_rate)
+       if (!pf->atr_sample_rate)
                return;
 
        /* Currently only IPv4/IPv6 with TCP is supported */
@@ -2934,7 +2934,7 @@ static void i40e_atr(struct i40e_ring *tx_ring, struct 
sk_buff *skb,
        if (!th->fin &&
            !th->syn &&
            !th->rst &&
-           (tx_ring->atr_count < tx_ring->atr_sample_rate))
+           (tx_ring->atr_count < pf->atr_sample_rate))
                return;
 
        tx_ring->atr_count = 0;
diff --git a/drivers/net/ethernet/intel/i40e/i40e_txrx.h 
b/drivers/net/ethernet/intel/i40e/i40e_txrx.h
index bb741ff3e5f2..be587f804e7a 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_txrx.h
+++ b/drivers/net/ethernet/intel/i40e/i40e_txrx.h
@@ -372,8 +372,7 @@ struct i40e_ring {
        u16 next_to_clean;
        u16 xdp_tx_active;
 
-       u8 atr_sample_rate;
-       u8 atr_count;
+       u32 atr_count;
 
        bool ring_active;               /* is ring online or not */
        bool arm_wb;            /* do something to arm write back */
-- 
2.53.0

Reply via email to