Merge commit 'v2.6.26-rc9' into cpus4096
Ingo Molnar [Sun, 6 Jul 2008 12:23:39 +0000 (14:23 +0200)]
12 files changed:
1  2 
arch/x86/kernel/cpu/cpufreq/powernow-k8.c
arch/x86/kernel/smpboot.c
drivers/cpufreq/cpufreq.c
include/linux/cpumask.h
kernel/rcuclassic.c
kernel/rcupreempt.c
kernel/sched.c
kernel/sched_fair.c
kernel/sched_rt.c
kernel/workqueue.c
mm/allocpercpu.c
net/core/dev.c

Simple merge
Simple merge
@@@ -351,49 -343,20 +351,53 @@@ static inline void __cpus_fold(cpumask_
        bitmap_fold(dstp->bits, origp->bits, sz, nbits);
  }
  
 -#if NR_CPUS > 1
 -#define for_each_cpu_mask(cpu, mask)          \
 -      for ((cpu) = first_cpu(mask);           \
 -              (cpu) < NR_CPUS;                \
 -              (cpu) = next_cpu((cpu), (mask)))
 -#else /* NR_CPUS == 1 */
 -#define for_each_cpu_mask(cpu, mask)          \
 +#if NR_CPUS == 1
 +
 +#define nr_cpu_ids            1
 +#define first_cpu(src)                ({ (void)(src); 0; })
 +#define next_cpu(n, src)      ({ (void)(src); 1; })
 +#define any_online_cpu(mask)  0
 +#define for_each_cpu_mask(cpu, mask)  \
        for ((cpu) = 0; (cpu) < 1; (cpu)++, (void)mask)
 -#endif /* NR_CPUS */
 +
 +#else /* NR_CPUS > 1 */
 +
 +extern int nr_cpu_ids;
 +int __first_cpu(const cpumask_t *srcp);
 +int __next_cpu(int n, const cpumask_t *srcp);
 +int __any_online_cpu(const cpumask_t *mask);
 +
 +#define first_cpu(src)                __first_cpu(&(src))
 +#define next_cpu(n, src)      __next_cpu((n), &(src))
 +#define any_online_cpu(mask) __any_online_cpu(&(mask))
 +#define for_each_cpu_mask(cpu, mask)                  \
 +      for ((cpu) = -1;                                \
 +              (cpu) = next_cpu((cpu), (mask)),        \
 +              (cpu) < NR_CPUS; )
 +#endif
 +
 +#if NR_CPUS <= 64
 +
 +#define next_cpu_nr(n, src)           next_cpu(n, src)
 +#define cpus_weight_nr(cpumask)               cpus_weight(cpumask)
 +#define for_each_cpu_mask_nr(cpu, mask)       for_each_cpu_mask(cpu, mask)
 +
 +#else /* NR_CPUS > 64 */
 +
 +int __next_cpu_nr(int n, const cpumask_t *srcp);
 +#define next_cpu_nr(n, src)   __next_cpu_nr((n), &(src))
 +#define cpus_weight_nr(cpumask)       __cpus_weight(&(cpumask), nr_cpu_ids)
 +#define for_each_cpu_mask_nr(cpu, mask)                       \
 +      for ((cpu) = -1;                                \
 +              (cpu) = next_cpu_nr((cpu), (mask)),     \
 +              (cpu) < nr_cpu_ids; )
 +
 +#endif /* NR_CPUS > 64 */
  
+ #define next_cpu_nr(n, src)           next_cpu(n, src)
+ #define cpus_weight_nr(cpumask)               cpus_weight(cpumask)
+ #define for_each_cpu_mask_nr(cpu, mask)       for_each_cpu_mask(cpu, mask)
  /*
   * The following particular system cpumasks and operations manage
   * possible, present and online cpus.  Each of them is a fixed size
@@@ -89,10 -89,24 +89,24 @@@ static void force_quiescent_state(struc
                /*
                 * Don't send IPI to itself. With irqs disabled,
                 * rdp->cpu is the current cpu.
+                *
+                * cpu_online_map is updated by the _cpu_down()
+                * using stop_machine_run(). Since we're in irqs disabled
+                * section, stop_machine_run() is not exectuting, hence
+                * the cpu_online_map is stable.
+                *
+                * However,  a cpu might have been offlined _just_ before
+                * we disabled irqs while entering here.
+                * And rcu subsystem might not yet have handled the CPU_DEAD
+                * notification, leading to the offlined cpu's bit
+                * being set in the rcp->cpumask.
+                *
+                * Hence cpumask = (rcp->cpumask & cpu_online_map) to prevent
+                * sending smp_reschedule() to an offlined CPU.
                 */
-               cpumask = rcp->cpumask;
+               cpus_and(cpumask, rcp->cpumask, cpu_online_map);
                cpu_clear(rdp->cpu, cpumask);
 -              for_each_cpu_mask(cpu, cpumask)
 +              for_each_cpu_mask_nr(cpu, cpumask)
                        smp_send_reschedule(cpu);
        }
  }
Simple merge
diff --cc kernel/sched.c
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
diff --cc net/core/dev.c
Simple merge