> -----Original Message----- > From: Intel-wired-lan <[email protected]> On Behalf > Of [email protected] > Sent: Thursday, November 6, 2025 4:03 PM > To: Nguyen, Anthony L <[email protected]>; Kitszel, > Przemyslaw <[email protected]>; [email protected]; > [email protected]; [email protected]; [email protected]; > [email protected] > Cc: [email protected]; [email protected]; linux- > [email protected]; Gregory Herrero <[email protected]> > Subject: [Intel-wired-lan] [PATCH] i40e: validate ring_len parameter > against hardware specific values. “hardware specific” → “hardware‑specific”
> > From: Gregory Herrero <[email protected]> > > The maximum number of descriptors supported by the hardware is > hardware dependent and can be retrieved using > i40e_get_max_num_descriptors(). > Move this function to a shared header and use it when checking for > valid ring_len parameter rather than using hardcoded value. > Cast info->ring_len to u32 in i40e_config_vsi_tx_queue() as it's u16 > in struct virtchnl_txq_info. > Also cast it in i40e_config_vsi_rx_queue() even if it's u32 in > virtchnl_rxq_info to ease stable backport in case this changed. > > Fixes: 55d225670def ("i40e: add validation for ring_len param") > Signed-off-by: Gregory Herrero <[email protected]> > --- > drivers/net/ethernet/intel/i40e/i40e.h | 18 > ++++++++++++++++++ > drivers/net/ethernet/intel/i40e/i40e_ethtool.c | 12 ------------ > .../net/ethernet/intel/i40e/i40e_virtchnl_pf.c | 4 ++-- > 3 files changed, 20 insertions(+), 14 deletions(-) > > diff --git a/drivers/net/ethernet/intel/i40e/i40e.h > b/drivers/net/ethernet/intel/i40e/i40e.h > index 801a57a925da..0e697375fcaf 100644 > --- a/drivers/net/ethernet/intel/i40e/i40e.h > +++ b/drivers/net/ethernet/intel/i40e/i40e.h > @@ -1418,4 +1418,22 @@ static inline struct i40e_veb > *i40e_pf_get_main_veb(struct i40e_pf *pf) > return (pf->lan_veb != I40E_NO_VEB) ? pf->veb[pf->lan_veb] : > NULL; } > > +/** > + * i40e_get_max_num_descriptors - get maximum descriptors number for > this hardware. > + * @pf: pointer to a PF > + * > + * Return: u32 value corresponding to maximum descriptors number. > + **/ “maximum descriptors number” → “maximum number of descriptors” " **/” → “ */ > +static inline u32 i40e_get_max_num_descriptors(struct i40e_pf *pf) { Nit: kernel coding style Please follow standard kernel style for function definitions: - The opening brace must be on its own line, not after the prototype. - static inline is fine here, but keep spacing consistent. - Also consider marking the argument const if the function does not modify pf. So instead of: static inline u32 i40e_get_max_num_descriptors(struct i40e_pf *pf) { use: static inline u32 i40e_get_max_num_descriptors(const struct i40e_pf *pf) { See: https://docs.kernel.org/process/coding-style.html section on function definitions. > + struct i40e_hw *hw = &pf->hw; > + > + switch (hw->mac.type) { > + case I40E_MAC_XL710: > + return I40E_MAX_NUM_DESCRIPTORS_XL710; > + default: > + return I40E_MAX_NUM_DESCRIPTORS; > + } > +} > + > #endif /* _I40E_H_ */ > diff --git a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c > b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c > index 86c72596617a..61c39e881b00 100644 > --- a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c > +++ b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c > @@ -2013,18 +2013,6 @@ static void i40e_get_drvinfo(struct net_device > *netdev, > drvinfo->n_priv_flags += I40E_GL_PRIV_FLAGS_STR_LEN; } > > -static u32 i40e_get_max_num_descriptors(struct i40e_pf *pf) -{ > - struct i40e_hw *hw = &pf->hw; > - > - switch (hw->mac.type) { > - case I40E_MAC_XL710: > - return I40E_MAX_NUM_DESCRIPTORS_XL710; > - default: > - return I40E_MAX_NUM_DESCRIPTORS; > - } > -} > - > static void i40e_get_ringparam(struct net_device *netdev, > struct ethtool_ringparam *ring, > struct kernel_ethtool_ringparam > *kernel_ring, diff --git > a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c > b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c > index 081a4526a2f0..5e058159057b 100644 > --- a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c > +++ b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c > @@ -656,7 +656,7 @@ static int i40e_config_vsi_tx_queue(struct i40e_vf > *vf, u16 vsi_id, > > /* ring_len has to be multiple of 8 */ > if (!IS_ALIGNED(info->ring_len, 8) || > - info->ring_len > I40E_MAX_NUM_DESCRIPTORS_XL710) { > + (u32)info->ring_len > i40e_get_max_num_descriptors(pf)) { > ret = -EINVAL; > goto error_context; > } > @@ -726,7 +726,7 @@ static int i40e_config_vsi_rx_queue(struct i40e_vf > *vf, u16 vsi_id, > > /* ring_len has to be multiple of 32 */ > if (!IS_ALIGNED(info->ring_len, 32) || > - info->ring_len > I40E_MAX_NUM_DESCRIPTORS_XL710) { > + (u32)info->ring_len > i40e_get_max_num_descriptors(pf)) { > ret = -EINVAL; > goto error_param; > } > -- > 2.51.0 Behavior change / potential regression: This switches validation from a hard‑coded XL710 maximum to the per‑MAC maximum. That will tighten the limit on non‑XL710 controllers and can reject ring_len values that previously passed validation. Please call this out in the commit message so users understand the change (it fixes an over‑acceptance issue). Return codes / logging: -EINVAL is fine for invalid virtchnl parameters; please keep it silent (no dmesg) to avoid log spam from misconfigured VFs. With the best regards Alex
