Skip to content

Commit

Permalink
cls_matchall: use tcf_exts_get_net() before call_rcu()
Browse files Browse the repository at this point in the history
Hold netns refcnt before call_rcu() and release it after
the tcf_exts_destroy() is done.

Cc: Lucas Bates <[email protected]>
Cc: Jamal Hadi Salim <[email protected]>
Cc: Jiri Pirko <[email protected]>
Signed-off-by: Cong Wang <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
congwang authored and davem330 committed Nov 9, 2017
1 parent d5f984f commit 57767e7
Showing 1 changed file with 12 additions and 3 deletions.
15 changes: 12 additions & 3 deletions net/sched/cls_matchall.c
Original file line number Diff line number Diff line change
Expand Up @@ -44,13 +44,19 @@ static int mall_init(struct tcf_proto *tp)
return 0;
}

static void __mall_destroy(struct cls_mall_head *head)
{
tcf_exts_destroy(&head->exts);
tcf_exts_put_net(&head->exts);
kfree(head);
}

static void mall_destroy_work(struct work_struct *work)
{
struct cls_mall_head *head = container_of(work, struct cls_mall_head,
work);
rtnl_lock();
tcf_exts_destroy(&head->exts);
kfree(head);
__mall_destroy(head);
rtnl_unlock();
}

Expand Down Expand Up @@ -109,7 +115,10 @@ static void mall_destroy(struct tcf_proto *tp)
if (tc_should_offload(dev, head->flags))
mall_destroy_hw_filter(tp, head, (unsigned long) head);

call_rcu(&head->rcu, mall_destroy_rcu);
if (tcf_exts_get_net(&head->exts))
call_rcu(&head->rcu, mall_destroy_rcu);
else
__mall_destroy(head);
}

static void *mall_get(struct tcf_proto *tp, u32 handle)
Expand Down

0 comments on commit 57767e7

Please sign in to comment.