Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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/20240209142441.6c56435b@kernel.org/
====================

Link: https://lore.kernel.org/r/20240211214404.1882191-1-edumazet@google.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

+37 -69
+16 -30
net/8021q/vlanproc.c
··· 163 163 * The following few functions build the content of /proc/net/vlan/config 164 164 */ 165 165 166 - /* start read of /proc/net/vlan/config */ 166 + static void *vlan_seq_from_index(struct seq_file *seq, loff_t *pos) 167 + { 168 + unsigned long ifindex = *pos; 169 + struct net_device *dev; 170 + 171 + for_each_netdev_dump(seq_file_net(seq), dev, ifindex) { 172 + if (!is_vlan_dev(dev)) 173 + continue; 174 + *pos = dev->ifindex; 175 + return dev; 176 + } 177 + return NULL; 178 + } 179 + 167 180 static void *vlan_seq_start(struct seq_file *seq, loff_t *pos) 168 181 __acquires(rcu) 169 182 { 170 - struct net_device *dev; 171 - struct net *net = seq_file_net(seq); 172 - loff_t i = 1; 173 - 174 183 rcu_read_lock(); 175 184 if (*pos == 0) 176 185 return SEQ_START_TOKEN; 177 186 178 - for_each_netdev_rcu(net, dev) { 179 - if (!is_vlan_dev(dev)) 180 - continue; 181 - 182 - if (i++ == *pos) 183 - return dev; 184 - } 185 - 186 - return NULL; 187 + return vlan_seq_from_index(seq, pos); 187 188 } 188 189 189 190 static void *vlan_seq_next(struct seq_file *seq, void *v, loff_t *pos) 190 191 { 191 - struct net_device *dev; 192 - struct net *net = seq_file_net(seq); 193 - 194 192 ++*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); 208 194 } 209 195 210 196 static void vlan_seq_stop(struct seq_file *seq, void *v)
+21 -39
net/core/rtnetlink.c
··· 2188 2188 2189 2189 static int rtnl_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb) 2190 2190 { 2191 + const struct rtnl_link_ops *kind_ops = NULL; 2191 2192 struct netlink_ext_ack *extack = cb->extack; 2192 2193 const struct nlmsghdr *nlh = cb->nlh; 2193 2194 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; 2199 - struct nlattr *tb[IFLA_MAX+1]; 2200 - u32 ext_filter_mask = 0; 2201 - const struct rtnl_link_ops *kind_ops = NULL; 2202 2195 unsigned int flags = NLM_F_MULTI; 2196 + struct nlattr *tb[IFLA_MAX+1]; 2197 + struct { 2198 + unsigned long ifindex; 2199 + } *ctx = (void *)cb->ctx; 2200 + struct net *tgt_net = net; 2201 + u32 ext_filter_mask = 0; 2202 + struct net_device *dev; 2203 2203 int master_idx = 0; 2204 2204 int netnsid = -1; 2205 2205 int err, i; 2206 - 2207 - s_h = cb->args[0]; 2208 - s_idx = cb->args[1]; 2209 2206 2210 2207 err = rtnl_valid_dump_ifinfo_req(nlh, cb->strict_check, tb, extack); 2211 2208 if (err < 0) { ··· 2247 2250 flags |= NLM_F_DUMP_FILTERED; 2248 2251 2249 2252 walk_entries: 2250 - for (h = s_h; h < NETDEV_HASHENTRIES; h++, s_idx = 0) { 2251 - idx = 0; 2252 - head = &tgt_net->dev_index_head[h]; 2253 - hlist_for_each_entry(dev, head, index_hlist) { 2254 - if (link_dump_filtered(dev, master_idx, kind_ops)) 2255 - goto cont; 2256 - if (idx < s_idx) 2257 - goto cont; 2258 - err = rtnl_fill_ifinfo(skb, dev, net, 2259 - RTM_NEWLINK, 2260 - NETLINK_CB(cb->skb).portid, 2261 - nlh->nlmsg_seq, 0, flags, 2262 - ext_filter_mask, 0, NULL, 0, 2263 - netnsid, GFP_KERNEL); 2264 - 2265 - if (err < 0) { 2266 - if (likely(skb->len)) 2267 - goto out; 2268 - 2269 - goto out_err; 2270 - } 2271 - cont: 2272 - idx++; 2253 + err = 0; 2254 + for_each_netdev_dump(tgt_net, dev, ctx->ifindex) { 2255 + if (link_dump_filtered(dev, master_idx, kind_ops)) 2256 + continue; 2257 + err = rtnl_fill_ifinfo(skb, dev, net, RTM_NEWLINK, 2258 + NETLINK_CB(cb->skb).portid, 2259 + nlh->nlmsg_seq, 0, flags, 2260 + ext_filter_mask, 0, NULL, 0, 2261 + netnsid, GFP_KERNEL); 2262 + if (err < 0) { 2263 + if (likely(skb->len)) 2264 + err = skb->len; 2265 + break; 2273 2266 } 2274 2267 } 2275 - out: 2276 - err = skb->len; 2277 - out_err: 2278 - cb->args[1] = idx; 2279 - cb->args[0] = h; 2280 2268 cb->seq = tgt_net->dev_base_seq; 2281 2269 nl_dump_check_consistent(cb, nlmsg_hdr(skb)); 2282 2270 if (netnsid >= 0)