* [PATCH v2 net 1/1] net sched actions: fix GETing actions
@ 2016-09-12 10:21 Jamal Hadi Salim
2016-09-12 17:18 ` Cong Wang
2016-09-14 16:32 ` Cong Wang
0 siblings, 2 replies; 4+ messages in thread
From: Jamal Hadi Salim @ 2016-09-12 10:21 UTC (permalink / raw)
To: davem; +Cc: xiyou.wangcong, netdev, Jamal Hadi Salim
From: Jamal Hadi Salim <jhs@mojatatu.com>
With the batch changes that translated transient actions into
a temporary list we lost in the translation the fact that
tcf_action_destroy() will eventually delete the action from
the permanent location if the refcount is zero.
Example of what broke:
...add a gact action to drop
sudo $TC actions add action drop index 10
...now retrieve it, looks good
sudo $TC actions get action gact index 10
...retrieve it again and find it is gone!
sudo $TC actions get action gact index 10
Fixes:
22dc13c837c3 ("net_sched: convert tcf_exts from list to pointer array"),
824a7e8863b3 ("net_sched: remove an unnecessary list_del()")
f07fed82ad79 ("net_sched: remove the leftover cleanup_a()")
Signed-off-by: Jamal Hadi Salim <jhs@mojatatu.com>
---
net/sched/act_api.c | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
diff --git a/net/sched/act_api.c b/net/sched/act_api.c
index d09d068..63b8167 100644
--- a/net/sched/act_api.c
+++ b/net/sched/act_api.c
@@ -592,6 +592,16 @@ err_out:
return ERR_PTR(err);
}
+static void cleanup_a(struct list_head *actions, int ovr)
+{
+ struct tc_action *a, *tmp;
+
+ list_for_each_entry_safe(a, tmp, actions, list) {
+ if (ovr)
+ a->tcfa_refcnt-=1;
+ }
+}
+
int tcf_action_init(struct net *net, struct nlattr *nla,
struct nlattr *est, char *name, int ovr,
int bind, struct list_head *actions)
@@ -612,8 +622,15 @@ int tcf_action_init(struct net *net, struct nlattr *nla,
goto err;
}
act->order = i;
+ if (ovr)
+ act->tcfa_refcnt+=1;
list_add_tail(&act->list, actions);
}
+
+ /* Remove the temp refcnt which was necessary to protect against
+ * destroying an existing action which was being replaced
+ */
+ cleanup_a(actions, ovr);
return 0;
err:
@@ -883,6 +900,8 @@ tca_action_gd(struct net *net, struct nlattr *nla, struct nlmsghdr *n,
goto err;
}
act->order = i;
+ if (event == RTM_GETACTION)
+ act->tcfa_refcnt+=1;
list_add_tail(&act->list, &actions);
}
--
1.9.1
^ permalink raw reply related [flat|nested] 4+ messages in thread* Re: [PATCH v2 net 1/1] net sched actions: fix GETing actions
2016-09-12 10:21 [PATCH v2 net 1/1] net sched actions: fix GETing actions Jamal Hadi Salim
@ 2016-09-12 17:18 ` Cong Wang
2016-09-12 20:51 ` Jamal Hadi Salim
2016-09-14 16:32 ` Cong Wang
1 sibling, 1 reply; 4+ messages in thread
From: Cong Wang @ 2016-09-12 17:18 UTC (permalink / raw)
To: Jamal Hadi Salim; +Cc: David Miller, Linux Kernel Network Developers
On Mon, Sep 12, 2016 at 3:21 AM, Jamal Hadi Salim <jhs@mojatatu.com> wrote:
> From: Jamal Hadi Salim <jhs@mojatatu.com>
>
> With the batch changes that translated transient actions into
> a temporary list we lost in the translation the fact that
> tcf_action_destroy() will eventually delete the action from
> the permanent location if the refcount is zero.
>
> Example of what broke:
> ...add a gact action to drop
> sudo $TC actions add action drop index 10
> ...now retrieve it, looks good
> sudo $TC actions get action gact index 10
> ...retrieve it again and find it is gone!
> sudo $TC actions get action gact index 10
>
> Fixes:
> 22dc13c837c3 ("net_sched: convert tcf_exts from list to pointer array"),
> 824a7e8863b3 ("net_sched: remove an unnecessary list_del()")
> f07fed82ad79 ("net_sched: remove the leftover cleanup_a()")
>
> Signed-off-by: Jamal Hadi Salim <jhs@mojatatu.com>
> ---
> net/sched/act_api.c | 19 +++++++++++++++++++
> 1 file changed, 19 insertions(+)
>
> diff --git a/net/sched/act_api.c b/net/sched/act_api.c
> index d09d068..63b8167 100644
> --- a/net/sched/act_api.c
> +++ b/net/sched/act_api.c
> @@ -592,6 +592,16 @@ err_out:
> return ERR_PTR(err);
> }
>
> +static void cleanup_a(struct list_head *actions, int ovr)
> +{
> + struct tc_action *a, *tmp;
> +
> + list_for_each_entry_safe(a, tmp, actions, list) {
No need the safe version.
> + if (ovr)
> + a->tcfa_refcnt-=1;
How about tcfa_bindcnt?
I hate to point out coding style issue, but since you need to update
the patch anyway, please add two spaces surround '-='.
I think checkpatch.pl should be able to catch this.
> + }
> +}
> +
> int tcf_action_init(struct net *net, struct nlattr *nla,
> struct nlattr *est, char *name, int ovr,
> int bind, struct list_head *actions)
> @@ -612,8 +622,15 @@ int tcf_action_init(struct net *net, struct nlattr *nla,
> goto err;
> }
> act->order = i;
> + if (ovr)
Need to check this boolean? It looks like we need this for !ovr case too?
> + act->tcfa_refcnt+=1;
Ditto for coding style.
> list_add_tail(&act->list, actions);
> }
> +
> + /* Remove the temp refcnt which was necessary to protect against
> + * destroying an existing action which was being replaced
> + */
> + cleanup_a(actions, ovr);
> return 0;
>
> err:
> @@ -883,6 +900,8 @@ tca_action_gd(struct net *net, struct nlattr *nla, struct nlmsghdr *n,
> goto err;
> }
> act->order = i;
> + if (event == RTM_GETACTION)
> + act->tcfa_refcnt+=1;
Ditto.
> list_add_tail(&act->list, &actions);
> }
>
Thanks.
^ permalink raw reply [flat|nested] 4+ messages in thread* Re: [PATCH v2 net 1/1] net sched actions: fix GETing actions
2016-09-12 17:18 ` Cong Wang
@ 2016-09-12 20:51 ` Jamal Hadi Salim
0 siblings, 0 replies; 4+ messages in thread
From: Jamal Hadi Salim @ 2016-09-12 20:51 UTC (permalink / raw)
To: Cong Wang; +Cc: David Miller, Linux Kernel Network Developers
On 16-09-12 01:18 PM, Cong Wang wrote:
> On Mon, Sep 12, 2016 at 3:21 AM, Jamal Hadi Salim <jhs@mojatatu.com> wrote:
>> + if (ovr)
>> + a->tcfa_refcnt-=1;
>
> How about tcfa_bindcnt?
We dont touch it when mucking around only with actions (as is in
this case).
>> + }
>> +}
>> +
>> int tcf_action_init(struct net *net, struct nlattr *nla,
>> struct nlattr *est, char *name, int ovr,
>> int bind, struct list_head *actions)
>> @@ -612,8 +622,15 @@ int tcf_action_init(struct net *net, struct nlattr *nla,
>> goto err;
>> }
>> act->order = i;
>> + if (ovr)
>
> Need to check this boolean? It looks like we need this for !ovr case too?
>
They are fine if they didnt exist.
I will fix the coding style issues and submit.
cheers,
jamal
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH v2 net 1/1] net sched actions: fix GETing actions
2016-09-12 10:21 [PATCH v2 net 1/1] net sched actions: fix GETing actions Jamal Hadi Salim
2016-09-12 17:18 ` Cong Wang
@ 2016-09-14 16:32 ` Cong Wang
1 sibling, 0 replies; 4+ messages in thread
From: Cong Wang @ 2016-09-14 16:32 UTC (permalink / raw)
To: Jamal Hadi Salim; +Cc: David Miller, Linux Kernel Network Developers
On Mon, Sep 12, 2016 at 3:21 AM, Jamal Hadi Salim <jhs@mojatatu.com> wrote:
> From: Jamal Hadi Salim <jhs@mojatatu.com>
>
> With the batch changes that translated transient actions into
> a temporary list we lost in the translation the fact that
> tcf_action_destroy() will eventually delete the action from
> the permanent location if the refcount is zero.
>
> Example of what broke:
> ...add a gact action to drop
> sudo $TC actions add action drop index 10
> ...now retrieve it, looks good
> sudo $TC actions get action gact index 10
> ...retrieve it again and find it is gone!
> sudo $TC actions get action gact index 10
>
> Fixes:
> 22dc13c837c3 ("net_sched: convert tcf_exts from list to pointer array"),
> 824a7e8863b3 ("net_sched: remove an unnecessary list_del()")
> f07fed82ad79 ("net_sched: remove the leftover cleanup_a()")
>
> Signed-off-by: Jamal Hadi Salim <jhs@mojatatu.com>
Maybe the changelog/comment needs slightly improved,
but that is a very minor issue. So,
Acked-by: Cong Wang <xiyou.wangcong@gmail.com>
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2016-09-14 16:32 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-09-12 10:21 [PATCH v2 net 1/1] net sched actions: fix GETing actions Jamal Hadi Salim
2016-09-12 17:18 ` Cong Wang
2016-09-12 20:51 ` Jamal Hadi Salim
2016-09-14 16:32 ` Cong Wang
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox