Skip to content

Commit d91191f

Browse files
q2venkuba-moo
authored andcommitted
rtnetlink: Convert RTM_NEWLINK to per-netns RTNL.
Now, we are ready to convert rtnl_newlink() to per-netns RTNL; rtnl_link_ops is protected by SRCU and netns is prefetched in rtnl_newlink(). Let's register rtnl_newlink() with RTNL_FLAG_DOIT_PERNET and push RTNL down as rtnl_nets_lock(). Signed-off-by: Kuniyuki Iwashima <[email protected]> Reviewed-by: Eric Dumazet <[email protected]> Reviewed-by: Nikolay Aleksandrov <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
1 parent fefd5d0 commit d91191f

File tree

1 file changed

+24
-3
lines changed

1 file changed

+24
-3
lines changed

net/core/rtnetlink.c

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,26 @@ static void rtnl_nets_add(struct rtnl_nets *rtnl_nets, struct net *net)
319319
rtnl_nets->len++;
320320
}
321321

322+
static void rtnl_nets_lock(struct rtnl_nets *rtnl_nets)
323+
{
324+
int i;
325+
326+
rtnl_lock();
327+
328+
for (i = 0; i < rtnl_nets->len; i++)
329+
__rtnl_net_lock(rtnl_nets->net[i]);
330+
}
331+
332+
static void rtnl_nets_unlock(struct rtnl_nets *rtnl_nets)
333+
{
334+
int i;
335+
336+
for (i = 0; i < rtnl_nets->len; i++)
337+
__rtnl_net_unlock(rtnl_nets->net[i]);
338+
339+
rtnl_unlock();
340+
}
341+
322342
static struct rtnl_link __rcu *__rcu *rtnl_msg_handlers[RTNL_FAMILY_MAX + 1];
323343

324344
static inline int rtm_msgindex(int msgtype)
@@ -3903,9 +3923,7 @@ static int rtnl_newlink(struct sk_buff *skb, struct nlmsghdr *nlh,
39033923
ops = rtnl_link_ops_get(kind, &ops_srcu_index);
39043924
#ifdef CONFIG_MODULES
39053925
if (!ops) {
3906-
__rtnl_unlock();
39073926
request_module("rtnl-link-%s", kind);
3908-
rtnl_lock();
39093927
ops = rtnl_link_ops_get(kind, &ops_srcu_index);
39103928
}
39113929
#endif
@@ -3968,7 +3986,9 @@ static int rtnl_newlink(struct sk_buff *skb, struct nlmsghdr *nlh,
39683986
}
39693987
}
39703988

3989+
rtnl_nets_lock(&rtnl_nets);
39713990
ret = __rtnl_newlink(skb, nlh, ops, tgt_net, link_net, tbs, data, extack);
3991+
rtnl_nets_unlock(&rtnl_nets);
39723992

39733993
put_net:
39743994
rtnl_nets_destroy(&rtnl_nets);
@@ -6972,7 +6992,8 @@ static struct pernet_operations rtnetlink_net_ops = {
69726992
};
69736993

69746994
static const struct rtnl_msg_handler rtnetlink_rtnl_msg_handlers[] __initconst = {
6975-
{.msgtype = RTM_NEWLINK, .doit = rtnl_newlink},
6995+
{.msgtype = RTM_NEWLINK, .doit = rtnl_newlink,
6996+
.flags = RTNL_FLAG_DOIT_PERNET},
69766997
{.msgtype = RTM_DELLINK, .doit = rtnl_dellink},
69776998
{.msgtype = RTM_GETLINK, .doit = rtnl_getlink,
69786999
.dumpit = rtnl_dump_ifinfo, .flags = RTNL_FLAG_DUMP_SPLIT_NLM_DONE},

0 commit comments

Comments
 (0)