veth: Set VETH_INFO_PEER to veth_link_ops.peer_type.
authorKuniyuki Iwashima <kuniyu@amazon.com>
Fri, 8 Nov 2024 00:48:19 +0000 (16:48 -0800)
committerJakub Kicinski <kuba@kernel.org>
Tue, 12 Nov 2024 01:26:52 +0000 (17:26 -0800)
For per-netns RTNL, we need to prefetch the peer device's netns.

Let's set rtnl_link_ops.peer_type and accordingly remove duplicated
validation in ->newlink().

Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.com>
Reviewed-by: Eric Dumazet <edumazet@google.com>
Reviewed-by: Nikolay Aleksandrov <razor@blackwall.org>
Link: https://patch.msgid.link/20241108004823.29419-7-kuniyu@amazon.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/veth.c

index 18148e068aa0067f0ec3f18e891e2f54c448ff71..0d6d0d749d440e11714b7476d7138567039f16dc 100644 (file)
@@ -1781,19 +1781,11 @@ static int veth_newlink(struct net *src_net, struct net_device *dev,
        /*
         * create and register peer first
         */
-       if (data != NULL && data[VETH_INFO_PEER] != NULL) {
-               struct nlattr *nla_peer;
+       if (data && data[VETH_INFO_PEER]) {
+               struct nlattr *nla_peer = data[VETH_INFO_PEER];
 
-               nla_peer = data[VETH_INFO_PEER];
                ifmp = nla_data(nla_peer);
-               err = rtnl_nla_parse_ifinfomsg(peer_tb, nla_peer, extack);
-               if (err < 0)
-                       return err;
-
-               err = veth_validate(peer_tb, NULL, extack);
-               if (err < 0)
-                       return err;
-
+               rtnl_nla_parse_ifinfomsg(peer_tb, nla_peer, extack);
                tbp = peer_tb;
        } else {
                ifmp = NULL;
@@ -1809,9 +1801,6 @@ static int veth_newlink(struct net *src_net, struct net_device *dev,
        }
 
        net = rtnl_link_get_net(src_net, tbp);
-       if (IS_ERR(net))
-               return PTR_ERR(net);
-
        peer = rtnl_create_link(net, ifname, name_assign_type,
                                &veth_link_ops, tbp, extack);
        if (IS_ERR(peer)) {
@@ -1952,6 +1941,7 @@ static struct rtnl_link_ops veth_link_ops = {
        .newlink        = veth_newlink,
        .dellink        = veth_dellink,
        .policy         = veth_policy,
+       .peer_type      = VETH_INFO_PEER,
        .maxtype        = VETH_INFO_MAX,
        .get_link_net   = veth_get_link_net,
        .get_num_tx_queues      = veth_get_num_queues,