aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/marvell/prestera/prestera_flower.c
diff options
context:
space:
mode:
authorVolodymyr Mytnyk <vmytnyk@marvell.com>2022-02-18 11:39:49 +0200
committerDavid S. Miller <davem@davemloft.net>2022-02-19 16:22:03 +0000
commitb3ae2d350ddfd5aeb04de29c333d6639aeb1dae2 (patch)
tree2912839f8241f1067f107b04bb9ab60b0ed08e81 /drivers/net/ethernet/marvell/prestera/prestera_flower.c
parentbridge: switch br_net_exit to batch mode (diff)
downloadlinux-dev-b3ae2d350ddfd5aeb04de29c333d6639aeb1dae2.tar.xz
linux-dev-b3ae2d350ddfd5aeb04de29c333d6639aeb1dae2.zip
net: prestera: flower: fix destroy tmpl in chain
Fix flower destroy template callback to release template only for specific tc chain instead of all chain tempaltes. The issue was intruduced by previous commit that introduced multi-chain support. Fixes: fa5d824ce5dd ("net: prestera: acl: add multi-chain support offload") Signed-off-by: Volodymyr Mytnyk <vmytnyk@marvell.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to '')
-rw-r--r--drivers/net/ethernet/marvell/prestera/prestera_flower.c28
1 files changed, 19 insertions, 9 deletions
diff --git a/drivers/net/ethernet/marvell/prestera/prestera_flower.c b/drivers/net/ethernet/marvell/prestera/prestera_flower.c
index 580fb986496a..921959a980ee 100644
--- a/drivers/net/ethernet/marvell/prestera/prestera_flower.c
+++ b/drivers/net/ethernet/marvell/prestera/prestera_flower.c
@@ -12,18 +12,21 @@ struct prestera_flower_template {
u32 chain_index;
};
+static void
+prestera_flower_template_free(struct prestera_flower_template *template)
+{
+ prestera_acl_ruleset_put(template->ruleset);
+ list_del(&template->list);
+ kfree(template);
+}
+
void prestera_flower_template_cleanup(struct prestera_flow_block *block)
{
- struct prestera_flower_template *template;
- struct list_head *pos, *n;
+ struct prestera_flower_template *template, *tmp;
/* put the reference to all rulesets kept in tmpl create */
- list_for_each_safe(pos, n, &block->template_list) {
- template = list_entry(pos, typeof(*template), list);
- prestera_acl_ruleset_put(template->ruleset);
- list_del(&template->list);
- kfree(template);
- }
+ list_for_each_entry_safe(template, tmp, &block->template_list, list)
+ prestera_flower_template_free(template);
}
static int
@@ -423,7 +426,14 @@ err_malloc:
void prestera_flower_tmplt_destroy(struct prestera_flow_block *block,
struct flow_cls_offload *f)
{
- prestera_flower_template_cleanup(block);
+ struct prestera_flower_template *template, *tmp;
+
+ list_for_each_entry_safe(template, tmp, &block->template_list, list)
+ if (template->chain_index == f->common.chain_index) {
+ /* put the reference to the ruleset kept in create */
+ prestera_flower_template_free(template);
+ return;
+ }
}
int prestera_flower_stats(struct prestera_flow_block *block,