octeontx2-af: Avoid duplicate unicast rule in mcam_rules list
A mcam rule described by mcam_rule struct has all the info such as the hardware MCAM entry number, match criteria and corresponding action etc. All mcam rules are stored in a linked list mcam->rules. When adding/updating a rule to the mcam->rules it is checked if a rule already exists for the mcam entry. If the rule already exists, the same rule is updated instead of creating new rule. This way only one mcam_rule exists for the only one default unicast entry installed by AF. But a PF/VF can get different NIXLF (or default unicast entry number) after a attach-detach-attach sequence. When that happens mcam_rules list end up with two default unicast rules. Fix the problem by deleting the default unicast rule list node always when disabling mcam rules. Signed-off-by: Subbaraya Sundeep <sbhatta@marvell.com> Signed-off-by: Naveen Mamindlapalli <naveenm@marvell.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
56bcef528b
commit
b6b0e3667e
|
@ -3637,9 +3637,7 @@ int rvu_mbox_handler_nix_lf_stop_rx(struct rvu *rvu, struct msg_req *req,
|
|||
if (err)
|
||||
return err;
|
||||
|
||||
rvu_npc_disable_default_entries(rvu, pcifunc, nixlf);
|
||||
|
||||
npc_mcam_disable_flows(rvu, pcifunc);
|
||||
rvu_npc_disable_mcam_entries(rvu, pcifunc, nixlf);
|
||||
|
||||
return rvu_cgx_start_stop_io(rvu, pcifunc, false);
|
||||
}
|
||||
|
|
|
@ -988,7 +988,7 @@ void rvu_npc_disable_mcam_entries(struct rvu *rvu, u16 pcifunc, int nixlf)
|
|||
{
|
||||
struct rvu_pfvf *pfvf = rvu_get_pfvf(rvu, pcifunc);
|
||||
struct npc_mcam *mcam = &rvu->hw->mcam;
|
||||
struct rvu_npc_mcam_rule *rule;
|
||||
struct rvu_npc_mcam_rule *rule, *tmp;
|
||||
int blkaddr;
|
||||
|
||||
blkaddr = rvu_get_blkaddr(rvu, BLKTYPE_NPC, 0);
|
||||
|
@ -998,15 +998,18 @@ void rvu_npc_disable_mcam_entries(struct rvu *rvu, u16 pcifunc, int nixlf)
|
|||
mutex_lock(&mcam->lock);
|
||||
|
||||
/* Disable MCAM entries directing traffic to this 'pcifunc' */
|
||||
list_for_each_entry(rule, &mcam->mcam_rules, list) {
|
||||
list_for_each_entry_safe(rule, tmp, &mcam->mcam_rules, list) {
|
||||
if (is_npc_intf_rx(rule->intf) &&
|
||||
rule->rx_action.pf_func == pcifunc) {
|
||||
npc_enable_mcam_entry(rvu, mcam, blkaddr,
|
||||
rule->entry, false);
|
||||
rule->enable = false;
|
||||
/* Indicate that default rule is disabled */
|
||||
if (rule->default_rule)
|
||||
if (rule->default_rule) {
|
||||
pfvf->def_ucast_rule = NULL;
|
||||
list_del(&rule->list);
|
||||
kfree(rule);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue