Rework dev_base via list_head
Subsystems (13)
PATCH 1/1 Rework dev_base via list_head
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().
Fits 2.6.21-rc7 tree.
---
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) {if (dev->get_stats ==NULL ) {continue ; }
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
@@ -193,15 +193,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;
@@ -220,6 +220,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)
include/linux/netdevice.h +24 -2
@@ -302,7 +302,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);
@@ -569,9 +569,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
@@ -471,11 +471,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
@@ -111,7 +111,8 @@ static int br_dump_ifinfo(struct sk_buffint idx;read_lock (&dev_base_lock); -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 +28 -39
158 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
@@ -394,13 +394,16 @@ static int rtnl_dump_ifinfo(struct sk_bustruct net_device *dev;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 (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++; }read_unlock (&dev_base_lock); cb->args[0 ] = idx;
net/decnet/af_decnet.c +1 -1
@@ -746,7 +746,7 @@ 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) { +for_each_netdev (dev) {if (!dev->dn_ptr)continue ;if (dn_dev_islocal (dev,dn_saddr2dn (saddr)))
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 +1 -1
@@ -924,7 +924,7 @@ 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) { +for_each_netdev (dev_out) {if (!dev_out->dn_ptr)continue ;if (!dn_dev_islocal (dev_out, oldflp->fld_src))
net/ipv4/devinet.c +10 -7
@@ -911,7 +911,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 ;
@@ -990,7 +990,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)
@@ -1184,21 +1184,22 @@ static int inet_dump_ifaddr(struct sk_bu s_ip_idx = ip_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_ip_idx =0 ;rcu_read_lock ();if ((in_dev =__in_dev_get_rcu (dev)) ==NULL ) {rcu_read_unlock (); -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 ) {
@@ -1207,6 +1208,8 @@ static int inet_dump_ifaddr(struct sk_bu } }rcu_read_unlock (); +cont: + idx++; } done:
@@ -1265,7 +1268,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
@@ -2285,9 +2285,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)
@@ -2313,7 +2312,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 ;
@@ -2447,9 +2446,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 ))
@@ -2485,7 +2484,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
@@ -415,7 +415,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) {
@@ -859,7 +859,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;
@@ -1992,7 +1992,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;
@@ -2145,7 +2145,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 ; }
@@ -3164,14 +3164,15 @@ static int inet6_dump_addr(struct sk_buf s_ip_idx = ip_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_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 :
@@ -3218,6 +3219,8 @@ static int inet6_dump_addr(struct sk_buf }read_unlock_bh (&idev->lock);in6_dev_put (idev); +cont: + idx++; } done:if (err <=0 ) {
@@ -3439,16 +3442,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;
@@ -4084,7 +4090,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 +4 -5
@@ -426,7 +426,7 @@ int ipv6_chk_acast_addr(struct net_devicif (dev)return ipv6_chk_acast_dev (dev, addr);read_lock (&dev_base_lock); -for (dev=dev_base; dev; dev=dev->next) +for_each_netdev (dev)if (ipv6_chk_acast_dev (dev, addr))break ;read_unlock (&dev_base_lock);
@@ -447,9 +447,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 +475,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
@@ -2329,9 +2329,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)
@@ -2358,7 +2357,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 ;
@@ -2473,9 +2472,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 ))
@@ -2511,7 +2510,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 +2 -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,7 +618,7 @@ 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;
net/rose/rose_route.c +3 -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,7 +614,7 @@ 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;
@@ -630,7 +630,7 @@ 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; }
net/sched/sch_api.c +5 -2
@@ -857,9 +857,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 ;read_lock (&qdisc_tree_lock);
@@ -877,6 +878,8 @@ static int tc_dump_qdisc(struct sk_buff q_idx++; }read_unlock (&qdisc_tree_lock); +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: Wed, 02 May 2007 17:40:56 +0400
Quoted 10 lines
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().Fits 2.6.21-rc7 tree.
Signed-off-by Pavel Emelianov <[email protected]>Acked-by Kirill Korotaev <[email protected]>
Overall this looks mostly good.
One thing I want to audit before applying this is
loop termination conditions.
With the old loop, if you do something like this:
for (dev = dev_base; dev; dev = dev->next) {
if (dev == what_I_want)
break;
}you can test for a successful find after the loop with:
if (dev) {
I_found_it();
}That doesn't work with for_each_netdev(), if the loop runs till the end of the list, the iterator will not be left at NULL.
I just want to make sure you didn't leave any code around which wants that behavior still.
This is one of the subtle things about using the list iterators in linux/list.h, vs. a traditional by-hand singly linked list implementation.
Quoted 32 lines · David Miller
From: Pavel Emelianov <[email protected]>
Date: Wed, 02 May 2007 17:40:56 +0400Quoted 10 lines
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().Fits 2.6.21-rc7 tree.
Signed-off-by Pavel Emelianov <[email protected]>Acked-by Kirill Korotaev <[email protected]>Overall this looks mostly good.
One thing I want to audit before applying this is
loop termination conditions.With the old loop, if you do something like this:
for (dev = dev_base; dev; dev = dev->next) { if (dev == what_I_want) break; }you can test for a successful find after the loop with:
if (dev) { I_found_it(); }
Quoted 6 lines
That doesn't work with
for_each_netdev(), if the loop runs till the end of the list, the iterator will not be left at NULL.I just want to make sure you didn't leave any code around which wants that behavior still.
My fault :( I've found some places where this was missed. I will make a new patch shortly.
Quoted 4 lines
This is one of the subtle things about using the list iterators in
linux/list.h, vs. a traditional by-hand singly linked list implementation.
David Miller
maintainerFrom: Pavel Emelianov <[email protected]>
Date: Thu, 03 May 2007 14:42:12 +0400
Quoted 2 lines
My fault :( I've found some places where this was missed. I will make a new patch shortly.
Ok, thanks.