inet: Remove rtnl_is_held arg of lwtunnel_valid_encap_type(_attr)?().
authorKuniyuki Iwashima <kuniyu@amazon.com>
Fri, 16 May 2025 02:27:18 +0000 (19:27 -0700)
committerJakub Kicinski <kuba@kernel.org>
Wed, 21 May 2025 02:18:24 +0000 (19:18 -0700)
Commit f130a0cc1b4f ("inet: fix lwtunnel_valid_encap_type() lock
imbalance") added the rtnl_is_held argument as a temporary fix while
I'm converting nexthop and IPv6 routing table to per-netns RTNL or RCU.

Now all callers of lwtunnel_valid_encap_type() do not hold RTNL.

Let's remove the argument.

Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.com>
Link: https://patch.msgid.link/20250516022759.44392-3-kuniyu@amazon.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
include/net/lwtunnel.h
net/core/lwtunnel.c
net/ipv4/fib_frontend.c
net/ipv4/nexthop.c
net/ipv6/route.c

index 39cd50300a1897883b9e4a6cfe95da257a5d007b..c306ebe379a0b37ecc5ce54c864824c91aaea273 100644 (file)
@@ -116,11 +116,9 @@ int lwtunnel_encap_add_ops(const struct lwtunnel_encap_ops *op,
 int lwtunnel_encap_del_ops(const struct lwtunnel_encap_ops *op,
                           unsigned int num);
 int lwtunnel_valid_encap_type(u16 encap_type,
-                             struct netlink_ext_ack *extack,
-                             bool rtnl_is_held);
+                             struct netlink_ext_ack *extack);
 int lwtunnel_valid_encap_type_attr(struct nlattr *attr, int len,
-                                  struct netlink_ext_ack *extack,
-                                  bool rtnl_is_held);
+                                  struct netlink_ext_ack *extack);
 int lwtunnel_build_state(struct net *net, u16 encap_type,
                         struct nlattr *encap,
                         unsigned int family, const void *cfg,
@@ -203,15 +201,14 @@ static inline int lwtunnel_encap_del_ops(const struct lwtunnel_encap_ops *op,
 }
 
 static inline int lwtunnel_valid_encap_type(u16 encap_type,
-                                           struct netlink_ext_ack *extack,
-                                           bool rtnl_is_held)
+                                           struct netlink_ext_ack *extack)
 {
        NL_SET_ERR_MSG(extack, "CONFIG_LWTUNNEL is not enabled in this kernel");
        return -EOPNOTSUPP;
 }
+
 static inline int lwtunnel_valid_encap_type_attr(struct nlattr *attr, int len,
-                                                struct netlink_ext_ack *extack,
-                                                bool rtnl_is_held)
+                                                struct netlink_ext_ack *extack)
 {
        /* return 0 since we are not walking attr looking for
         * RTA_ENCAP_TYPE attribute on nexthops.
index 60f27cb4e54f18ecfb5c3d928729c6b110ce68bb..f9d76d85d04fd0d11803b97780f77f19b6460fd2 100644 (file)
@@ -149,8 +149,7 @@ int lwtunnel_build_state(struct net *net, u16 encap_type,
 }
 EXPORT_SYMBOL_GPL(lwtunnel_build_state);
 
-int lwtunnel_valid_encap_type(u16 encap_type, struct netlink_ext_ack *extack,
-                             bool rtnl_is_held)
+int lwtunnel_valid_encap_type(u16 encap_type, struct netlink_ext_ack *extack)
 {
        const struct lwtunnel_encap_ops *ops;
        int ret = -EINVAL;
@@ -167,12 +166,7 @@ int lwtunnel_valid_encap_type(u16 encap_type, struct netlink_ext_ack *extack,
                const char *encap_type_str = lwtunnel_encap_str(encap_type);
 
                if (encap_type_str) {
-                       if (rtnl_is_held)
-                               __rtnl_unlock();
                        request_module("rtnl-lwt-%s", encap_type_str);
-                       if (rtnl_is_held)
-                               rtnl_lock();
-
                        ops = rcu_access_pointer(lwtun_encaps[encap_type]);
                }
        }
@@ -186,8 +180,7 @@ int lwtunnel_valid_encap_type(u16 encap_type, struct netlink_ext_ack *extack,
 EXPORT_SYMBOL_GPL(lwtunnel_valid_encap_type);
 
 int lwtunnel_valid_encap_type_attr(struct nlattr *attr, int remaining,
-                                  struct netlink_ext_ack *extack,
-                                  bool rtnl_is_held)
+                                  struct netlink_ext_ack *extack)
 {
        struct rtnexthop *rtnh = (struct rtnexthop *)attr;
        struct nlattr *nla_entype;
@@ -208,9 +201,7 @@ int lwtunnel_valid_encap_type_attr(struct nlattr *attr, int remaining,
                                }
                                encap_type = nla_get_u16(nla_entype);
 
-                               if (lwtunnel_valid_encap_type(encap_type,
-                                                             extack,
-                                                             rtnl_is_held) != 0)
+                               if (lwtunnel_valid_encap_type(encap_type, extack))
                                        return -EOPNOTSUPP;
                        }
                }
index 57f088e5540e2b9c03a191b06ba5e87a46f13abe..fd1e1507a22406dad20a5a02403301eaca6d24eb 100644 (file)
@@ -807,7 +807,7 @@ static int rtm_to_fib_config(struct net *net, struct sk_buff *skb,
                case RTA_MULTIPATH:
                        err = lwtunnel_valid_encap_type_attr(nla_data(attr),
                                                             nla_len(attr),
-                                                            extack, false);
+                                                            extack);
                        if (err < 0)
                                goto errout;
                        cfg->fc_mp = nla_data(attr);
@@ -825,7 +825,7 @@ static int rtm_to_fib_config(struct net *net, struct sk_buff *skb,
                case RTA_ENCAP_TYPE:
                        cfg->fc_encap_type = nla_get_u16(attr);
                        err = lwtunnel_valid_encap_type(cfg->fc_encap_type,
-                                                       extack, false);
+                                                       extack);
                        if (err < 0)
                                goto errout;
                        break;
index 823e4a783d2b1dde5891d603a8cde91b7ce3e94f..4397e89d3123a01bb76a104f208e6e50b636dd4f 100644 (file)
@@ -3180,8 +3180,7 @@ static int rtm_to_nh_config(struct net *net, struct sk_buff *skb,
                }
 
                cfg->nh_encap_type = nla_get_u16(tb[NHA_ENCAP_TYPE]);
-               err = lwtunnel_valid_encap_type(cfg->nh_encap_type,
-                                               extack, false);
+               err = lwtunnel_valid_encap_type(cfg->nh_encap_type, extack);
                if (err < 0)
                        goto out;
 
index 44300962230bd6c63dc0074c6d7bf2f0cfe8292b..6baf177c529b9e66f3cffe94bc55801924f1062e 100644 (file)
@@ -5172,8 +5172,7 @@ static int rtm_to_fib6_multipath_config(struct fib6_config *cfg,
                rtnh = rtnh_next(rtnh, &remaining);
        } while (rtnh_ok(rtnh, remaining));
 
-       return lwtunnel_valid_encap_type_attr(cfg->fc_mp, cfg->fc_mp_len,
-                                             extack, false);
+       return lwtunnel_valid_encap_type_attr(cfg->fc_mp, cfg->fc_mp_len, extack);
 }
 
 static int rtm_to_fib6_config(struct sk_buff *skb, struct nlmsghdr *nlh,
@@ -5310,8 +5309,7 @@ static int rtm_to_fib6_config(struct sk_buff *skb, struct nlmsghdr *nlh,
        if (tb[RTA_ENCAP_TYPE]) {
                cfg->fc_encap_type = nla_get_u16(tb[RTA_ENCAP_TYPE]);
 
-               err = lwtunnel_valid_encap_type(cfg->fc_encap_type,
-                                               extack, false);
+               err = lwtunnel_valid_encap_type(cfg->fc_encap_type, extack);
                if (err < 0)
                        goto errout;
        }