From: KAMEZAWA Hiroyuki for_each_cpu() actually iterates across all possible CPUs. We've had mistakes in the past where people were using for_each_cpu() where they should have been iterating across only online or present CPUs. This is inefficient and possibly buggy. We're renaming for_each_cpu() to for_each_possible_cpu() to avoid this in the future. This patch replaces for_each_cpu with for_each_possible_cpu under /net Signed-off-by: KAMEZAWA Hiroyuki Signed-off-by: Andrew Morton --- net/bridge/netfilter/ebtables.c | 12 ++++++------ net/core/dev.c | 2 +- net/core/flow.c | 4 ++-- net/core/neighbour.c | 2 +- net/core/utils.c | 4 ++-- net/ipv4/icmp.c | 2 +- net/ipv4/ipcomp.c | 8 ++++---- net/ipv4/netfilter/arp_tables.c | 4 ++-- net/ipv4/netfilter/ip_conntrack_core.c | 2 +- net/ipv4/netfilter/ip_tables.c | 4 ++-- net/ipv4/proc.c | 4 ++-- net/ipv4/route.c | 2 +- net/ipv6/icmp.c | 4 ++-- net/ipv6/ipcomp6.c | 8 ++++---- net/ipv6/netfilter/ip6_tables.c | 4 ++-- net/ipv6/proc.c | 4 ++-- net/netfilter/nf_conntrack_core.c | 2 +- net/netfilter/x_tables.c | 4 ++-- net/sctp/proc.c | 2 +- net/socket.c | 2 +- core/sock.c | 0 21 files changed, 40 insertions(+), 40 deletions(-) diff -puN net/bridge/netfilter/ebtables.c~for_each_possible_cpu-network-codes net/bridge/netfilter/ebtables.c --- 25/net/bridge/netfilter/ebtables.c~for_each_possible_cpu-network-codes Mon Apr 3 15:56:27 2006 +++ 25-akpm/net/bridge/netfilter/ebtables.c Mon Apr 3 15:56:27 2006 @@ -829,7 +829,7 @@ static int translate_table(struct ebt_re * sizeof(struct ebt_chainstack)); if (!newinfo->chainstack) return -ENOMEM; - for_each_cpu(i) { + for_each_possible_cpu(i) { newinfo->chainstack[i] = vmalloc(udc_cnt * sizeof(struct ebt_chainstack)); if (!newinfo->chainstack[i]) { @@ -901,7 +901,7 @@ static void get_counters(struct ebt_coun sizeof(struct ebt_counter) * nentries); /* add other counters to those of cpu 0 */ - for_each_cpu(cpu) { + for_each_possible_cpu(cpu) { if (cpu == 0) continue; counter_base = COUNTER_BASE(oldcounters, nentries, cpu); @@ -1036,7 +1036,7 @@ static int do_replace(void __user *user, vfree(table->entries); if (table->chainstack) { - for_each_cpu(i) + for_each_possible_cpu(i) vfree(table->chainstack[i]); vfree(table->chainstack); } @@ -1054,7 +1054,7 @@ free_counterstmp: vfree(counterstmp); /* can be initialized in translate_table() */ if (newinfo->chainstack) { - for_each_cpu(i) + for_each_possible_cpu(i) vfree(newinfo->chainstack[i]); vfree(newinfo->chainstack); } @@ -1201,7 +1201,7 @@ free_unlock: mutex_unlock(&ebt_mutex); free_chainstack: if (newinfo->chainstack) { - for_each_cpu(i) + for_each_possible_cpu(i) vfree(newinfo->chainstack[i]); vfree(newinfo->chainstack); } @@ -1224,7 +1224,7 @@ void ebt_unregister_table(struct ebt_tab mutex_unlock(&ebt_mutex); vfree(table->private->entries); if (table->private->chainstack) { - for_each_cpu(i) + for_each_possible_cpu(i) vfree(table->private->chainstack[i]); vfree(table->private->chainstack); } diff -puN net/core/dev.c~for_each_possible_cpu-network-codes net/core/dev.c --- 25/net/core/dev.c~for_each_possible_cpu-network-codes Mon Apr 3 15:56:27 2006 +++ 25-akpm/net/core/dev.c Mon Apr 3 15:56:27 2006 @@ -3347,7 +3347,7 @@ static int __init net_dev_init(void) * Initialise the packet receive queues. */ - for_each_cpu(i) { + for_each_possible_cpu(i) { struct softnet_data *queue; queue = &per_cpu(softnet_data, i); diff -puN net/core/flow.c~for_each_possible_cpu-network-codes net/core/flow.c --- 25/net/core/flow.c~for_each_possible_cpu-network-codes Mon Apr 3 15:56:27 2006 +++ 25-akpm/net/core/flow.c Mon Apr 3 15:56:27 2006 @@ -79,7 +79,7 @@ static void flow_cache_new_hashrnd(unsig { int i; - for_each_cpu(i) + for_each_possible_cpu(i) flow_hash_rnd_recalc(i) = 1; flow_hash_rnd_timer.expires = jiffies + FLOW_HASH_RND_PERIOD; @@ -363,7 +363,7 @@ static int __init flow_cache_init(void) flow_hash_rnd_timer.expires = jiffies + FLOW_HASH_RND_PERIOD; add_timer(&flow_hash_rnd_timer); - for_each_cpu(i) + for_each_possible_cpu(i) flow_cache_cpu_prepare(i); hotcpu_notifier(flow_cache_cpu, 0); diff -puN net/core/neighbour.c~for_each_possible_cpu-network-codes net/core/neighbour.c --- 25/net/core/neighbour.c~for_each_possible_cpu-network-codes Mon Apr 3 15:56:27 2006 +++ 25-akpm/net/core/neighbour.c Mon Apr 3 15:56:27 2006 @@ -1633,7 +1633,7 @@ static int neightbl_fill_info(struct nei memset(&ndst, 0, sizeof(ndst)); - for_each_cpu(cpu) { + for_each_possible_cpu(cpu) { struct neigh_statistics *st; st = per_cpu_ptr(tbl->stats, cpu); diff -puN net/core/sock.c~for_each_possible_cpu-network-codes net/core/sock.c diff -puN net/core/utils.c~for_each_possible_cpu-network-codes net/core/utils.c --- 25/net/core/utils.c~for_each_possible_cpu-network-codes Mon Apr 3 15:56:27 2006 +++ 25-akpm/net/core/utils.c Mon Apr 3 15:56:27 2006 @@ -121,7 +121,7 @@ void __init net_random_init(void) { int i; - for_each_cpu(i) { + for_each_possible_cpu(i) { struct nrnd_state *state = &per_cpu(net_rand_state,i); __net_srandom(state, i+jiffies); } @@ -133,7 +133,7 @@ static int net_random_reseed(void) unsigned long seed[NR_CPUS]; get_random_bytes(seed, sizeof(seed)); - for_each_cpu(i) { + for_each_possible_cpu(i) { struct nrnd_state *state = &per_cpu(net_rand_state,i); __net_srandom(state, seed[i]); } diff -puN net/ipv4/icmp.c~for_each_possible_cpu-network-codes net/ipv4/icmp.c --- 25/net/ipv4/icmp.c~for_each_possible_cpu-network-codes Mon Apr 3 15:56:27 2006 +++ 25-akpm/net/ipv4/icmp.c Mon Apr 3 15:56:27 2006 @@ -1107,7 +1107,7 @@ void __init icmp_init(struct net_proto_f struct inet_sock *inet; int i; - for_each_cpu(i) { + for_each_possible_cpu(i) { int err; err = sock_create_kern(PF_INET, SOCK_RAW, IPPROTO_ICMP, diff -puN net/ipv4/ipcomp.c~for_each_possible_cpu-network-codes net/ipv4/ipcomp.c --- 25/net/ipv4/ipcomp.c~for_each_possible_cpu-network-codes Mon Apr 3 15:56:27 2006 +++ 25-akpm/net/ipv4/ipcomp.c Mon Apr 3 15:56:27 2006 @@ -290,7 +290,7 @@ static void ipcomp_free_scratches(void) if (!scratches) return; - for_each_cpu(i) { + for_each_possible_cpu(i) { void *scratch = *per_cpu_ptr(scratches, i); if (scratch) vfree(scratch); @@ -313,7 +313,7 @@ static void **ipcomp_alloc_scratches(voi ipcomp_scratches = scratches; - for_each_cpu(i) { + for_each_possible_cpu(i) { void *scratch = vmalloc(IPCOMP_SCRATCH_SIZE); if (!scratch) return NULL; @@ -344,7 +344,7 @@ static void ipcomp_free_tfms(struct cryp if (!tfms) return; - for_each_cpu(cpu) { + for_each_possible_cpu(cpu) { struct crypto_tfm *tfm = *per_cpu_ptr(tfms, cpu); crypto_free_tfm(tfm); } @@ -384,7 +384,7 @@ static struct crypto_tfm **ipcomp_alloc_ if (!tfms) goto error; - for_each_cpu(cpu) { + for_each_possible_cpu(cpu) { struct crypto_tfm *tfm = crypto_alloc_tfm(alg_name, 0); if (!tfm) goto error; diff -puN net/ipv4/netfilter/arp_tables.c~for_each_possible_cpu-network-codes net/ipv4/netfilter/arp_tables.c --- 25/net/ipv4/netfilter/arp_tables.c~for_each_possible_cpu-network-codes Mon Apr 3 15:56:27 2006 +++ 25-akpm/net/ipv4/netfilter/arp_tables.c Mon Apr 3 15:56:27 2006 @@ -646,7 +646,7 @@ static int translate_table(const char *n } /* And one copy for every other CPU */ - for_each_cpu(i) { + for_each_possible_cpu(i) { if (newinfo->entries[i] && newinfo->entries[i] != entry0) memcpy(newinfo->entries[i], entry0, newinfo->size); } @@ -696,7 +696,7 @@ static void get_counters(const struct xt counters, &i); - for_each_cpu(cpu) { + for_each_possible_cpu(cpu) { if (cpu == curcpu) continue; i = 0; diff -puN net/ipv4/netfilter/ip_conntrack_core.c~for_each_possible_cpu-network-codes net/ipv4/netfilter/ip_conntrack_core.c --- 25/net/ipv4/netfilter/ip_conntrack_core.c~for_each_possible_cpu-network-codes Mon Apr 3 15:56:27 2006 +++ 25-akpm/net/ipv4/netfilter/ip_conntrack_core.c Mon Apr 3 15:56:27 2006 @@ -133,7 +133,7 @@ static void ip_ct_event_cache_flush(void struct ip_conntrack_ecache *ecache; int cpu; - for_each_cpu(cpu) { + for_each_possible_cpu(cpu) { ecache = &per_cpu(ip_conntrack_ecache, cpu); if (ecache->ct) ip_conntrack_put(ecache->ct); diff -puN net/ipv4/netfilter/ip_tables.c~for_each_possible_cpu-network-codes net/ipv4/netfilter/ip_tables.c --- 25/net/ipv4/netfilter/ip_tables.c~for_each_possible_cpu-network-codes Mon Apr 3 15:56:27 2006 +++ 25-akpm/net/ipv4/netfilter/ip_tables.c Mon Apr 3 15:56:27 2006 @@ -735,7 +735,7 @@ translate_table(const char *name, } /* And one copy for every other CPU */ - for_each_cpu(i) { + for_each_possible_cpu(i) { if (newinfo->entries[i] && newinfo->entries[i] != entry0) memcpy(newinfo->entries[i], entry0, newinfo->size); } @@ -788,7 +788,7 @@ get_counters(const struct xt_table_info counters, &i); - for_each_cpu(cpu) { + for_each_possible_cpu(cpu) { if (cpu == curcpu) continue; i = 0; diff -puN net/ipv4/proc.c~for_each_possible_cpu-network-codes net/ipv4/proc.c --- 25/net/ipv4/proc.c~for_each_possible_cpu-network-codes Mon Apr 3 15:56:27 2006 +++ 25-akpm/net/ipv4/proc.c Mon Apr 3 15:56:27 2006 @@ -49,7 +49,7 @@ static int fold_prot_inuse(struct proto int res = 0; int cpu; - for_each_cpu(cpu) + for_each_possible_cpu(cpu) res += proto->stats[cpu].inuse; return res; @@ -91,7 +91,7 @@ fold_field(void *mib[], int offt) unsigned long res = 0; int i; - for_each_cpu(i) { + for_each_possible_cpu(i) { res += *(((unsigned long *) per_cpu_ptr(mib[0], i)) + offt); res += *(((unsigned long *) per_cpu_ptr(mib[1], i)) + offt); } diff -puN net/ipv4/route.c~for_each_possible_cpu-network-codes net/ipv4/route.c --- 25/net/ipv4/route.c~for_each_possible_cpu-network-codes Mon Apr 3 15:56:27 2006 +++ 25-akpm/net/ipv4/route.c Mon Apr 3 15:56:27 2006 @@ -3083,7 +3083,7 @@ static int ip_rt_acct_read(char *buffer, memcpy(dst, src, length); /* Add the other cpus in, one int at a time */ - for_each_cpu(i) { + for_each_possible_cpu(i) { unsigned int j; src = ((u32 *) IP_RT_ACCT_CPU(i)) + offset; diff -puN net/ipv6/icmp.c~for_each_possible_cpu-network-codes net/ipv6/icmp.c --- 25/net/ipv6/icmp.c~for_each_possible_cpu-network-codes Mon Apr 3 15:56:27 2006 +++ 25-akpm/net/ipv6/icmp.c Mon Apr 3 15:56:27 2006 @@ -717,7 +717,7 @@ int __init icmpv6_init(struct net_proto_ struct sock *sk; int err, i, j; - for_each_cpu(i) { + for_each_possible_cpu(i) { err = sock_create_kern(PF_INET6, SOCK_RAW, IPPROTO_ICMPV6, &per_cpu(__icmpv6_socket, i)); if (err < 0) { @@ -763,7 +763,7 @@ void icmpv6_cleanup(void) { int i; - for_each_cpu(i) { + for_each_possible_cpu(i) { sock_release(per_cpu(__icmpv6_socket, i)); } inet6_del_protocol(&icmpv6_protocol, IPPROTO_ICMPV6); diff -puN net/ipv6/ipcomp6.c~for_each_possible_cpu-network-codes net/ipv6/ipcomp6.c --- 25/net/ipv6/ipcomp6.c~for_each_possible_cpu-network-codes Mon Apr 3 15:56:27 2006 +++ 25-akpm/net/ipv6/ipcomp6.c Mon Apr 3 15:56:27 2006 @@ -290,7 +290,7 @@ static void ipcomp6_free_scratches(void) if (!scratches) return; - for_each_cpu(i) { + for_each_possible_cpu(i) { void *scratch = *per_cpu_ptr(scratches, i); vfree(scratch); @@ -313,7 +313,7 @@ static void **ipcomp6_alloc_scratches(vo ipcomp6_scratches = scratches; - for_each_cpu(i) { + for_each_possible_cpu(i) { void *scratch = vmalloc(IPCOMP_SCRATCH_SIZE); if (!scratch) return NULL; @@ -344,7 +344,7 @@ static void ipcomp6_free_tfms(struct cry if (!tfms) return; - for_each_cpu(cpu) { + for_each_possible_cpu(cpu) { struct crypto_tfm *tfm = *per_cpu_ptr(tfms, cpu); crypto_free_tfm(tfm); } @@ -384,7 +384,7 @@ static struct crypto_tfm **ipcomp6_alloc if (!tfms) goto error; - for_each_cpu(cpu) { + for_each_possible_cpu(cpu) { struct crypto_tfm *tfm = crypto_alloc_tfm(alg_name, 0); if (!tfm) goto error; diff -puN net/ipv6/netfilter/ip6_tables.c~for_each_possible_cpu-network-codes net/ipv6/netfilter/ip6_tables.c --- 25/net/ipv6/netfilter/ip6_tables.c~for_each_possible_cpu-network-codes Mon Apr 3 15:56:27 2006 +++ 25-akpm/net/ipv6/netfilter/ip6_tables.c Mon Apr 3 15:56:27 2006 @@ -788,7 +788,7 @@ translate_table(const char *name, } /* And one copy for every other CPU */ - for_each_cpu(i) { + for_each_possible_cpu(i) { if (newinfo->entries[i] && newinfo->entries[i] != entry0) memcpy(newinfo->entries[i], entry0, newinfo->size); } @@ -841,7 +841,7 @@ get_counters(const struct xt_table_info counters, &i); - for_each_cpu(cpu) { + for_each_possible_cpu(cpu) { if (cpu == curcpu) continue; i = 0; diff -puN net/ipv6/proc.c~for_each_possible_cpu-network-codes net/ipv6/proc.c --- 25/net/ipv6/proc.c~for_each_possible_cpu-network-codes Mon Apr 3 15:56:27 2006 +++ 25-akpm/net/ipv6/proc.c Mon Apr 3 15:56:27 2006 @@ -38,7 +38,7 @@ static int fold_prot_inuse(struct proto int res = 0; int cpu; - for_each_cpu(cpu) + for_each_possible_cpu(cpu) res += proto->stats[cpu].inuse; return res; @@ -140,7 +140,7 @@ fold_field(void *mib[], int offt) unsigned long res = 0; int i; - for_each_cpu(i) { + for_each_possible_cpu(i) { res += *(((unsigned long *)per_cpu_ptr(mib[0], i)) + offt); res += *(((unsigned long *)per_cpu_ptr(mib[1], i)) + offt); } diff -puN net/netfilter/nf_conntrack_core.c~for_each_possible_cpu-network-codes net/netfilter/nf_conntrack_core.c --- 25/net/netfilter/nf_conntrack_core.c~for_each_possible_cpu-network-codes Mon Apr 3 15:56:27 2006 +++ 25-akpm/net/netfilter/nf_conntrack_core.c Mon Apr 3 15:56:27 2006 @@ -146,7 +146,7 @@ static void nf_ct_event_cache_flush(void struct nf_conntrack_ecache *ecache; int cpu; - for_each_cpu(cpu) { + for_each_possible_cpu(cpu) { ecache = &per_cpu(nf_conntrack_ecache, cpu); if (ecache->ct) nf_ct_put(ecache->ct); diff -puN net/netfilter/x_tables.c~for_each_possible_cpu-network-codes net/netfilter/x_tables.c --- 25/net/netfilter/x_tables.c~for_each_possible_cpu-network-codes Mon Apr 3 15:56:27 2006 +++ 25-akpm/net/netfilter/x_tables.c Mon Apr 3 15:56:27 2006 @@ -413,7 +413,7 @@ struct xt_table_info *xt_alloc_table_inf newinfo->size = size; - for_each_cpu(cpu) { + for_each_possible_cpu(cpu) { if (size <= PAGE_SIZE) newinfo->entries[cpu] = kmalloc_node(size, GFP_KERNEL, @@ -436,7 +436,7 @@ void xt_free_table_info(struct xt_table_ { int cpu; - for_each_cpu(cpu) { + for_each_possible_cpu(cpu) { if (info->size <= PAGE_SIZE) kfree(info->entries[cpu]); else diff -puN net/sctp/proc.c~for_each_possible_cpu-network-codes net/sctp/proc.c --- 25/net/sctp/proc.c~for_each_possible_cpu-network-codes Mon Apr 3 15:56:27 2006 +++ 25-akpm/net/sctp/proc.c Mon Apr 3 15:56:27 2006 @@ -69,7 +69,7 @@ fold_field(void *mib[], int nr) unsigned long res = 0; int i; - for_each_cpu(i) { + for_each_possible_cpu(i) { res += *((unsigned long *) (((void *) per_cpu_ptr(mib[0], i)) + sizeof (unsigned long) * nr)); diff -puN net/socket.c~for_each_possible_cpu-network-codes net/socket.c --- 25/net/socket.c~for_each_possible_cpu-network-codes Mon Apr 3 15:56:27 2006 +++ 25-akpm/net/socket.c Mon Apr 3 15:56:27 2006 @@ -2136,7 +2136,7 @@ void socket_seq_show(struct seq_file *se int cpu; int counter = 0; - for_each_cpu(cpu) + for_each_possible_cpu(cpu) counter += per_cpu(sockets_in_use, cpu); /* It can be negative, by the way. 8) */ _