diff options
author | stephen hemminger <shemminger@vyatta.com> | 2009-11-10 02:54:49 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-11-11 01:26:30 -0500 |
commit | f1e9016da6d0f16551d90085758ae45d26826118 (patch) | |
tree | c68bd66565e2e78704cfc366ff022adaca75be55 /net/sched | |
parent | 9e067597ee0e51a07bc158e9e2703ca676920e8b (diff) |
net: use rcu for network scheduler API
Use RCU to walk list of network devices in qdisc dump.
This could be optimized for large number of devices.
Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>
Acked-by: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/sched')
-rw-r--r-- | net/sched/sch_api.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c index 1acfd29cc826..876ba4bb6ae9 100644 --- a/net/sched/sch_api.c +++ b/net/sched/sch_api.c | |||
@@ -1279,9 +1279,10 @@ static int tc_dump_qdisc(struct sk_buff *skb, struct netlink_callback *cb) | |||
1279 | 1279 | ||
1280 | s_idx = cb->args[0]; | 1280 | s_idx = cb->args[0]; |
1281 | s_q_idx = q_idx = cb->args[1]; | 1281 | s_q_idx = q_idx = cb->args[1]; |
1282 | read_lock(&dev_base_lock); | 1282 | |
1283 | rcu_read_lock(); | ||
1283 | idx = 0; | 1284 | idx = 0; |
1284 | for_each_netdev(&init_net, dev) { | 1285 | for_each_netdev_rcu(&init_net, dev) { |
1285 | struct netdev_queue *dev_queue; | 1286 | struct netdev_queue *dev_queue; |
1286 | 1287 | ||
1287 | if (idx < s_idx) | 1288 | if (idx < s_idx) |
@@ -1302,7 +1303,7 @@ cont: | |||
1302 | } | 1303 | } |
1303 | 1304 | ||
1304 | done: | 1305 | done: |
1305 | read_unlock(&dev_base_lock); | 1306 | rcu_read_unlock(); |
1306 | 1307 | ||
1307 | cb->args[0] = idx; | 1308 | cb->args[0] = idx; |
1308 | cb->args[1] = q_idx; | 1309 | cb->args[1] = q_idx; |