Message ID | 20230313203608.1680781-3-jesse.brandeburg@intel.com (mailing list archive) |
---|---|
State | Changes Requested |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | ice_switch fixes series | expand |
> -----Original Message----- > From: Intel-wired-lan <intel-wired-lan-bounces@osuosl.org> On Behalf Of Jesse > Brandeburg > Sent: Monday, March 13, 2023 9:36 PM > To: intel-wired-lan@lists.osuosl.org > Cc: netdev@vger.kernel.org; Brett Creeley <brett.creeley@intel.com>; > Brandeburg, Jesse <jesse.brandeburg@intel.com>; Malz, RobertX > <robertx.malz@intel.com> > Subject: [Intel-wired-lan] [PATCH net v1 2/2] ice: Fix ice_cfg_rdma_fltr() to only > update relevant fields > > From: Brett Creeley <brett.creeley@intel.com> > > The current implementation causes ice_vsi_update() to update all VSI fields > based on the cached VSI context. This also assumes that the > ICE_AQ_VSI_PROP_Q_OPT_VALID bit is set. This can cause problems if the VSI > context is not correctly synced by the driver. Fix this by only updating the fields > that correspond to ICE_AQ_VSI_PROP_Q_OPT_VALID. > Also, make sure to save the updated result in the cached VSI context on success. > > Fixes: 348048e724a0 ("ice: Implement iidc operations") > Co-developed-by: Robert Malz <robertx.malz@intel.com> > Signed-off-by: Robert Malz <robertx.malz@intel.com> > Signed-off-by: Brett Creeley <brett.creeley@intel.com> > Signed-off-by: Jesse Brandeburg <jesse.brandeburg@intel.com> > Reviewed-by: Piotr Raczynski <piotr.raczynski@intel.com> > --- > drivers/net/ethernet/intel/ice/ice_switch.c | 26 +++++++++++++++++---- > 1 file changed, 22 insertions(+), 4 deletions(-) > Tested-by: Jakub Andrysiak <jakub.andrysiak@intel.com>
diff --git a/drivers/net/ethernet/intel/ice/ice_switch.c b/drivers/net/ethernet/intel/ice/ice_switch.c index 61f844d22512..46b36851af46 100644 --- a/drivers/net/ethernet/intel/ice/ice_switch.c +++ b/drivers/net/ethernet/intel/ice/ice_switch.c @@ -1780,18 +1780,36 @@ ice_update_vsi(struct ice_hw *hw, u16 vsi_handle, struct ice_vsi_ctx *vsi_ctx, int ice_cfg_rdma_fltr(struct ice_hw *hw, u16 vsi_handle, bool enable) { - struct ice_vsi_ctx *ctx; + struct ice_vsi_ctx *ctx, *cached_ctx; + int status; + + cached_ctx = ice_get_vsi_ctx(hw, vsi_handle); + if (!cached_ctx) + return -ENOENT; - ctx = ice_get_vsi_ctx(hw, vsi_handle); + ctx = kzalloc(sizeof(*ctx), GFP_KERNEL); if (!ctx) - return -EIO; + return -ENOMEM; + + ctx->info.q_opt_rss = cached_ctx->info.q_opt_rss; + ctx->info.q_opt_tc = cached_ctx->info.q_opt_tc; + ctx->info.q_opt_flags = cached_ctx->info.q_opt_flags; + + ctx->info.valid_sections = cpu_to_le16(ICE_AQ_VSI_PROP_Q_OPT_VALID); if (enable) ctx->info.q_opt_flags |= ICE_AQ_VSI_Q_OPT_PE_FLTR_EN; else ctx->info.q_opt_flags &= ~ICE_AQ_VSI_Q_OPT_PE_FLTR_EN; - return ice_update_vsi(hw, vsi_handle, ctx, NULL); + status = ice_update_vsi(hw, vsi_handle, ctx, NULL); + if (!status) { + cached_ctx->info.q_opt_flags = ctx->info.q_opt_flags; + cached_ctx->info.valid_sections |= ctx->info.valid_sections; + } + + kfree(ctx); + return status; } /**