Skip to content

Commit 88c9d07

Browse files
committed
Merge branch 'net-use-net-dev_by_index-in-two-places'
Eric Dumazet says: ==================== net: use net->dev_by_index in two places Bring "ip link" ordering to /proc/net/dev one (by ifindexes). Do the same for /proc/net/vlan/config v2: https://lore.kernel.org/all/[email protected]/ ==================== Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
2 parents bed90b0 + 3e41af9 commit 88c9d07

File tree

2 files changed

+36
-68
lines changed

2 files changed

+36
-68
lines changed

net/8021q/vlanproc.c

Lines changed: 16 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -163,48 +163,34 @@ void vlan_proc_rem_dev(struct net_device *vlandev)
163163
* The following few functions build the content of /proc/net/vlan/config
164164
*/
165165

166-
/* start read of /proc/net/vlan/config */
167-
static void *vlan_seq_start(struct seq_file *seq, loff_t *pos)
168-
__acquires(rcu)
166+
static void *vlan_seq_from_index(struct seq_file *seq, loff_t *pos)
169167
{
168+
unsigned long ifindex = *pos;
170169
struct net_device *dev;
171-
struct net *net = seq_file_net(seq);
172-
loff_t i = 1;
173-
174-
rcu_read_lock();
175-
if (*pos == 0)
176-
return SEQ_START_TOKEN;
177170

178-
for_each_netdev_rcu(net, dev) {
171+
for_each_netdev_dump(seq_file_net(seq), dev, ifindex) {
179172
if (!is_vlan_dev(dev))
180173
continue;
181-
182-
if (i++ == *pos)
183-
return dev;
174+
*pos = dev->ifindex;
175+
return dev;
184176
}
177+
return NULL;
178+
}
179+
180+
static void *vlan_seq_start(struct seq_file *seq, loff_t *pos)
181+
__acquires(rcu)
182+
{
183+
rcu_read_lock();
184+
if (*pos == 0)
185+
return SEQ_START_TOKEN;
185186

186-
return NULL;
187+
return vlan_seq_from_index(seq, pos);
187188
}
188189

189190
static void *vlan_seq_next(struct seq_file *seq, void *v, loff_t *pos)
190191
{
191-
struct net_device *dev;
192-
struct net *net = seq_file_net(seq);
193-
194192
++*pos;
195-
196-
dev = v;
197-
if (v == SEQ_START_TOKEN)
198-
dev = net_device_entry(&net->dev_base_head);
199-
200-
for_each_netdev_continue_rcu(net, dev) {
201-
if (!is_vlan_dev(dev))
202-
continue;
203-
204-
return dev;
205-
}
206-
207-
return NULL;
193+
return vlan_seq_from_index(seq, pos);
208194
}
209195

210196
static void vlan_seq_stop(struct seq_file *seq, void *v)

net/core/rtnetlink.c

Lines changed: 20 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -2188,25 +2188,22 @@ static int rtnl_valid_dump_ifinfo_req(const struct nlmsghdr *nlh,
21882188

21892189
static int rtnl_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb)
21902190
{
2191+
const struct rtnl_link_ops *kind_ops = NULL;
21912192
struct netlink_ext_ack *extack = cb->extack;
21922193
const struct nlmsghdr *nlh = cb->nlh;
21932194
struct net *net = sock_net(skb->sk);
2194-
struct net *tgt_net = net;
2195-
int h, s_h;
2196-
int idx = 0, s_idx;
2197-
struct net_device *dev;
2198-
struct hlist_head *head;
2195+
unsigned int flags = NLM_F_MULTI;
21992196
struct nlattr *tb[IFLA_MAX+1];
2197+
struct {
2198+
unsigned long ifindex;
2199+
} *ctx = (void *)cb->ctx;
2200+
struct net *tgt_net = net;
22002201
u32 ext_filter_mask = 0;
2201-
const struct rtnl_link_ops *kind_ops = NULL;
2202-
unsigned int flags = NLM_F_MULTI;
2202+
struct net_device *dev;
22032203
int master_idx = 0;
22042204
int netnsid = -1;
22052205
int err, i;
22062206

2207-
s_h = cb->args[0];
2208-
s_idx = cb->args[1];
2209-
22102207
err = rtnl_valid_dump_ifinfo_req(nlh, cb->strict_check, tb, extack);
22112208
if (err < 0) {
22122209
if (cb->strict_check)
@@ -2250,36 +2247,21 @@ static int rtnl_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb)
22502247
flags |= NLM_F_DUMP_FILTERED;
22512248

22522249
walk_entries:
2253-
for (h = s_h; h < NETDEV_HASHENTRIES; h++, s_idx = 0) {
2254-
idx = 0;
2255-
head = &tgt_net->dev_index_head[h];
2256-
hlist_for_each_entry(dev, head, index_hlist) {
2257-
if (link_dump_filtered(dev, master_idx, kind_ops))
2258-
goto cont;
2259-
if (idx < s_idx)
2260-
goto cont;
2261-
err = rtnl_fill_ifinfo(skb, dev, net,
2262-
RTM_NEWLINK,
2263-
NETLINK_CB(cb->skb).portid,
2264-
nlh->nlmsg_seq, 0, flags,
2265-
ext_filter_mask, 0, NULL, 0,
2266-
netnsid, GFP_KERNEL);
2267-
2268-
if (err < 0) {
2269-
if (likely(skb->len))
2270-
goto out;
2271-
2272-
goto out_err;
2273-
}
2274-
cont:
2275-
idx++;
2250+
err = 0;
2251+
for_each_netdev_dump(tgt_net, dev, ctx->ifindex) {
2252+
if (link_dump_filtered(dev, master_idx, kind_ops))
2253+
continue;
2254+
err = rtnl_fill_ifinfo(skb, dev, net, RTM_NEWLINK,
2255+
NETLINK_CB(cb->skb).portid,
2256+
nlh->nlmsg_seq, 0, flags,
2257+
ext_filter_mask, 0, NULL, 0,
2258+
netnsid, GFP_KERNEL);
2259+
if (err < 0) {
2260+
if (likely(skb->len))
2261+
err = skb->len;
2262+
break;
22762263
}
22772264
}
2278-
out:
2279-
err = skb->len;
2280-
out_err:
2281-
cb->args[1] = idx;
2282-
cb->args[0] = h;
22832265
cb->seq = tgt_net->dev_base_seq;
22842266
nl_dump_check_consistent(cb, nlmsg_hdr(skb));
22852267
if (netnsid >= 0)

0 commit comments

Comments
 (0)