ice: update the number of available RSS queues
[ Upstream commit 0393e46ac48a6832b1011c233ebcef84f8dbe4f5 ] It was possible to have Rx queues that were not available for use by RSS. This would happen when increasing the number of Rx queues while there was a user defined RSS LUT. Always update the number of available RSS queues when changing the number of Rx queues. Fixes: 87324e747fde ("ice: Implement ethtool ops for channels") Signed-off-by: Henry Tieman <henry.w.tieman@intel.com> Tested-by: Tony Brelinski <tonyx.brelinski@intel.com> Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
70bcfea70f
commit
dd2d203f02
@ -3328,6 +3328,18 @@ ice_get_channels(struct net_device *dev, struct ethtool_channels *ch)
|
||||
ch->max_other = ch->other_count;
|
||||
}
|
||||
|
||||
/**
|
||||
* ice_get_valid_rss_size - return valid number of RSS queues
|
||||
* @hw: pointer to the HW structure
|
||||
* @new_size: requested RSS queues
|
||||
*/
|
||||
static int ice_get_valid_rss_size(struct ice_hw *hw, int new_size)
|
||||
{
|
||||
struct ice_hw_common_caps *caps = &hw->func_caps.common_cap;
|
||||
|
||||
return min_t(int, new_size, BIT(caps->rss_table_entry_width));
|
||||
}
|
||||
|
||||
/**
|
||||
* ice_vsi_set_dflt_rss_lut - set default RSS LUT with requested RSS size
|
||||
* @vsi: VSI to reconfigure RSS LUT on
|
||||
@ -3355,14 +3367,10 @@ static int ice_vsi_set_dflt_rss_lut(struct ice_vsi *vsi, int req_rss_size)
|
||||
return -ENOMEM;
|
||||
|
||||
/* set RSS LUT parameters */
|
||||
if (!test_bit(ICE_FLAG_RSS_ENA, pf->flags)) {
|
||||
if (!test_bit(ICE_FLAG_RSS_ENA, pf->flags))
|
||||
vsi->rss_size = 1;
|
||||
} else {
|
||||
struct ice_hw_common_caps *caps = &hw->func_caps.common_cap;
|
||||
|
||||
vsi->rss_size = min_t(int, req_rss_size,
|
||||
BIT(caps->rss_table_entry_width));
|
||||
}
|
||||
else
|
||||
vsi->rss_size = ice_get_valid_rss_size(hw, req_rss_size);
|
||||
|
||||
/* create/set RSS LUT */
|
||||
ice_fill_rss_lut(lut, vsi->rss_table_size, vsi->rss_size);
|
||||
@ -3441,9 +3449,12 @@ static int ice_set_channels(struct net_device *dev, struct ethtool_channels *ch)
|
||||
|
||||
ice_vsi_recfg_qs(vsi, new_rx, new_tx);
|
||||
|
||||
if (new_rx && !netif_is_rxfh_configured(dev))
|
||||
if (!netif_is_rxfh_configured(dev))
|
||||
return ice_vsi_set_dflt_rss_lut(vsi, new_rx);
|
||||
|
||||
/* Update rss_size due to change in Rx queues */
|
||||
vsi->rss_size = ice_get_valid_rss_size(&pf->hw, new_rx);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user