* [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 an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.