Commit 096e914f authored by Arkadi Sharshevsky's avatar Arkadi Sharshevsky Committed by David S. Miller

mlxsw: spectrum: Add support for direct rule access

Currently the ACL rules can be accessed only by hashing. In order to
dump the activity the rules are also placed in a list.
Signed-off-by: default avatarArkadi Sharshevsky <arkadis@mellanox.com>
Reviewed-by: default avatarIdo Schimmel <idosch@mellanox.com>
Signed-off-by: default avatarJiri Pirko <jiri@mellanox.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 7fd056c2
...@@ -54,6 +54,7 @@ struct mlxsw_sp_acl { ...@@ -54,6 +54,7 @@ struct mlxsw_sp_acl {
struct mlxsw_afa *afa; struct mlxsw_afa *afa;
const struct mlxsw_sp_acl_ops *ops; const struct mlxsw_sp_acl_ops *ops;
struct rhashtable ruleset_ht; struct rhashtable ruleset_ht;
struct list_head rules;
unsigned long priv[0]; unsigned long priv[0];
/* priv has to be always the last item */ /* priv has to be always the last item */
}; };
...@@ -80,6 +81,7 @@ struct mlxsw_sp_acl_ruleset { ...@@ -80,6 +81,7 @@ struct mlxsw_sp_acl_ruleset {
struct mlxsw_sp_acl_rule { struct mlxsw_sp_acl_rule {
struct rhash_head ht_node; /* Member of rule HT */ struct rhash_head ht_node; /* Member of rule HT */
struct list_head list;
unsigned long cookie; /* HT key */ unsigned long cookie; /* HT key */
struct mlxsw_sp_acl_ruleset *ruleset; struct mlxsw_sp_acl_ruleset *ruleset;
struct mlxsw_sp_acl_rule_info *rulei; struct mlxsw_sp_acl_rule_info *rulei;
...@@ -422,6 +424,7 @@ int mlxsw_sp_acl_rule_add(struct mlxsw_sp *mlxsw_sp, ...@@ -422,6 +424,7 @@ int mlxsw_sp_acl_rule_add(struct mlxsw_sp *mlxsw_sp,
if (err) if (err)
goto err_rhashtable_insert; goto err_rhashtable_insert;
list_add_tail(&rule->list, &mlxsw_sp->acl->rules);
return 0; return 0;
err_rhashtable_insert: err_rhashtable_insert:
...@@ -435,6 +438,7 @@ void mlxsw_sp_acl_rule_del(struct mlxsw_sp *mlxsw_sp, ...@@ -435,6 +438,7 @@ void mlxsw_sp_acl_rule_del(struct mlxsw_sp *mlxsw_sp,
struct mlxsw_sp_acl_ruleset *ruleset = rule->ruleset; struct mlxsw_sp_acl_ruleset *ruleset = rule->ruleset;
const struct mlxsw_sp_acl_profile_ops *ops = ruleset->ht_key.ops; const struct mlxsw_sp_acl_profile_ops *ops = ruleset->ht_key.ops;
list_del(&rule->list);
rhashtable_remove_fast(&ruleset->rule_ht, &rule->ht_node, rhashtable_remove_fast(&ruleset->rule_ht, &rule->ht_node,
mlxsw_sp_acl_rule_ht_params); mlxsw_sp_acl_rule_ht_params);
ops->rule_del(mlxsw_sp, rule->priv); ops->rule_del(mlxsw_sp, rule->priv);
...@@ -570,6 +574,7 @@ int mlxsw_sp_acl_init(struct mlxsw_sp *mlxsw_sp) ...@@ -570,6 +574,7 @@ int mlxsw_sp_acl_init(struct mlxsw_sp *mlxsw_sp)
if (err) if (err)
goto err_rhashtable_init; goto err_rhashtable_init;
INIT_LIST_HEAD(&acl->rules);
err = acl_ops->init(mlxsw_sp, acl->priv); err = acl_ops->init(mlxsw_sp, acl->priv);
if (err) if (err)
goto err_acl_ops_init; goto err_acl_ops_init;
...@@ -594,6 +599,7 @@ void mlxsw_sp_acl_fini(struct mlxsw_sp *mlxsw_sp) ...@@ -594,6 +599,7 @@ void mlxsw_sp_acl_fini(struct mlxsw_sp *mlxsw_sp)
const struct mlxsw_sp_acl_ops *acl_ops = acl->ops; const struct mlxsw_sp_acl_ops *acl_ops = acl->ops;
acl_ops->fini(mlxsw_sp, acl->priv); acl_ops->fini(mlxsw_sp, acl->priv);
WARN_ON(!list_empty(&acl->rules));
rhashtable_destroy(&acl->ruleset_ht); rhashtable_destroy(&acl->ruleset_ht);
mlxsw_afa_destroy(acl->afa); mlxsw_afa_destroy(acl->afa);
mlxsw_afk_destroy(acl->afk); mlxsw_afk_destroy(acl->afk);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment