Message ID | 20231223042210.102485-11-michael.chan@broadcom.com (mailing list archive) |
---|---|
State | Accepted |
Commit | 4faeadfd7ed67dc004d292bc3a9557f3c64fae9f |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | bnxt_en: Add basic ntuple filter support | expand |
On Fri, Dec 22, 2023 at 08:22:07PM -0800, Michael Chan wrote: > Refactor the logic into a new function bnxt_del_ntp_filters(). The > same call will be used when the user deletes an ntuple filter. > > The bnxt_hwrm_cfa_ntuple_filter_free() function to call fw to free > the ntuple filter is exported so that the ethtool logic can call it. > > Reviewed-by: Vasundhara Volam <vasundhara-v.volam@broadcom.com> > Reviewed-by: Andy Gospodarek <andrew.gospodarek@broadcom.com> > Reviewed-by: Pavan Chebbi <pavan.chebbi@broadcom.com> > Signed-off-by: Michael Chan <michael.chan@broadcom.com> Reviewed-by: Simon Horman <horms@kernel.org> ... > diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c ... > @@ -14011,6 +14011,21 @@ static int bnxt_rx_flow_steer(struct net_device *dev, const struct sk_buff *skb, > } > #endif > > +void bnxt_del_ntp_filter(struct bnxt *bp, struct bnxt_ntuple_filter *fltr) > +{ > + spin_lock_bh(&bp->ntp_fltr_lock); > + if (!test_and_clear_bit(BNXT_FLTR_INSERTED, &fltr->base.state)) { > + spin_unlock_bh(&bp->ntp_fltr_lock); > + return; > + } > + hlist_del_rcu(&fltr->base.hash); > + bp->ntp_fltr_count--; > + spin_unlock_bh(&bp->ntp_fltr_lock); > + bnxt_del_l2_filter(bp, fltr->l2_fltr); > + clear_bit(fltr->base.sw_id, bp->ntp_fltr_bmap); > + kfree_rcu(fltr, base.rcu); > +} > + > static void bnxt_cfg_ntp_filters(struct bnxt *bp) > { > int i; > @@ -14042,20 +14057,8 @@ static void bnxt_cfg_ntp_filters(struct bnxt *bp) > set_bit(BNXT_FLTR_VALID, &fltr->base.state); > } > > - if (del) { > - spin_lock_bh(&bp->ntp_fltr_lock); > - if (!test_and_clear_bit(BNXT_FLTR_INSERTED, &fltr->base.state)) { > - spin_unlock_bh(&bp->ntp_fltr_lock); > - continue; > - } > - hlist_del_rcu(&fltr->base.hash); > - bp->ntp_fltr_count--; > - spin_unlock_bh(&bp->ntp_fltr_lock); > - bnxt_del_l2_filter(bp, fltr->l2_fltr); > - synchronize_rcu(); Nice to see a use of synchronize_rcu() disappear :) > - clear_bit(fltr->base.sw_id, bp->ntp_fltr_bmap); > - kfree(fltr); > - } > + if (del) > + bnxt_del_ntp_filter(bp, fltr); > } > } > if (test_and_clear_bit(BNXT_HWRM_PF_UNLOAD_SP_EVENT, &bp->sp_event)) ...
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c index 1e5bf8b7dd55..79a1081c25f5 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c @@ -5609,8 +5609,8 @@ int bnxt_hwrm_l2_filter_alloc(struct bnxt *bp, struct bnxt_l2_filter *fltr) return rc; } -static int bnxt_hwrm_cfa_ntuple_filter_free(struct bnxt *bp, - struct bnxt_ntuple_filter *fltr) +int bnxt_hwrm_cfa_ntuple_filter_free(struct bnxt *bp, + struct bnxt_ntuple_filter *fltr) { struct hwrm_cfa_ntuple_filter_free_input *req; int rc; @@ -14011,6 +14011,21 @@ static int bnxt_rx_flow_steer(struct net_device *dev, const struct sk_buff *skb, } #endif +void bnxt_del_ntp_filter(struct bnxt *bp, struct bnxt_ntuple_filter *fltr) +{ + spin_lock_bh(&bp->ntp_fltr_lock); + if (!test_and_clear_bit(BNXT_FLTR_INSERTED, &fltr->base.state)) { + spin_unlock_bh(&bp->ntp_fltr_lock); + return; + } + hlist_del_rcu(&fltr->base.hash); + bp->ntp_fltr_count--; + spin_unlock_bh(&bp->ntp_fltr_lock); + bnxt_del_l2_filter(bp, fltr->l2_fltr); + clear_bit(fltr->base.sw_id, bp->ntp_fltr_bmap); + kfree_rcu(fltr, base.rcu); +} + static void bnxt_cfg_ntp_filters(struct bnxt *bp) { int i; @@ -14042,20 +14057,8 @@ static void bnxt_cfg_ntp_filters(struct bnxt *bp) set_bit(BNXT_FLTR_VALID, &fltr->base.state); } - if (del) { - spin_lock_bh(&bp->ntp_fltr_lock); - if (!test_and_clear_bit(BNXT_FLTR_INSERTED, &fltr->base.state)) { - spin_unlock_bh(&bp->ntp_fltr_lock); - continue; - } - hlist_del_rcu(&fltr->base.hash); - bp->ntp_fltr_count--; - spin_unlock_bh(&bp->ntp_fltr_lock); - bnxt_del_l2_filter(bp, fltr->l2_fltr); - synchronize_rcu(); - clear_bit(fltr->base.sw_id, bp->ntp_fltr_bmap); - kfree(fltr); - } + if (del) + bnxt_del_ntp_filter(bp, fltr); } } if (test_and_clear_bit(BNXT_HWRM_PF_UNLOAD_SP_EVENT, &bp->sp_event)) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethernet/broadcom/bnxt/bnxt.h index f37d98d7962a..60f62bc36d2c 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h @@ -2636,6 +2636,8 @@ int bnxt_hwrm_func_drv_unrgtr(struct bnxt *bp); void bnxt_del_l2_filter(struct bnxt *bp, struct bnxt_l2_filter *fltr); int bnxt_hwrm_l2_filter_free(struct bnxt *bp, struct bnxt_l2_filter *fltr); int bnxt_hwrm_l2_filter_alloc(struct bnxt *bp, struct bnxt_l2_filter *fltr); +int bnxt_hwrm_cfa_ntuple_filter_free(struct bnxt *bp, + struct bnxt_ntuple_filter *fltr); int bnxt_get_nr_rss_ctxs(struct bnxt *bp, int rx_rings); int bnxt_hwrm_vnic_cfg(struct bnxt *bp, u16 vnic_id); int __bnxt_hwrm_get_tx_rings(struct bnxt *bp, u16 fid, int *tx_rings); @@ -2685,6 +2687,7 @@ u32 bnxt_get_ntp_filter_idx(struct bnxt *bp, struct flow_keys *fkeys, const struct sk_buff *skb); int bnxt_insert_ntp_filter(struct bnxt *bp, struct bnxt_ntuple_filter *fltr, u32 idx); +void bnxt_del_ntp_filter(struct bnxt *bp, struct bnxt_ntuple_filter *fltr); int bnxt_get_max_rings(struct bnxt *, int *, int *, bool); int bnxt_restore_pf_fw_resources(struct bnxt *bp); int bnxt_get_port_parent_id(struct net_device *dev,