Message ID | 20231223042210.102485-7-michael.chan@broadcom.com (mailing list archive) |
---|---|
State | Accepted |
Commit | cb5bdd292dc01f42dd4ecebda203e2161a901c6f |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | bnxt_en: Add basic ntuple filter support | expand |
On Fri, Dec 22, 2023 at 08:22:03PM -0800, Michael Chan wrote: > Add the helper function to look up the ntuple filter from the > hash index and use it in bnxt_rx_flow_steer(). The helper function > will also be used by user defined ntuple filters in the next > patches. > > 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> > --- > drivers/net/ethernet/broadcom/bnxt/bnxt.c | 26 +++++++++++++++++------ > 1 file changed, 20 insertions(+), 6 deletions(-) > > diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c > index e9b382832a14..7027391316e5 100644 > --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c > +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c > @@ -13899,6 +13899,21 @@ static bool bnxt_fltr_match(struct bnxt_ntuple_filter *f1, > return false; > } > > +static struct bnxt_ntuple_filter * > +bnxt_lookup_ntp_filter_from_idx(struct bnxt *bp, > + struct bnxt_ntuple_filter *fltr, u32 idx) > +{ > + struct bnxt_ntuple_filter *f; > + struct hlist_head *head; > + > + head = &bp->ntp_fltr_hash_tbl[idx]; > + hlist_for_each_entry_rcu(f, head, base.hash) { > + if (bnxt_fltr_match(f, fltr)) > + return f; > + } > + return NULL; > +} > + > static int bnxt_rx_flow_steer(struct net_device *dev, const struct sk_buff *skb, > u16 rxq_index, u32 flow_id) > { > @@ -13963,12 +13978,11 @@ static int bnxt_rx_flow_steer(struct net_device *dev, const struct sk_buff *skb, > idx = bnxt_get_ntp_filter_idx(bp, fkeys, skb); > head = &bp->ntp_fltr_hash_tbl[idx]; > rcu_read_lock(); > - hlist_for_each_entry_rcu(fltr, head, base.hash) { > - if (bnxt_fltr_match(fltr, new_fltr)) { > - rc = fltr->base.sw_id; > - rcu_read_unlock(); > - goto err_free; > - } > + fltr = bnxt_lookup_ntp_filter_from_idx(bp, new_fltr, idx); > + if (fltr) { > + rcu_read_unlock(); > + rc = fltr->base.sw_id; Hi Michael, prior to this patch rc was set inside the RCU read-side critical section, now it is outside. Is that intentional? > + goto err_free; > } > rcu_read_unlock(); >
On Fri, Dec 22, 2023 at 08:22:03PM -0800, Michael Chan wrote: > Add the helper function to look up the ntuple filter from the > hash index and use it in bnxt_rx_flow_steer(). The helper function > will also be used by user defined ntuple filters in the next > patches. > > 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 index e9b382832a14..7027391316e5 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c @@ -13899,6 +13899,21 @@ static bool bnxt_fltr_match(struct bnxt_ntuple_filter *f1, return false; } +static struct bnxt_ntuple_filter * +bnxt_lookup_ntp_filter_from_idx(struct bnxt *bp, + struct bnxt_ntuple_filter *fltr, u32 idx) +{ + struct bnxt_ntuple_filter *f; + struct hlist_head *head; + + head = &bp->ntp_fltr_hash_tbl[idx]; + hlist_for_each_entry_rcu(f, head, base.hash) { + if (bnxt_fltr_match(f, fltr)) + return f; + } + return NULL; +} + static int bnxt_rx_flow_steer(struct net_device *dev, const struct sk_buff *skb, u16 rxq_index, u32 flow_id) { @@ -13963,12 +13978,11 @@ static int bnxt_rx_flow_steer(struct net_device *dev, const struct sk_buff *skb, idx = bnxt_get_ntp_filter_idx(bp, fkeys, skb); head = &bp->ntp_fltr_hash_tbl[idx]; rcu_read_lock(); - hlist_for_each_entry_rcu(fltr, head, base.hash) { - if (bnxt_fltr_match(fltr, new_fltr)) { - rc = fltr->base.sw_id; - rcu_read_unlock(); - goto err_free; - } + fltr = bnxt_lookup_ntp_filter_from_idx(bp, new_fltr, idx); + if (fltr) { + rcu_read_unlock(); + rc = fltr->base.sw_id; + goto err_free; } rcu_read_unlock();