* [PATCH net-next 0/2] addrlabel: don't use rtnl locking
@ 2017-08-29 11:29 Florian Westphal
2017-08-29 11:29 ` [PATCH net-next 1/2] selftests: add addrlabel add/delete to rtnetlink.sh Florian Westphal
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: Florian Westphal @ 2017-08-29 11:29 UTC (permalink / raw)
To: netdev
addrlabel doesn't appear to require rtnl lock as the addrlabel
table uses a spinlock to serialize add/delete operations.
Also, entries are reference counted so it should be safe
to call the rtnl ops without the rtnl mutex.
^ permalink raw reply [flat|nested] 4+ messages in thread* [PATCH net-next 1/2] selftests: add addrlabel add/delete to rtnetlink.sh 2017-08-29 11:29 [PATCH net-next 0/2] addrlabel: don't use rtnl locking Florian Westphal @ 2017-08-29 11:29 ` Florian Westphal 2017-08-29 11:29 ` [PATCH net-next 2/2] addrlabel: add/delete/get can run without rtnl Florian Westphal 2017-08-29 16:42 ` [PATCH net-next 0/2] addrlabel: don't use rtnl locking David Miller 2 siblings, 0 replies; 4+ messages in thread From: Florian Westphal @ 2017-08-29 11:29 UTC (permalink / raw) To: netdev; +Cc: Florian Westphal Signed-off-by: Florian Westphal <fw@strlen.de> --- tools/testing/selftests/net/rtnetlink.sh | 41 ++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/tools/testing/selftests/net/rtnetlink.sh b/tools/testing/selftests/net/rtnetlink.sh index 84b4acf5baa9..57b5ff576240 100755 --- a/tools/testing/selftests/net/rtnetlink.sh +++ b/tools/testing/selftests/net/rtnetlink.sh @@ -195,6 +195,46 @@ kci_test_route_get() echo "PASS: route get" } +kci_test_addrlabel() +{ + ret=0 + + ip addrlabel add prefix dead::/64 dev lo label 1 + check_err $? + + ip addrlabel list |grep -q "prefix dead::/64 dev lo label 1" + check_err $? + + ip addrlabel del prefix dead::/64 dev lo label 1 2> /dev/null + check_err $? + + ip addrlabel add prefix dead::/64 label 1 2> /dev/null + check_err $? + + ip addrlabel del prefix dead::/64 label 1 2> /dev/null + check_err $? + + # concurrent add/delete + for i in $(seq 1 1000); do + ip addrlabel add prefix 1c3::/64 label 12345 2>/dev/null + done & + + for i in $(seq 1 1000); do + ip addrlabel del prefix 1c3::/64 label 12345 2>/dev/null + done + + wait + + ip addrlabel del prefix 1c3::/64 label 12345 2>/dev/null + + if [ $ret -ne 0 ];then + echo "FAIL: ipv6 addrlabel" + return 1 + fi + + echo "PASS: ipv6 addrlabel" +} + kci_test_rtnl() { kci_add_dummy @@ -208,6 +248,7 @@ kci_test_rtnl() kci_test_tc kci_test_gre kci_test_bridge + kci_test_addrlabel kci_del_dummy } -- 2.13.0 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH net-next 2/2] addrlabel: add/delete/get can run without rtnl 2017-08-29 11:29 [PATCH net-next 0/2] addrlabel: don't use rtnl locking Florian Westphal 2017-08-29 11:29 ` [PATCH net-next 1/2] selftests: add addrlabel add/delete to rtnetlink.sh Florian Westphal @ 2017-08-29 11:29 ` Florian Westphal 2017-08-29 16:42 ` [PATCH net-next 0/2] addrlabel: don't use rtnl locking David Miller 2 siblings, 0 replies; 4+ messages in thread From: Florian Westphal @ 2017-08-29 11:29 UTC (permalink / raw) To: netdev; +Cc: Florian Westphal There appears to be no need to use rtnl, addrlabel entries are refcounted and add/delete is serialized by the addrlabel table spinlock. Signed-off-by: Florian Westphal <fw@strlen.de> --- net/ipv6/addrlabel.c | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/net/ipv6/addrlabel.c b/net/ipv6/addrlabel.c index cea5eb488013..b055bc79f56d 100644 --- a/net/ipv6/addrlabel.c +++ b/net/ipv6/addrlabel.c @@ -405,6 +405,18 @@ static const struct nla_policy ifal_policy[IFAL_MAX+1] = { [IFAL_LABEL] = { .len = sizeof(u32), }, }; +static bool addrlbl_ifindex_exists(struct net *net, int ifindex) +{ + + struct net_device *dev; + + rcu_read_lock(); + dev = dev_get_by_index_rcu(net, ifindex); + rcu_read_unlock(); + + return dev != NULL; +} + static int ip6addrlbl_newdel(struct sk_buff *skb, struct nlmsghdr *nlh, struct netlink_ext_ack *extack) { @@ -439,7 +451,7 @@ static int ip6addrlbl_newdel(struct sk_buff *skb, struct nlmsghdr *nlh, switch (nlh->nlmsg_type) { case RTM_NEWADDRLABEL: if (ifal->ifal_index && - !__dev_get_by_index(net, ifal->ifal_index)) + !addrlbl_ifindex_exists(net, ifal->ifal_index)) return -EINVAL; err = ip6addrlbl_add(net, pfx, ifal->ifal_prefixlen, @@ -548,7 +560,7 @@ static int ip6addrlbl_get(struct sk_buff *in_skb, struct nlmsghdr *nlh, return -EINVAL; if (ifal->ifal_index && - !__dev_get_by_index(net, ifal->ifal_index)) + !addrlbl_ifindex_exists(net, ifal->ifal_index)) return -EINVAL; if (!tb[IFAL_ADDRESS]) @@ -593,10 +605,10 @@ static int ip6addrlbl_get(struct sk_buff *in_skb, struct nlmsghdr *nlh, void __init ipv6_addr_label_rtnl_register(void) { __rtnl_register(PF_INET6, RTM_NEWADDRLABEL, ip6addrlbl_newdel, - NULL, 0); + NULL, RTNL_FLAG_DOIT_UNLOCKED); __rtnl_register(PF_INET6, RTM_DELADDRLABEL, ip6addrlbl_newdel, - NULL, 0); + NULL, RTNL_FLAG_DOIT_UNLOCKED); __rtnl_register(PF_INET6, RTM_GETADDRLABEL, ip6addrlbl_get, - ip6addrlbl_dump, 0); + ip6addrlbl_dump, RTNL_FLAG_DOIT_UNLOCKED); } -- 2.13.0 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH net-next 0/2] addrlabel: don't use rtnl locking 2017-08-29 11:29 [PATCH net-next 0/2] addrlabel: don't use rtnl locking Florian Westphal 2017-08-29 11:29 ` [PATCH net-next 1/2] selftests: add addrlabel add/delete to rtnetlink.sh Florian Westphal 2017-08-29 11:29 ` [PATCH net-next 2/2] addrlabel: add/delete/get can run without rtnl Florian Westphal @ 2017-08-29 16:42 ` David Miller 2 siblings, 0 replies; 4+ messages in thread From: David Miller @ 2017-08-29 16:42 UTC (permalink / raw) To: fw; +Cc: netdev From: Florian Westphal <fw@strlen.de> Date: Tue, 29 Aug 2017 13:29:40 +0200 > addrlabel doesn't appear to require rtnl lock as the addrlabel > table uses a spinlock to serialize add/delete operations. > > Also, entries are reference counted so it should be safe > to call the rtnl ops without the rtnl mutex. Series applied. ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2017-08-29 16:42 UTC | newest] Thread overview: 4+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2017-08-29 11:29 [PATCH net-next 0/2] addrlabel: don't use rtnl locking Florian Westphal 2017-08-29 11:29 ` [PATCH net-next 1/2] selftests: add addrlabel add/delete to rtnetlink.sh Florian Westphal 2017-08-29 11:29 ` [PATCH net-next 2/2] addrlabel: add/delete/get can run without rtnl Florian Westphal 2017-08-29 16:42 ` [PATCH net-next 0/2] addrlabel: don't use rtnl locking David Miller
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).