net: sched: remove redundant 'rtnl_held' argument
authorVlad Buslov <vladbu@nvidia.com>
Fri, 27 Nov 2020 15:12:05 +0000 (17:12 +0200)
committerJakub Kicinski <kuba@kernel.org>
Tue, 1 Dec 2020 19:24:56 +0000 (11:24 -0800)
Functions tfilter_notify_chain() and tcf_get_next_proto() are always called
with rtnl lock held in current implementation. Moreover, attempting to call
them without rtnl lock would cause a warning down the call chain in
function __tcf_get_next_proto() that requires the lock to be held by
callers. Remove the 'rtnl_held' argument in order to simplify the code and
make rtnl lock requirement explicit.

Signed-off-by: Vlad Buslov <vladbu@nvidia.com>
Link: https://lore.kernel.org/r/20201127151205.23492-1-vladbu@nvidia.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
include/net/pkt_cls.h
net/sched/cls_api.c
net/sched/sch_api.c

index 133f9ad4d4f9b3fe8792d1b1086927af0a97532c..0f2a9c44171c6c63a8cba87f8ed031ea61e93a6f 100644 (file)
@@ -48,7 +48,7 @@ void tcf_chain_put_by_act(struct tcf_chain *chain);
 struct tcf_chain *tcf_get_next_chain(struct tcf_block *block,
                                     struct tcf_chain *chain);
 struct tcf_proto *tcf_get_next_proto(struct tcf_chain *chain,
-                                    struct tcf_proto *tp, bool rtnl_held);
+                                    struct tcf_proto *tp);
 void tcf_block_netif_keep_dst(struct tcf_block *block);
 int tcf_block_get(struct tcf_block **p_block,
                  struct tcf_proto __rcu **p_filter_chain, struct Qdisc *q,
index ff3e943febaa2c52ab6057152b9d7e735e1cc9be..37b77bd309746065096294ad95c26ade0996a098 100644 (file)
@@ -991,13 +991,12 @@ __tcf_get_next_proto(struct tcf_chain *chain, struct tcf_proto *tp)
  */
 
 struct tcf_proto *
-tcf_get_next_proto(struct tcf_chain *chain, struct tcf_proto *tp,
-                  bool rtnl_held)
+tcf_get_next_proto(struct tcf_chain *chain, struct tcf_proto *tp)
 {
        struct tcf_proto *tp_next = __tcf_get_next_proto(chain, tp);
 
        if (tp)
-               tcf_proto_put(tp, rtnl_held, NULL);
+               tcf_proto_put(tp, true, NULL);
 
        return tp_next;
 }
@@ -1924,15 +1923,14 @@ static int tfilter_del_notify(struct net *net, struct sk_buff *oskb,
 static void tfilter_notify_chain(struct net *net, struct sk_buff *oskb,
                                 struct tcf_block *block, struct Qdisc *q,
                                 u32 parent, struct nlmsghdr *n,
-                                struct tcf_chain *chain, int event,
-                                bool rtnl_held)
+                                struct tcf_chain *chain, int event)
 {
        struct tcf_proto *tp;
 
-       for (tp = tcf_get_next_proto(chain, NULL, rtnl_held);
-            tp; tp = tcf_get_next_proto(chain, tp, rtnl_held))
+       for (tp = tcf_get_next_proto(chain, NULL);
+            tp; tp = tcf_get_next_proto(chain, tp))
                tfilter_notify(net, oskb, n, tp, block,
-                              q, parent, NULL, event, false, rtnl_held);
+                              q, parent, NULL, event, false, true);
 }
 
 static void tfilter_put(struct tcf_proto *tp, void *fh)
@@ -2262,7 +2260,7 @@ static int tc_del_tfilter(struct sk_buff *skb, struct nlmsghdr *n,
 
        if (prio == 0) {
                tfilter_notify_chain(net, skb, block, q, parent, n,
-                                    chain, RTM_DELTFILTER, rtnl_held);
+                                    chain, RTM_DELTFILTER);
                tcf_chain_flush(chain, rtnl_held);
                err = 0;
                goto errout;
@@ -2895,7 +2893,7 @@ replay:
                break;
        case RTM_DELCHAIN:
                tfilter_notify_chain(net, skb, block, q, parent, n,
-                                    chain, RTM_DELTFILTER, true);
+                                    chain, RTM_DELTFILTER);
                /* Flush the chain first as the user requested chain removal. */
                tcf_chain_flush(chain, true);
                /* In case the chain was successfully deleted, put a reference
index 1a2d2471b07884210ce2accaab242ce78c47b5ab..51cb553e4317a3e2bca1996e0df004aab8111d58 100644 (file)
@@ -1943,8 +1943,8 @@ static int tc_bind_class_walker(struct Qdisc *q, unsigned long cl,
             chain = tcf_get_next_chain(block, chain)) {
                struct tcf_proto *tp;
 
-               for (tp = tcf_get_next_proto(chain, NULL, true);
-                    tp; tp = tcf_get_next_proto(chain, tp, true)) {
+               for (tp = tcf_get_next_proto(chain, NULL);
+                    tp; tp = tcf_get_next_proto(chain, tp)) {
                        struct tcf_bind_args arg = {};
 
                        arg.w.fn = tcf_node_bind;