net_sched: act: clean up tca_action_flush()
authorWANG Cong <xiyou.wangcong@gmail.com>
Wed, 12 Feb 2014 01:07:35 +0000 (17:07 -0800)
committerDavid S. Miller <davem@davemloft.net>
Thu, 13 Feb 2014 00:23:32 +0000 (19:23 -0500)
We could allocate tc_action on stack in tca_action_flush(),
since it is not large.

Also, we could use create_a() in tcf_action_get_1().

Cc: Jamal Hadi Salim <jhs@mojatatu.com>
Cc: David S. Miller <davem@davemloft.net>
Signed-off-by: Cong Wang <xiyou.wangcong@gmail.com>
Signed-off-by: Jamal Hadi Salim <jhs@mojatatu.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/sched/act_api.c

index 27e4c531ade1fc629d1d338fb5402e9f863654ef..8a5ba5add4bcd60e59a9b2468df88812212012f4 100644 (file)
@@ -685,6 +685,20 @@ act_get_notify(struct net *net, u32 portid, struct nlmsghdr *n,
        return rtnl_unicast(skb, net, portid);
 }
 
+static struct tc_action *create_a(int i)
+{
+       struct tc_action *act;
+
+       act = kzalloc(sizeof(*act), GFP_KERNEL);
+       if (act == NULL) {
+               pr_debug("create_a: failed to alloc!\n");
+               return NULL;
+       }
+       act->order = i;
+       INIT_LIST_HEAD(&act->list);
+       return act;
+}
+
 static struct tc_action *
 tcf_action_get_1(struct nlattr *nla, struct nlmsghdr *n, u32 portid)
 {
@@ -704,11 +718,10 @@ tcf_action_get_1(struct nlattr *nla, struct nlmsghdr *n, u32 portid)
        index = nla_get_u32(tb[TCA_ACT_INDEX]);
 
        err = -ENOMEM;
-       a = kzalloc(sizeof(struct tc_action), GFP_KERNEL);
+       a = create_a(0);
        if (a == NULL)
                goto err_out;
 
-       INIT_LIST_HEAD(&a->list);
        err = -EINVAL;
        a->ops = tc_lookup_action(tb[TCA_ACT_KIND]);
        if (a->ops == NULL) /* could happen in batch of actions */
@@ -738,20 +751,6 @@ static void cleanup_a(struct list_head *actions)
        }
 }
 
-static struct tc_action *create_a(int i)
-{
-       struct tc_action *act;
-
-       act = kzalloc(sizeof(*act), GFP_KERNEL);
-       if (act == NULL) {
-               pr_debug("create_a: failed to alloc!\n");
-               return NULL;
-       }
-       act->order = i;
-       INIT_LIST_HEAD(&act->list);
-       return act;
-}
-
 static int tca_action_flush(struct net *net, struct nlattr *nla,
                            struct nlmsghdr *n, u32 portid)
 {
@@ -763,18 +762,12 @@ static int tca_action_flush(struct net *net, struct nlattr *nla,
        struct nlattr *nest;
        struct nlattr *tb[TCA_ACT_MAX + 1];
        struct nlattr *kind;
-       struct tc_action *a = create_a(0);
+       struct tc_action a;
        int err = -ENOMEM;
 
-       if (a == NULL) {
-               pr_debug("tca_action_flush: couldnt create tc_action\n");
-               return err;
-       }
-
        skb = alloc_skb(NLMSG_GOODSIZE, GFP_KERNEL);
        if (!skb) {
                pr_debug("tca_action_flush: failed skb alloc\n");
-               kfree(a);
                return err;
        }
 
@@ -786,8 +779,10 @@ static int tca_action_flush(struct net *net, struct nlattr *nla,
 
        err = -EINVAL;
        kind = tb[TCA_ACT_KIND];
-       a->ops = tc_lookup_action(kind);
-       if (a->ops == NULL) /*some idjot trying to flush unknown action */
+       memset(&a, 0, sizeof(struct tc_action));
+       INIT_LIST_HEAD(&a.list);
+       a.ops = tc_lookup_action(kind);
+       if (a.ops == NULL) /*some idjot trying to flush unknown action */
                goto err_out;
 
        nlh = nlmsg_put(skb, portid, n->nlmsg_seq, RTM_DELACTION, sizeof(*t), 0);
@@ -802,7 +797,7 @@ static int tca_action_flush(struct net *net, struct nlattr *nla,
        if (nest == NULL)
                goto out_module_put;
 
-       err = a->ops->walk(skb, &dcb, RTM_DELACTION, a);
+       err = a.ops->walk(skb, &dcb, RTM_DELACTION, &a);
        if (err < 0)
                goto out_module_put;
        if (err == 0)
@@ -812,8 +807,7 @@ static int tca_action_flush(struct net *net, struct nlattr *nla,
 
        nlh->nlmsg_len = skb_tail_pointer(skb) - b;
        nlh->nlmsg_flags |= NLM_F_ROOT;
-       module_put(a->ops->owner);
-       kfree(a);
+       module_put(a.ops->owner);
        err = rtnetlink_send(skb, net, portid, RTNLGRP_TC,
                             n->nlmsg_flags & NLM_F_ECHO);
        if (err > 0)
@@ -822,11 +816,10 @@ static int tca_action_flush(struct net *net, struct nlattr *nla,
        return err;
 
 out_module_put:
-       module_put(a->ops->owner);
+       module_put(a.ops->owner);
 err_out:
 noflush_out:
        kfree_skb(skb);
-       kfree(a);
        return err;
 }