Rework dev_base via list_head (v3)
Subsystems (14)
PATCH 1/1 Rework dev_base via list_head (v3)
Netdev tree was updated today soon after I sent a patch for it, so this version applies to it and the fs/afs/netdevices.c file is added. Hope I am not late yet again :)
Cleanup of dev_base list use, with the aim to simplify making device list per-namespace. In almost every occasion, use of dev_base variable and dev->next pointer could be easily replaced by for_each_netdev loop. A few most complicated places were converted to using first_netdev()/next_netdev().
---
arch/s390/appldata/appldata_net_sum.c +1 -1
@@ -107,7 +107,7 @@ static void appldata_get_net_sum_data(vo tx_dropped =0 ; collisions =0 ;read_lock (&dev_base_lock); -for (dev = dev_base; dev !=NULL ; dev = dev->next) { +for_each_netdev (dev) { stats = dev->get_stats (dev); rx_packets += stats->rx_packets; tx_packets += stats->tx_packets;
arch/sparc64/solaris/ioctl.c +2 -1
@@ -686,7 +686,8 @@ static inline int solaris_i(unsigned intint i =0 ;read_lock_bh (&dev_base_lock); -for (d = dev_base; d; d = d->next) i++; +for_each_netdev (d) + i++;read_unlock_bh (&dev_base_lock);if (put_user (i, (int __user *)A (arg)))
drivers/block/aoe/aoecmd.c +5 -3
@@ -194,15 +194,15 @@ aoecmd_cfg_pkts(ushort aoemajor, unsigne sl = sl_tail =NULL ;read_lock (&dev_base_lock); -for (ifp = dev_base; ifp;dev_put (ifp), ifp = ifp->next) { +for_each_netdev (ifp) {dev_hold (ifp);if (!is_aoe_netif (ifp)) -continue ; + goto cont; skb =new_skb (sizeof *h +sizeof *ch);if (skb ==NULL ) {printk (KERN_INFO "aoe: skb alloc failure\n" ); -continue ; + goto cont; }skb_put (skb,sizeof *h +sizeof *ch); skb->dev = ifp;
@@ -221,6 +221,8 @@ aoecmd_cfg_pkts(ushort aoemajor, unsigne skb->next = sl; sl = skb; +cont: +dev_put (ifp); }read_unlock (&dev_base_lock);
drivers/net/wireless/strip.c +1 -3
@@ -1971,8 +1971,7 @@ static struct net_device *get_strip_dev( sizeof(zero_address))) { struct net_device *dev; read_lock_bh(&dev_base_lock); - dev = dev_base; - while (dev) { + for_each_netdev(dev) { if (dev->type == strip_info->dev->type && !memcmp(dev->dev_addr, &strip_info->true_dev_addr,
@@ -1983,7 +1982,6 @@ static struct net_device *get_strip_dev(read_unlock_bh (&dev_base_lock);return (dev); } - dev = dev->next; }read_unlock_bh (&dev_base_lock); }
drivers/parisc/led.c +1 -1
@@ -365,7 +365,7 @@ static __inline__ int led_get_net_activi* for reading should be OK */ read_lock (&dev_base_lock);rcu_read_lock (); -for (dev = dev_base; dev; dev = dev->next) { +for_each_netdev (dev) {struct net_device_stats *stats;struct in_device *in_dev =__in_dev_get_rcu (dev);if (!in_dev || !in_dev->ifa_list)
fs/afs/netdevices.c +1 -1
@@ -47,7 +47,7 @@ int afs_get_ipv4_interfaces(struct afs_iASSERT (maxbufs >0 );rtnl_lock (); -for (dev = dev_base; dev; dev = dev->next) { +for_each_netdev (dev) {if (dev->type ==ARPHRD_LOOPBACK && !wantloopback)continue ; idev =__in_dev_get_rtnl (dev);
include/linux/netdevice.h +24 -2
@@ -304,7 +304,7 @@ struct net_deviceunsigned long state; -struct net_device *next; +struct list_head dev_list;/* The device initialization function. Called only once. */ int (*init)(struct net_device *dev);
@@ -575,9 +575,31 @@ struct packet_type {#include <linux/notifier.h> extern struct net_device loopback_dev;/* The loopback */ -extern struct net_device *dev_base;/* All devices */ +extern struct list_head dev_base_head;/* All devices */ extern rwlock_t dev_base_lock;/* Device list lock */ +#define for_each_netdev (d) \ + list_for_each_entry(d, &dev_base_head, dev_list) +#define for_each_netdev_safe (d, n) \ + list_for_each_entry_safe(d, n, &dev_base_head, dev_list) +#define for_each_netdev_continue (d) \ + list_for_each_entry_continue(d, &dev_base_head, dev_list) +#define net_device_entry (lh) list_entry(lh, struct net_device, dev_list) + +static inline struct net_device *next_net_device (struct net_device *dev) +{ +struct list_head *lh; + + lh = dev->dev_list.next; +return lh == &dev_base_head ?NULL :net_device_entry (lh); +} + +static inline struct net_device *first_net_device (void ) +{ +return list_empty (&dev_base_head) ?NULL : +net_device_entry (dev_base_head.next); +} +extern int netdev_boot_setup_check (struct net_device *dev);extern unsigned long netdev_boot_base (const char *prefix,int unit);extern struct net_device *dev_getbyhwaddr (unsigned short type,char *hwaddr);
net/8021q/vlan.c +1 -2
@@ -117,8 +117,7 @@ static void __exit vlan_cleanup_devices(struct net_device *dev, *nxt;rtnl_lock (); -for (dev = dev_base; dev; dev = nxt) { - nxt = dev->next; +for_each_netdev_safe (dev, nxt) {if (dev->priv_flags &IFF_802_1Q_VLAN ) {unregister_vlan_dev (VLAN_DEV_INFO (dev)->real_dev,VLAN_DEV_INFO (dev)->vlan_id);
net/8021q/vlanproc.c +24 -12
@@ -237,13 +237,9 @@ int vlan_proc_rem_dev(struct net_device* The following few functions build the content of /proc/net/vlan/config */ -/* starting at dev, find a VLAN device */ -static struct net_device *vlan_skip (struct net_device *dev) +static inline int is_vlan_dev (struct net_device *dev) { -while (dev && !(dev->priv_flags &IFF_802_1Q_VLAN )) - dev = dev->next; - -return dev; +return dev->priv_flags &IFF_802_1Q_VLAN ; }/* start read of /proc/net/vlan/config */
@@ -257,19 +253,35 @@ static void *vlan_seq_start(struct seq_fif (*pos ==0 )return SEQ_START_TOKEN ; -for (dev =vlan_skip (dev_base); dev && i < *pos; - dev =vlan_skip (dev->next), ++i); +for_each_netdev (dev) { +if (!is_vlan_dev (dev)) +continue ; + +if (i++ == *pos) +return dev; + } -return (i == *pos) ? dev :NULL ; +return NULL ; }static void *vlan_seq_next (struct seq_file *seq,void *v,loff_t *pos) { +struct net_device *dev; + ++*pos; -return vlan_skip ((v ==SEQ_START_TOKEN ) - ? dev_base - : ((struct net_device *)v)->next); + dev = (struct net_device *)v; +if (v ==SEQ_START_TOKEN ) + dev =net_device_entry (&dev_base_head); + +for_each_netdev_continue (dev) { +if (!is_vlan_dev (dev)) +continue ; + +return dev; + } + +return NULL ; }static void vlan_seq_stop (struct seq_file *seq,void *v)
net/bridge/br_if.c +1 -3
@@ -475,11 +475,9 @@ void __exit br_cleanup_bridges(void)struct net_device *dev, *nxt;rtnl_lock (); -for (dev = dev_base; dev; dev = nxt) { - nxt = dev->next; +for_each_netdev_safe (dev, nxt)if (dev->priv_flags &IFF_EBRIDGE )del_br (dev->priv); - }rtnl_unlock (); }
net/bridge/br_ioctl.c +3 -1
@@ -27,7 +27,9 @@ static int get_bridge_ifindices(int *indstruct net_device *dev;int i =0 ; -for (dev = dev_base; dev && i < num; dev = dev->next) { +for_each_netdev (dev) { +if (i >= num) +break ;if (dev->priv_flags &IFF_EBRIDGE ) indices[i++] = dev->ifindex; }
net/bridge/br_netlink.c +2 -1
@@ -109,7 +109,8 @@ static int br_dump_ifinfo(struct sk_buffstruct net_device *dev;int idx; -for (dev = dev_base, idx =0 ; dev; dev = dev->next) { + idx =0 ; +for_each_netdev (dev) {/* not a bridge port */ if (dev->br_port ==NULL || idx < cb->args[0 ]) goto skip;
net/core/dev.c +38 -46
186 lines not on this page · raw message
net/core/dev_mcast.c +2 -3
@@ -223,7 +223,7 @@ static void *dev_mc_seq_start(struct seqloff_t off =0 ;read_lock (&dev_base_lock); -for (dev = dev_base; dev; dev = dev->next) { +for_each_netdev (dev) {if (off++ == *pos)return dev; }
@@ -232,9 +232,8 @@ static void *dev_mc_seq_start(struct seqstatic void *dev_mc_seq_next (struct seq_file *seq,void *v,loff_t *pos) { -struct net_device *dev = v; ++*pos; -return dev->next; +return next_net_device ((struct net_device *)v); }static void dev_mc_seq_stop (struct seq_file *seq,void *v)
net/core/rtnetlink.c +5 -2
@@ -539,13 +539,16 @@ static int rtnl_dump_ifinfo(struct sk_buint s_idx = cb->args[0 ];struct net_device *dev; -for (dev=dev_base, idx=0 ; dev; dev = dev->next, idx++) { + idx =0 ; +for_each_netdev (dev) {if (idx < s_idx) -continue ; + goto cont;if (rtnl_fill_ifinfo (skb, dev,NULL ,0 ,RTM_NEWLINK ,NETLINK_CB (cb->skb).pid, cb->nlh->nlmsg_seq,0 ,NLM_F_MULTI ) <=0 )break ; +cont: + idx++; } cb->args[0 ] = idx;
net/decnet/af_decnet.c +7 -4
@@ -721,7 +721,7 @@ static int dn_bind(struct socket *sock,struct sock *sk = sock->sk;struct dn_scp *scp =DN_SK (sk);struct sockaddr_dn *saddr = (struct sockaddr_dn *)uaddr; -struct net_device *dev; +struct net_device *dev, *ldev;int rv;if (addr_len !=sizeof (struct sockaddr_dn ))
@@ -746,14 +746,17 @@ static int dn_bind(struct socket *sock,if (!(saddr->sdn_flags &SDF_WILD )) {if (dn_ntohs (saddr->sdn_nodeaddrl)) {read_lock (&dev_base_lock); -for (dev = dev_base; dev; dev = dev->next) { + ldev =NULL ; +for_each_netdev (dev) {if (!dev->dn_ptr)continue ; -if (dn_dev_islocal (dev,dn_saddr2dn (saddr))) +if (dn_dev_islocal (dev,dn_saddr2dn (saddr))) { + ldev = dev;break ; + } }read_unlock (&dev_base_lock); -if (dev ==NULL ) +if (ldev ==NULL )return -EADDRNOTAVAIL ; } }
net/decnet/dn_dev.c +41 -44
144 lines not on this page · raw message
net/decnet/dn_fib.c +1 -1
@@ -602,7 +602,7 @@ static void dn_fib_del_ifaddr(struct dn_/* Scan device list */ read_lock (&dev_base_lock); -for (dev = dev_base; dev; dev = dev->next) { +for_each_netdev (dev) { dn_db = dev->dn_ptr;if (dn_db ==NULL )continue ;
net/decnet/dn_route.c +8 -6
@@ -886,7 +886,7 @@ static int dn_route_output_slow(struct d .iif = loopback_dev.ifindex, .oif = oldflp->oif };struct dn_route *rt =NULL ; -struct net_device *dev_out =NULL ; +struct net_device *dev_out =NULL , *dev;struct neighbour *neigh =NULL ;unsigned hash;unsigned flags =0 ;
@@ -925,15 +925,17 @@ static int dn_route_output_slow(struct d goto out; }read_lock (&dev_base_lock); -for (dev_out = dev_base; dev_out; dev_out = dev_out->next) { -if (!dev_out->dn_ptr) +for_each_netdev (dev) { +if (!dev->dn_ptr)continue ; -if (!dn_dev_islocal (dev_out, oldflp->fld_src)) +if (!dn_dev_islocal (dev, oldflp->fld_src))continue ; -if ((dev_out->flags &IFF_LOOPBACK ) && +if ((dev->flags &IFF_LOOPBACK ) && oldflp->fld_dst && - !dn_dev_islocal (dev_out, oldflp->fld_dst)) + !dn_dev_islocal (dev, oldflp->fld_dst))continue ; + + dev_out = dev;break ; }read_unlock (&dev_base_lock);
net/ipv4/devinet.c +10 -7
@@ -910,7 +910,7 @@ no_in_dev:*/ read_lock (&dev_base_lock);rcu_read_lock (); -for (dev = dev_base; dev; dev = dev->next) { +for_each_netdev (dev) {if ((in_dev =__in_dev_get_rcu (dev)) ==NULL )continue ;
@@ -989,7 +989,7 @@ __be32 inet_confirm_addr(const struct neread_lock (&dev_base_lock);rcu_read_lock (); -for (dev = dev_base; dev; dev = dev->next) { +for_each_netdev (dev) {if ((in_dev =__in_dev_get_rcu (dev))) { addr =confirm_addr_indev (in_dev, dst, local, scope);if (addr)
@@ -1182,23 +1182,26 @@ static int inet_dump_ifaddr(struct sk_buint s_ip_idx, s_idx = cb->args[0 ]; s_ip_idx = ip_idx = cb->args[1 ]; -for (dev = dev_base, idx =0 ; dev; dev = dev->next, idx++) { + idx =0 ; +for_each_netdev (dev) {if (idx < s_idx) -continue ; + goto cont;if (idx > s_idx) s_ip_idx =0 ;if ((in_dev =__in_dev_get_rtnl (dev)) ==NULL ) -continue ; + goto cont;for (ifa = in_dev->ifa_list, ip_idx =0 ; ifa; ifa = ifa->ifa_next, ip_idx++) {if (ip_idx < s_ip_idx) -continue ; + goto cont;if (inet_fill_ifaddr (skb, ifa,NETLINK_CB (cb->skb).pid, cb->nlh->nlmsg_seq,RTM_NEWADDR ,NLM_F_MULTI ) <=0 ) goto done; } +cont: + idx++; } done:
@@ -1243,7 +1246,7 @@ void inet_forward_change(void) ipv4_devconf_dflt.forwarding = on;read_lock (&dev_base_lock); -for (dev = dev_base; dev; dev = dev->next) { +for_each_netdev (dev) {struct in_device *in_dev;rcu_read_lock (); in_dev =__in_dev_get_rcu (dev);
net/ipv4/igmp.c +7 -8
@@ -2288,9 +2288,8 @@ static inline struct ip_mc_list *igmp_mcstruct ip_mc_list *im =NULL ;struct igmp_mc_iter_state *state =igmp_mc_seq_private (seq); -for (state->dev = dev_base, state->in_dev =NULL ; - state->dev; - state->dev = state->dev->next) { + state->in_dev =NULL ; +for_each_netdev (state->dev) {struct in_device *in_dev; in_dev =in_dev_get (state->dev);if (!in_dev)
@@ -2316,7 +2315,7 @@ static struct ip_mc_list *igmp_mc_get_neread_unlock (&state->in_dev->mc_list_lock);in_dev_put (state->in_dev); } - state->dev = state->dev->next; + state->dev =next_net_device (state->dev);if (!state->dev) { state->in_dev =NULL ;break ;
@@ -2450,9 +2449,9 @@ static inline struct ip_sf_list *igmp_mcstruct ip_mc_list *im =NULL ;struct igmp_mcf_iter_state *state =igmp_mcf_seq_private (seq); -for (state->dev = dev_base, state->idev =NULL , state->im =NULL ; - state->dev; - state->dev = state->dev->next) { + state->idev =NULL ; + state->im =NULL ; +for_each_netdev (state->dev) {struct in_device *idev; idev =in_dev_get (state->dev);if (unlikely (idev ==NULL ))
@@ -2488,7 +2487,7 @@ static struct ip_sf_list *igmp_mcf_get_nread_unlock (&state->idev->mc_list_lock);in_dev_put (state->idev); } - state->dev = state->dev->next; + state->dev =next_net_device (state->dev);if (!state->dev) { state->idev =NULL ; goto out;
net/ipv4/ipconfig.c +1 -1
@@ -192,7 +192,7 @@ static int __init ic_open_devs(void)if (dev_change_flags (&loopback_dev, loopback_dev.flags |IFF_UP ) <0 )printk (KERN_ERR "IP-Config: Failed to open %s\n" , loopback_dev.name); -for (dev = dev_base; dev; dev = dev->next) { +for_each_netdev (dev) {if (dev == &loopback_dev)continue ; if (user_dev_name[0] ? !strcmp(dev->name, user_dev_name) :
net/ipv6/addrconf.c +17 -11
@@ -449,7 +449,7 @@ static void addrconf_forward_change(voidstruct inet6_dev *idev;read_lock (&dev_base_lock); -for (dev=dev_base; dev; dev=dev->next) { +for_each_netdev (dev) {rcu_read_lock (); idev =__in6_dev_get (dev);if (idev) {
@@ -911,7 +911,7 @@ int ipv6_dev_get_saddr(struct net_deviceread_lock (&dev_base_lock);rcu_read_lock (); -for (dev = dev_base; dev; dev=dev->next) { +for_each_netdev (dev) {struct inet6_dev *idev;struct inet6_ifaddr *ifa;
@@ -2064,7 +2064,7 @@ static void sit_add_v4_addrs(struct inetreturn ; } -for (dev = dev_base; dev !=NULL ; dev = dev->next) { +for_each_netdev (dev) {struct in_device * in_dev =__in_dev_get_rtnl (dev);if (in_dev && (dev->flags &IFF_UP )) {struct in_ifaddr * ifa;
@@ -2225,7 +2225,7 @@ static void ip6_tnl_add_linklocal(structreturn ; }/* then try to inherit it from any device */ -for (link_dev = dev_base; link_dev; link_dev = link_dev->next) { +for_each_netdev (link_dev) {if (!ipv6_inherit_linklocal (idev, link_dev))return ; }
@@ -3257,14 +3257,15 @@ static int inet6_dump_addr(struct sk_buf s_idx = cb->args[0 ]; s_ip_idx = ip_idx = cb->args[1 ]; -for (dev = dev_base, idx =0 ; dev; dev = dev->next, idx++) { + idx =0 ; +for_each_netdev (dev) {if (idx < s_idx) -continue ; + goto cont;if (idx > s_idx) s_ip_idx =0 ; ip_idx =0 ;if ((idev =in6_dev_get (dev)) ==NULL ) -continue ; + goto cont;read_lock_bh (&idev->lock);switch (type) {case UNICAST_ADDR :
@@ -3311,6 +3312,8 @@ static int inet6_dump_addr(struct sk_buf }read_unlock_bh (&idev->lock);in6_dev_put (idev); +cont: + idx++; } done:if (err <=0 ) {
@@ -3575,16 +3578,19 @@ static int inet6_dump_ifinfo(struct sk_bstruct inet6_dev *idev;read_lock (&dev_base_lock); -for (dev=dev_base, idx=0 ; dev; dev = dev->next, idx++) { + idx =0 ; +for_each_netdev (dev) {if (idx < s_idx) -continue ; + goto cont;if ((idev =in6_dev_get (dev)) ==NULL ) -continue ; + goto cont; err =inet6_fill_ifinfo (skb, idev,NETLINK_CB (cb->skb).pid, cb->nlh->nlmsg_seq,RTM_NEWLINK ,NLM_F_MULTI );in6_dev_put (idev);if (err <=0 )break ; +cont: + idx++; }read_unlock (&dev_base_lock); cb->args[0 ] = idx;
@@ -4247,7 +4253,7 @@ void __exit addrconf_cleanup(void)* clean dev list. */ -for (dev=dev_base; dev; dev=dev->next) { +for_each_netdev (dev) {if ((idev =__in6_dev_get (dev)) ==NULL )continue ;addrconf_ifdown (dev,1 );
net/ipv6/anycast.c +10 -7
@@ -423,14 +423,18 @@ static int ipv6_chk_acast_dev(struct net*/ int ipv6_chk_acast_addr (struct net_device *dev,struct in6_addr *addr) { +int found =0 ; +if (dev)return ipv6_chk_acast_dev (dev, addr);read_lock (&dev_base_lock); -for (dev=dev_base; dev; dev=dev->next) -if (ipv6_chk_acast_dev (dev, addr)) +for_each_netdev (dev) +if (ipv6_chk_acast_dev (dev, addr)) { + found =1 ;break ; + }read_unlock (&dev_base_lock); -return dev !=0 ; +return found; }
@@ -447,9 +451,8 @@ static inline struct ifacaddr6 *ac6_get_struct ifacaddr6 *im =NULL ;struct ac6_iter_state *state =ac6_seq_private (seq); -for (state->dev = dev_base, state->idev =NULL ; - state->dev; - state->dev = state->dev->next) { + state->idev =NULL ; +for_each_netdev (state->dev) {struct inet6_dev *idev; idev =in6_dev_get (state->dev);if (!idev)
@@ -476,7 +479,7 @@ static struct ifacaddr6 *ac6_get_next(stread_unlock_bh (&state->idev->lock);in6_dev_put (state->idev); } - state->dev = state->dev->next; + state->dev =next_net_device (state->dev);if (!state->dev) { state->idev =NULL ;break ;
net/ipv6/mcast.c +7 -8
@@ -2331,9 +2331,8 @@ static inline struct ifmcaddr6 *igmp6_mcstruct ifmcaddr6 *im =NULL ;struct igmp6_mc_iter_state *state =igmp6_mc_seq_private (seq); -for (state->dev = dev_base, state->idev =NULL ; - state->dev; - state->dev = state->dev->next) { + state->idev =NULL ; +for_each_netdev (state->dev) {struct inet6_dev *idev; idev =in6_dev_get (state->dev);if (!idev)
@@ -2360,7 +2359,7 @@ static struct ifmcaddr6 *igmp6_mc_get_neread_unlock_bh (&state->idev->lock);in6_dev_put (state->idev); } - state->dev = state->dev->next; + state->dev =next_net_device (state->dev);if (!state->dev) { state->idev =NULL ;break ;
@@ -2475,9 +2474,9 @@ static inline struct ip6_sf_list *igmp6_struct ifmcaddr6 *im =NULL ;struct igmp6_mcf_iter_state *state =igmp6_mcf_seq_private (seq); -for (state->dev = dev_base, state->idev =NULL , state->im =NULL ; - state->dev; - state->dev = state->dev->next) { + state->idev =NULL ; + state->im =NULL ; +for_each_netdev (state->dev) {struct inet6_dev *idev; idev =in6_dev_get (state->dev);if (unlikely (idev ==NULL ))
@@ -2513,7 +2512,7 @@ static struct ip6_sf_list *igmp6_mcf_getread_unlock_bh (&state->idev->lock);in6_dev_put (state->idev); } - state->dev = state->dev->next; + state->dev =next_net_device (state->dev);if (!state->dev) { state->idev =NULL ; goto out;
net/llc/llc_core.c +8 -2
@@ -160,8 +160,14 @@ static struct packet_type llc_tr_packet_static int __init llc_init (void ) { -if (dev_base->next) -memcpy (llc_station_mac_sa, dev_base->next->dev_addr,ETH_ALEN ); +struct net_device *dev; + + dev =first_net_device (); +if (dev !=NULL ) + dev =next_net_device (dev); + +if (dev !=NULL ) +memcpy (llc_station_mac_sa, dev->dev_addr,ETH_ALEN );else memset (llc_station_mac_sa,0 ,ETH_ALEN );dev_add_pack (&llc_packet_type);
net/netrom/nr_route.c +3 -2
@@ -598,7 +598,7 @@ struct net_device *nr_dev_first(void)struct net_device *dev, *first =NULL ;read_lock (&dev_base_lock); -for (dev = dev_base; dev !=NULL ; dev = dev->next) { +for_each_netdev (dev) {if ((dev->flags &IFF_UP ) && dev->type ==ARPHRD_NETROM )if (first ==NULL ||strncmp (dev->name, first->name,3 ) <0 ) first = dev;
@@ -618,12 +618,13 @@ struct net_device *nr_dev_get(ax25_addrestruct net_device *dev;read_lock (&dev_base_lock); -for (dev = dev_base; dev !=NULL ; dev = dev->next) { +for_each_netdev (dev) {if ((dev->flags &IFF_UP ) && dev->type ==ARPHRD_NETROM &&ax25cmp (addr, (ax25_address *)dev->dev_addr) ==0 ) {dev_hold (dev); goto out; } } + dev =NULL ; out:read_unlock (&dev_base_lock);return dev;
net/rose/rose_route.c +5 -3
@@ -596,7 +596,7 @@ struct net_device *rose_dev_first(void)struct net_device *dev, *first =NULL ;read_lock (&dev_base_lock); -for (dev = dev_base; dev !=NULL ; dev = dev->next) { +for_each_netdev (dev) {if ((dev->flags &IFF_UP ) && dev->type ==ARPHRD_ROSE )if (first ==NULL ||strncmp (dev->name, first->name,3 ) <0 ) first = dev;
@@ -614,12 +614,13 @@ struct net_device *rose_dev_get(rose_addstruct net_device *dev;read_lock (&dev_base_lock); -for (dev = dev_base; dev !=NULL ; dev = dev->next) { +for_each_netdev (dev) {if ((dev->flags &IFF_UP ) && dev->type ==ARPHRD_ROSE &&rosecmp (addr, (rose_address *)dev->dev_addr) ==0 ) {dev_hold (dev); goto out; } } + dev =NULL ; out:read_unlock (&dev_base_lock);return dev;
@@ -630,10 +631,11 @@ static int rose_dev_exists(rose_addressstruct net_device *dev;read_lock (&dev_base_lock); -for (dev = dev_base; dev !=NULL ; dev = dev->next) { +for_each_netdev (dev) {if ((dev->flags &IFF_UP ) && dev->type ==ARPHRD_ROSE &&rosecmp (addr, (rose_address *)dev->dev_addr) ==0 ) goto out; } + dev =NULL ; out:read_unlock (&dev_base_lock);return dev !=NULL ;
net/sched/sch_api.c +5 -2
@@ -894,9 +894,10 @@ static int tc_dump_qdisc(struct sk_buff s_idx = cb->args[0 ]; s_q_idx = q_idx = cb->args[1 ];read_lock (&dev_base_lock); -for (dev=dev_base, idx=0 ; dev; dev = dev->next, idx++) { + idx =0 ; +for_each_netdev (dev) {if (idx < s_idx) -continue ; + goto cont;if (idx > s_idx) s_q_idx =0 ; q_idx =0 ;
@@ -910,6 +911,8 @@ static int tc_dump_qdisc(struct sk_buff goto done; q_idx++; } +cont: + idx++; } done:
net/sctp/protocol.c +1 -1
@@ -170,7 +170,7 @@ static void sctp_get_local_addr_list(voistruct sctp_af *af;read_lock (&dev_base_lock); -for (dev = dev_base; dev; dev = dev->next) { +for_each_netdev (dev) {__list_for_each (pos, &sctp_address_families) { af = list_entry(pos, struct sctp_af, list); af->copy_addrlist (&sctp_local_addr_list, dev);
net/tipc/eth_media.c +7 -5
@@ -120,16 +120,18 @@ static int recv_msg(struct sk_buff *buf,static int enable_bearer (struct tipc_bearer *tb_ptr) { -struct net_device *dev = dev_base; +struct net_device *dev, *pdev;struct eth_bearer *eb_ptr = ð_bearers[0 ];struct eth_bearer *stop = ð_bearers[MAX_ETH_BEARERS ];char *driver_name =strchr ((const char *)tb_ptr->name,':' ) +1 ;/* Find device with specified name */ - -while (dev && dev->name &&strncmp (dev->name, driver_name,IFNAMSIZ )) { - dev = dev->next; - } + dev =NULL ; +for_each_netdev (pdev) +if (!strncmp (dev->name, driver_name,IFNAMSIZ )) { + dev = pdev; +break ; + }if (!dev)return -ENODEV ;
David Miller
maintainerFrom: Pavel Emelianov <[email protected]>
Date: Thu, 03 May 2007 19:32:54 +0400
Quoted 10 lines
Netdev tree was updated today soon after I sent a patch for it, so this version applies to it and the
fs/afs/netdevices.cfile is added. Hope I am not late yet again :)Cleanup of
dev_baselist use, with the aim to simplify making device list per-namespace. In almost every occasion, use ofdev_basevariable anddev->nextpointer could be easily replaced byfor_each_netdevloop. A few most complicated places were converted to using first_netdev()/next_netdev().
Quoted 3 lines
Signed-off-by Pavel Emelianov <[email protected]>Acked-by Kirill Korotaev <[email protected]>Cc Patrick McHardy <[email protected]>
Looks good, I've applied this, thanks!