Hi Simon
Thank you for the review.
On 7/8/26 5:36 PM, Simon Horman wrote:
This is an AI-generated review of your patch. The human sending this
email has considered the AI review valid, or at least plausible.
Full review at: https://sashiko.dev
---
i40e: move ATR sample rate from ring to PF level
This commit moves the ATR sample rate configuration from the per-ring level
to the PF level. It initializes the sample rate globally during software init
and updates the fast path to reference the PF structure.
diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c
b/drivers/net/ethernet/intel/i40e/i40e_main.c
index a04683004a567..4d4d4b07a0f3a 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_main.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_main.c
[ ... ]
@@ -3454,12 +3454,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;
[Severity: High]
Does removing this per-ring initialization remove the protection against
dynamic ethtool flag toggles?
Previously, if the ring was configured while Flow Director ATR was disabled,
the ring's sample rate was cached to 0 in i40e_configure_tx_ring(). This
prevented descriptor injection even if the PF flag was later toggled on
without a ring reset.
The per-ring zeroing of atr_sample_rate was redundant. i40e_atr()
already checks I40E_FLAG_FD_ATR_ENA before it ever looks at atr_sample_rate:
/* make sure ATR is enabled */
if (!test_bit(I40E_FLAG_FD_ATR_ENA, pf->flags))
return;
if (test_bit(__I40E_FD_ATR_AUTO_DISABLED, pf->state))
return;
/* if sampling is disabled do nothing */
if (!pf->atr_sample_rate)
return;
When ATR is disabled via ethtool private flags, the function bails out
at the I40E_FLAG_FD_ATR_ENA check regardless of what atr_sample_rate is
set to. The flag check is the real protection the per-ring sample rate
cache was never the thing providing protection against dynamic toggling.
[ ... ]
diff --git a/drivers/net/ethernet/intel/i40e/i40e_txrx.c
b/drivers/net/ethernet/intel/i40e/i40e_txrx.c
index 894f2d06d39d0..b36e0fc9b31d2 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_txrx.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_txrx.c
[ ... ]
@@ -2879,7 +2879,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;
[Severity: High]
Can this global check lead to a hardware Malicious Driver Detection (MDD)
event if ethtool flags are modified dynamically?
If an administrator performs the following sequence:
1. Disables flow-director-atr via ethtool.
2. Disables ntuple (which resets the ring and sets tx_ctx.fd_ena = 0).
3. Re-enables flow-director-atr.
The final step does not trigger a ring reset, so fd_ena remains 0 in the
hardware queue context.
However, I40E_FLAG_FD_ATR_ENA is now true, and pf->atr_sample_rate is
globally set to a non-zero value.
Will i40e_atr() now proceed and inject FDIR descriptors into a TX queue
that is not configured for FDIR?
If so, does this cause the hardware to trigger an MDD event and hang the
TX queue?
The scenario you described was already broken before this patch, walking
through the old code with the same sequence:
1. Disable ATR — flag cleared, __I40E_FD_ATR_AUTO_DISABLED set
2. Disable ntuple — ring reset happens, i40e_configure_tx_ring() runs
with ATR off, so ring->atr_sample_rate = 0 and fd_ena = 0
3. Re-enable ATR — flag set, no ring reset
In the old code, ring->atr_sample_rate is stuck at 0 from step 2, so
i40e_atr() bails out at the sample rate check. That avoids the fd_ena
problem, but ATR is also silently non-functional
— the user re-enabled it but it doesn't actually work until something
triggers a ring reset.
This patch changes how that failure looks, instead of silently doing
nothing, pf->atr_sample_rate is non-zero so i40e_atr() would proceed
but the root cause is the same:
toggling ATR via ethtool private flags doesn't trigger a ring reset, so
fd_ena can be stale.
Properly fixing this would mean triggering a reset when ATR is
re-enabled. The reset calls i40e_configure_tx_ring(), which re-evaluates
fd_ena based on the current flag state so fd_ena would be set to 1 since
I40E_FLAG_FD_ATR_ENA is now on.
What do you think about addressing this as a follow-up patch on top of
this series? Since it's a pre-existing issue, it feels like it belongs
as a separate fix rather than being mixed into this refactor.