Skip to content

Commit 6313c1e

Browse files
kaberDavid S. Miller
authored andcommitted
[RTNETLINK]: Remove unnecessary locking in dump callbacks
Since we're now holding the rtnl during the entire dump operation, we can remove additional locking for rtnl protected data. This patch does that for all simple cases (dev_base_lock for dev_base walking, RCU protection for FIB rule dumping). Signed-off-by: Patrick McHardy <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 1c2d670 commit 6313c1e

File tree

6 files changed

+3
-22
lines changed

6 files changed

+3
-22
lines changed

net/bridge/br_netlink.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,6 @@ static int br_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb)
109109
struct net_device *dev;
110110
int idx;
111111

112-
read_lock(&dev_base_lock);
113112
for (dev = dev_base, idx = 0; dev; dev = dev->next) {
114113
/* not a bridge port */
115114
if (dev->br_port == NULL || idx < cb->args[0])
@@ -122,7 +121,6 @@ static int br_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb)
122121
skip:
123122
++idx;
124123
}
125-
read_unlock(&dev_base_lock);
126124

127125
cb->args[0] = idx;
128126

net/core/fib_rules.c

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -495,8 +495,7 @@ static int dump_rules(struct sk_buff *skb, struct netlink_callback *cb,
495495
int idx = 0;
496496
struct fib_rule *rule;
497497

498-
rcu_read_lock();
499-
list_for_each_entry_rcu(rule, ops->rules_list, list) {
498+
list_for_each_entry(rule, ops->rules_list, list) {
500499
if (idx < cb->args[1])
501500
goto skip;
502501

@@ -507,7 +506,6 @@ static int dump_rules(struct sk_buff *skb, struct netlink_callback *cb,
507506
skip:
508507
idx++;
509508
}
510-
rcu_read_unlock();
511509
cb->args[1] = idx;
512510
rules_ops_put(ops);
513511

net/core/rtnetlink.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -543,7 +543,6 @@ static int rtnl_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb)
543543
int s_idx = cb->args[0];
544544
struct net_device *dev;
545545

546-
read_lock(&dev_base_lock);
547546
for (dev=dev_base, idx=0; dev; dev = dev->next, idx++) {
548547
if (idx < s_idx)
549548
continue;
@@ -552,7 +551,6 @@ static int rtnl_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb)
552551
cb->nlh->nlmsg_seq, 0, NLM_F_MULTI) <= 0)
553552
break;
554553
}
555-
read_unlock(&dev_base_lock);
556554
cb->args[0] = idx;
557555

558556
return skb->len;

net/decnet/dn_dev.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -799,7 +799,6 @@ static int dn_nl_dump_ifaddr(struct sk_buff *skb, struct netlink_callback *cb)
799799
skip_ndevs = cb->args[0];
800800
skip_naddr = cb->args[1];
801801

802-
read_lock(&dev_base_lock);
803802
for (dev = dev_base, idx = 0; dev; dev = dev->next, idx++) {
804803
if (idx < skip_ndevs)
805804
continue;
@@ -824,8 +823,6 @@ static int dn_nl_dump_ifaddr(struct sk_buff *skb, struct netlink_callback *cb)
824823
}
825824
}
826825
done:
827-
read_unlock(&dev_base_lock);
828-
829826
cb->args[0] = idx;
830827
cb->args[1] = dn_idx;
831828

net/ipv4/devinet.c

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1182,34 +1182,26 @@ static int inet_dump_ifaddr(struct sk_buff *skb, struct netlink_callback *cb)
11821182
int s_ip_idx, s_idx = cb->args[0];
11831183

11841184
s_ip_idx = ip_idx = cb->args[1];
1185-
read_lock(&dev_base_lock);
11861185
for (dev = dev_base, idx = 0; dev; dev = dev->next, idx++) {
11871186
if (idx < s_idx)
11881187
continue;
11891188
if (idx > s_idx)
11901189
s_ip_idx = 0;
1191-
rcu_read_lock();
1192-
if ((in_dev = __in_dev_get_rcu(dev)) == NULL) {
1193-
rcu_read_unlock();
1190+
if ((in_dev = __in_dev_get_rtnl(dev)) == NULL)
11941191
continue;
1195-
}
11961192

11971193
for (ifa = in_dev->ifa_list, ip_idx = 0; ifa;
11981194
ifa = ifa->ifa_next, ip_idx++) {
11991195
if (ip_idx < s_ip_idx)
12001196
continue;
12011197
if (inet_fill_ifaddr(skb, ifa, NETLINK_CB(cb->skb).pid,
12021198
cb->nlh->nlmsg_seq,
1203-
RTM_NEWADDR, NLM_F_MULTI) <= 0) {
1204-
rcu_read_unlock();
1199+
RTM_NEWADDR, NLM_F_MULTI) <= 0)
12051200
goto done;
1206-
}
12071201
}
1208-
rcu_read_unlock();
12091202
}
12101203

12111204
done:
1212-
read_unlock(&dev_base_lock);
12131205
cb->args[0] = idx;
12141206
cb->args[1] = ip_idx;
12151207

net/ipv6/addrconf.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3224,7 +3224,6 @@ static int inet6_dump_addr(struct sk_buff *skb, struct netlink_callback *cb,
32243224

32253225
s_idx = cb->args[0];
32263226
s_ip_idx = ip_idx = cb->args[1];
3227-
read_lock(&dev_base_lock);
32283227

32293228
for (dev = dev_base, idx = 0; dev; dev = dev->next, idx++) {
32303229
if (idx < s_idx)
@@ -3286,7 +3285,6 @@ static int inet6_dump_addr(struct sk_buff *skb, struct netlink_callback *cb,
32863285
read_unlock_bh(&idev->lock);
32873286
in6_dev_put(idev);
32883287
}
3289-
read_unlock(&dev_base_lock);
32903288
cb->args[0] = idx;
32913289
cb->args[1] = ip_idx;
32923290
return skb->len;

0 commit comments

Comments
 (0)