Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-2.6
authorLinus Torvalds <torvalds@linux-foundation.org>
Tue, 31 Mar 2009 01:46:12 +0000 (18:46 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 31 Mar 2009 01:46:12 +0000 (18:46 -0700)
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-2.6:
  sparc64: Fix reset hangs on Niagara systems.
  cpumask: use mm_cpumask() wrapper: sparc
  cpumask: remove dangerous CPU_MASK_ALL_PTR, &CPU_MASK_ALL.: sparc
  cpumask: remove the now-obsoleted pcibus_to_cpumask(): sparc
  cpumask: remove cpu_coregroup_map: sparc
  cpumask: prepare for iterators to only go to nr_cpu_ids/nr_cpumask_bits.: sparc
  cpumask: prepare for iterators to only go to nr_cpu_ids/nr_cpumask_bits.: sparc64
  cpumask: Use accessors code.: sparc64
  cpumask: Use accessors code: sparc
  cpumask: arch_send_call_function_ipi_mask: sparc
  cpumask: Use smp_call_function_many(): sparc64

15 files changed:
arch/sparc/include/asm/mmu_context_64.h
arch/sparc/include/asm/smp_64.h
arch/sparc/include/asm/system_32.h
arch/sparc/include/asm/topology_64.h
arch/sparc/kernel/ds.c
arch/sparc/kernel/irq_64.c
arch/sparc/kernel/mdesc.c
arch/sparc/kernel/nmi.c
arch/sparc/kernel/prom_64.c
arch/sparc/kernel/smp_32.c
arch/sparc/kernel/smp_64.c
arch/sparc/kernel/sun4d_smp.c
arch/sparc/kernel/sun4m_smp.c
arch/sparc/mm/init_64.c
arch/sparc/mm/srmmu.c

index 5693ab4826067056873803b6324b437e6275453f..666a73fef28dad76765a89eab95bb93c3eee232c 100644 (file)
@@ -121,8 +121,8 @@ static inline void switch_mm(struct mm_struct *old_mm, struct mm_struct *mm, str
         * local TLB.
         */
        cpu = smp_processor_id();
-       if (!ctx_valid || !cpu_isset(cpu, mm->cpu_vm_mask)) {
-               cpu_set(cpu, mm->cpu_vm_mask);
+       if (!ctx_valid || !cpumask_test_cpu(cpu, mm_cpumask(mm))) {
+               cpumask_set_cpu(cpu, mm_cpumask(mm));
                __flush_tlb_mm(CTX_HWBITS(mm->context),
                               SECONDARY_CONTEXT);
        }
@@ -141,8 +141,8 @@ static inline void activate_mm(struct mm_struct *active_mm, struct mm_struct *mm
        if (!CTX_VALID(mm->context))
                get_new_mmu_context(mm);
        cpu = smp_processor_id();
-       if (!cpu_isset(cpu, mm->cpu_vm_mask))
-               cpu_set(cpu, mm->cpu_vm_mask);
+       if (!cpumask_test_cpu(cpu, mm_cpumask(mm)))
+               cpumask_set_cpu(cpu, mm_cpumask(mm));
 
        load_secondary_context(mm);
        __flush_tlb_mm(CTX_HWBITS(mm->context), SECONDARY_CONTEXT);
index 57224dd37b3a59967bdf5ee7e527f551ec700229..becb6bf353a9c36de3b40c3d7dcbc4b80a5e6c47 100644 (file)
@@ -35,7 +35,8 @@ extern cpumask_t cpu_core_map[NR_CPUS];
 extern int sparc64_multi_core;
 
 extern void arch_send_call_function_single_ipi(int cpu);
-extern void arch_send_call_function_ipi(cpumask_t mask);
+extern void arch_send_call_function_ipi_mask(const struct cpumask *mask);
+#define arch_send_call_function_ipi_mask arch_send_call_function_ipi_mask
 
 /*
  *     General functions that each host system must provide.
index 79c1ae2b42a346ec11aa284a9719a926212741f3..751c8c17f5a037df797dbb148cf72d39f0521c93 100644 (file)
@@ -126,7 +126,7 @@ extern void flushw_all(void);
 #define switch_to(prev, next, last) do {                                               \
        SWITCH_ENTER(prev);                                                             \
        SWITCH_DO_LAZY_FPU(next);                                                       \
-       cpu_set(smp_processor_id(), next->active_mm->cpu_vm_mask);                      \
+       cpumask_set_cpu(smp_processor_id(), mm_cpumask(next->active_mm));               \
        __asm__ __volatile__(                                                           \
        "sethi  %%hi(here - 0x8), %%o7\n\t"                                             \
        "mov    %%g6, %%g3\n\t"                                                         \
index 2770f64fdc3b59edc23714d7afad0367d19ac822..e5ea8d332421d1ad1441541c8e013d62d099e444 100644 (file)
@@ -38,13 +38,9 @@ static inline int pcibus_to_node(struct pci_bus *pbus)
 }
 #endif
 
-#define pcibus_to_cpumask(bus) \
-       (pcibus_to_node(bus) == -1 ? \
-        CPU_MASK_ALL : \
-        node_to_cpumask(pcibus_to_node(bus)))
 #define cpumask_of_pcibus(bus) \
        (pcibus_to_node(bus) == -1 ? \
-        CPU_MASK_ALL_PTR : \
+        cpu_all_mask : \
         cpumask_of_node(pcibus_to_node(bus)))
 
 #define SD_NODE_INIT (struct sched_domain) {           \
@@ -84,7 +80,6 @@ static inline int pcibus_to_node(struct pci_bus *pbus)
 #define smt_capable()                          (sparc64_multi_core)
 #endif /* CONFIG_SMP */
 
-#define cpu_coregroup_map(cpu)                 (cpu_core_map[cpu])
 #define cpu_coregroup_mask(cpu)                        (&cpu_core_map[cpu])
 
 #endif /* _ASM_SPARC64_TOPOLOGY_H */
index 57c39843fb2a446c68849e5326496d4e5756cd0d..90350f838f05efa92a9739d4e4a03079f5f0ae55 100644 (file)
@@ -653,7 +653,7 @@ static void __cpuinit dr_cpu_data(struct ds_info *dp,
                if (cpu_list[i] == CPU_SENTINEL)
                        continue;
 
-               if (cpu_list[i] < NR_CPUS)
+               if (cpu_list[i] < nr_cpu_ids)
                        cpu_set(cpu_list[i], mask);
        }
 
index d0d6a515499ac952f487a49e389b2bdd5519bd02..5deabe921a47b6ebdcd5f6371faf7eaab3c135e4 100644 (file)
@@ -266,12 +266,12 @@ static int irq_choose_cpu(unsigned int virt_irq)
                spin_lock_irqsave(&irq_rover_lock, flags);
 
                while (!cpu_online(irq_rover)) {
-                       if (++irq_rover >= NR_CPUS)
+                       if (++irq_rover >= nr_cpu_ids)
                                irq_rover = 0;
                }
                cpuid = irq_rover;
                do {
-                       if (++irq_rover >= NR_CPUS)
+                       if (++irq_rover >= nr_cpu_ids)
                                irq_rover = 0;
                } while (!cpu_online(irq_rover));
 
index 3f79f0c23a084d4a80ae572be79db9e0f747d66c..f0e6ed23a468ec10c6b7ba78ad8d5890295f7f82 100644 (file)
@@ -567,7 +567,7 @@ static void __init report_platform_properties(void)
                        max_cpu = NR_CPUS;
                }
                for (i = 0; i < max_cpu; i++)
-                       cpu_set(i, cpu_possible_map);
+                       set_cpu_possible(i, true);
        }
 #endif
 
index f3577223c8630e2d40002c72026755c72bb3bcfe..2c0cc72d295b079cfab695197eff38fcbd54d586 100644 (file)
@@ -13,6 +13,7 @@
 #include <linux/module.h>
 #include <linux/kprobes.h>
 #include <linux/kernel_stat.h>
+#include <linux/reboot.h>
 #include <linux/slab.h>
 #include <linux/kdebug.h>
 #include <linux/delay.h>
@@ -206,13 +207,33 @@ void nmi_adjust_hz(unsigned int new_hz)
 }
 EXPORT_SYMBOL_GPL(nmi_adjust_hz);
 
+static int nmi_shutdown(struct notifier_block *nb, unsigned long cmd, void *p)
+{
+       on_each_cpu(stop_watchdog, NULL, 1);
+       return 0;
+}
+
+static struct notifier_block nmi_reboot_notifier = {
+       .notifier_call = nmi_shutdown,
+};
+
 int __init nmi_init(void)
 {
+       int err;
+
        nmi_usable = 1;
 
        on_each_cpu(start_watchdog, NULL, 1);
 
-       return check_nmi_watchdog();
+       err = check_nmi_watchdog();
+       if (!err) {
+               err = register_reboot_notifier(&nmi_reboot_notifier);
+               if (err) {
+                       nmi_usable = 0;
+                       on_each_cpu(stop_watchdog, NULL, 1);
+               }
+       }
+       return err;
 }
 
 static int __init setup_nmi_watchdog(char *str)
index edecca7b811655546a7aba9d108414ae36c31703..ca55c7012f7751d4338a1c6fc1153124ef0f6966 100644 (file)
@@ -518,8 +518,8 @@ void __init of_fill_in_cpu_data(void)
                }
 
 #ifdef CONFIG_SMP
-               cpu_set(cpuid, cpu_present_map);
-               cpu_set(cpuid, cpu_possible_map);
+               set_cpu_present(cpuid, true);
+               set_cpu_possible(cpuid, true);
 #endif
        }
 
index 1e5ac4e282e1285030aaa43380b91c01b7bcff48..132d81fb26162657b0391a11e56e23fce9bf604d 100644 (file)
@@ -70,13 +70,12 @@ void __init smp_cpus_done(unsigned int max_cpus)
        extern void smp4m_smp_done(void);
        extern void smp4d_smp_done(void);
        unsigned long bogosum = 0;
-       int cpu, num;
+       int cpu, num = 0;
 
-       for (cpu = 0, num = 0; cpu < NR_CPUS; cpu++)
-               if (cpu_online(cpu)) {
-                       num++;
-                       bogosum += cpu_data(cpu).udelay_val;
-               }
+       for_each_online_cpu(cpu) {
+               num++;
+               bogosum += cpu_data(cpu).udelay_val;
+       }
 
        printk("Total of %d processors activated (%lu.%02lu BogoMIPS).\n",
                num, bogosum/(500000/HZ),
@@ -144,7 +143,7 @@ void smp_flush_tlb_all(void)
 void smp_flush_cache_mm(struct mm_struct *mm)
 {
        if(mm->context != NO_CONTEXT) {
-               cpumask_t cpu_mask = mm->cpu_vm_mask;
+               cpumask_t cpu_mask = *mm_cpumask(mm);
                cpu_clear(smp_processor_id(), cpu_mask);
                if (!cpus_empty(cpu_mask))
                        xc1((smpfunc_t) BTFIXUP_CALL(local_flush_cache_mm), (unsigned long) mm);
@@ -155,12 +154,13 @@ void smp_flush_cache_mm(struct mm_struct *mm)
 void smp_flush_tlb_mm(struct mm_struct *mm)
 {
        if(mm->context != NO_CONTEXT) {
-               cpumask_t cpu_mask = mm->cpu_vm_mask;
+               cpumask_t cpu_mask = *mm_cpumask(mm);
                cpu_clear(smp_processor_id(), cpu_mask);
                if (!cpus_empty(cpu_mask)) {
                        xc1((smpfunc_t) BTFIXUP_CALL(local_flush_tlb_mm), (unsigned long) mm);
                        if(atomic_read(&mm->mm_users) == 1 && current->active_mm == mm)
-                               mm->cpu_vm_mask = cpumask_of_cpu(smp_processor_id());
+                               cpumask_copy(mm_cpumask(mm),
+                                            cpumask_of(smp_processor_id()));
                }
                local_flush_tlb_mm(mm);
        }
@@ -172,7 +172,7 @@ void smp_flush_cache_range(struct vm_area_struct *vma, unsigned long start,
        struct mm_struct *mm = vma->vm_mm;
 
        if (mm->context != NO_CONTEXT) {
-               cpumask_t cpu_mask = mm->cpu_vm_mask;
+               cpumask_t cpu_mask = *mm_cpumask(mm);
                cpu_clear(smp_processor_id(), cpu_mask);
                if (!cpus_empty(cpu_mask))
                        xc3((smpfunc_t) BTFIXUP_CALL(local_flush_cache_range), (unsigned long) vma, start, end);
@@ -186,7 +186,7 @@ void smp_flush_tlb_range(struct vm_area_struct *vma, unsigned long start,
        struct mm_struct *mm = vma->vm_mm;
 
        if (mm->context != NO_CONTEXT) {
-               cpumask_t cpu_mask = mm->cpu_vm_mask;
+               cpumask_t cpu_mask = *mm_cpumask(mm);
                cpu_clear(smp_processor_id(), cpu_mask);
                if (!cpus_empty(cpu_mask))
                        xc3((smpfunc_t) BTFIXUP_CALL(local_flush_tlb_range), (unsigned long) vma, start, end);
@@ -199,7 +199,7 @@ void smp_flush_cache_page(struct vm_area_struct *vma, unsigned long page)
        struct mm_struct *mm = vma->vm_mm;
 
        if(mm->context != NO_CONTEXT) {
-               cpumask_t cpu_mask = mm->cpu_vm_mask;
+               cpumask_t cpu_mask = *mm_cpumask(mm);
                cpu_clear(smp_processor_id(), cpu_mask);
                if (!cpus_empty(cpu_mask))
                        xc2((smpfunc_t) BTFIXUP_CALL(local_flush_cache_page), (unsigned long) vma, page);
@@ -212,7 +212,7 @@ void smp_flush_tlb_page(struct vm_area_struct *vma, unsigned long page)
        struct mm_struct *mm = vma->vm_mm;
 
        if(mm->context != NO_CONTEXT) {
-               cpumask_t cpu_mask = mm->cpu_vm_mask;
+               cpumask_t cpu_mask = *mm_cpumask(mm);
                cpu_clear(smp_processor_id(), cpu_mask);
                if (!cpus_empty(cpu_mask))
                        xc2((smpfunc_t) BTFIXUP_CALL(local_flush_tlb_page), (unsigned long) vma, page);
@@ -241,7 +241,7 @@ void smp_flush_page_to_ram(unsigned long page)
 
 void smp_flush_sig_insns(struct mm_struct *mm, unsigned long insn_addr)
 {
-       cpumask_t cpu_mask = mm->cpu_vm_mask;
+       cpumask_t cpu_mask = *mm_cpumask(mm);
        cpu_clear(smp_processor_id(), cpu_mask);
        if (!cpus_empty(cpu_mask))
                xc2((smpfunc_t) BTFIXUP_CALL(local_flush_sig_insns), (unsigned long) mm, insn_addr);
@@ -332,8 +332,8 @@ void __init smp_setup_cpu_possible_map(void)
        instance = 0;
        while (!cpu_find_by_instance(instance, NULL, &mid)) {
                if (mid < NR_CPUS) {
-                       cpu_set(mid, cpu_possible_map);
-                       cpu_set(mid, cpu_present_map);
+                       set_cpu_possible(mid, true);
+                       set_cpu_present(mid, true);
                }
                instance++;
        }
@@ -351,8 +351,8 @@ void __init smp_prepare_boot_cpu(void)
                printk("boot cpu id != 0, this could work but is untested\n");
 
        current_thread_info()->cpu = cpuid;
-       cpu_set(cpuid, cpu_online_map);
-       cpu_set(cpuid, cpu_possible_map);
+       set_cpu_online(cpuid, true);
+       set_cpu_possible(cpuid, true);
 }
 
 int __cpuinit __cpu_up(unsigned int cpu)
index 79457f682b5ac05b693d185223ddd7ea8f9335b6..708e12a26b0528919065429d66c1bdf32ab4a5aa 100644 (file)
@@ -808,9 +808,9 @@ static void smp_start_sync_tick_client(int cpu)
 
 extern unsigned long xcall_call_function;
 
-void arch_send_call_function_ipi(cpumask_t mask)
+void arch_send_call_function_ipi_mask(const struct cpumask *mask)
 {
-       xcall_deliver((u64) &xcall_call_function, 0, 0, &mask);
+       xcall_deliver((u64) &xcall_call_function, 0, 0, mask);
 }
 
 extern unsigned long xcall_call_function_single;
@@ -850,7 +850,7 @@ static void tsb_sync(void *info)
 
 void smp_tsb_sync(struct mm_struct *mm)
 {
-       smp_call_function_mask(mm->cpu_vm_mask, tsb_sync, mm, 1);
+       smp_call_function_many(mm_cpumask(mm), tsb_sync, mm, 1);
 }
 
 extern unsigned long xcall_flush_tlb_mm;
@@ -1055,13 +1055,13 @@ void smp_flush_tlb_mm(struct mm_struct *mm)
        int cpu = get_cpu();
 
        if (atomic_read(&mm->mm_users) == 1) {
-               mm->cpu_vm_mask = cpumask_of_cpu(cpu);
+               cpumask_copy(mm_cpumask(mm), cpumask_of(cpu));
                goto local_flush_and_out;
        }
 
        smp_cross_call_masked(&xcall_flush_tlb_mm,
                              ctx, 0, 0,
-                             &mm->cpu_vm_mask);
+                             mm_cpumask(mm));
 
 local_flush_and_out:
        __flush_tlb_mm(ctx, SECONDARY_CONTEXT);
@@ -1075,11 +1075,11 @@ void smp_flush_tlb_pending(struct mm_struct *mm, unsigned long nr, unsigned long
        int cpu = get_cpu();
 
        if (mm == current->mm && atomic_read(&mm->mm_users) == 1)
-               mm->cpu_vm_mask = cpumask_of_cpu(cpu);
+               cpumask_copy(mm_cpumask(mm), cpumask_of(cpu));
        else
                smp_cross_call_masked(&xcall_flush_tlb_pending,
                                      ctx, nr, (unsigned long) vaddrs,
-                                     &mm->cpu_vm_mask);
+                                     mm_cpumask(mm));
 
        __flush_tlb_pending(ctx, nr, vaddrs);
 
index 50afaed99c8a13d74b4e873eca58c5528563ba48..54fb02468f0d57ef00ce78c610609ba43d0c1702 100644 (file)
@@ -150,7 +150,7 @@ void __cpuinit smp4d_callin(void)
        spin_lock_irqsave(&sun4d_imsk_lock, flags);
        cc_set_imsk(cc_get_imsk() & ~0x4000); /* Allow PIL 14 as well */
        spin_unlock_irqrestore(&sun4d_imsk_lock, flags);
-       cpu_set(cpuid, cpu_online_map);
+       set_cpu_online(cpuid, true);
 
 }
 
@@ -228,11 +228,10 @@ void __init smp4d_smp_done(void)
        /* setup cpu list for irq rotation */
        first = 0;
        prev = &first;
-       for (i = 0; i < NR_CPUS; i++)
-               if (cpu_online(i)) {
-                       *prev = i;
-                       prev = &cpu_data(i).next;
-               }
+       for_each_online_cpu(i) {
+               *prev = i;
+               prev = &cpu_data(i).next;
+       }
        *prev = first;
        local_flush_cache_all();
 
index 8040376c4890cc11c95e7c783f331abc7becb456..960b113d0006f4ff61de665c2383dd4b522a4622 100644 (file)
@@ -113,7 +113,7 @@ void __cpuinit smp4m_callin(void)
 
        local_irq_enable();
 
-       cpu_set(cpuid, cpu_online_map);
+       set_cpu_online(cpuid, true);
 }
 
 /*
@@ -186,11 +186,9 @@ void __init smp4m_smp_done(void)
        /* setup cpu list for irq rotation */
        first = 0;
        prev = &first;
-       for (i = 0; i < NR_CPUS; i++) {
-               if (cpu_online(i)) {
-                       *prev = i;
-                       prev = &cpu_data(i).next;
-               }
+       for_each_online_cpu(i) {
+               *prev = i;
+               prev = &cpu_data(i).next;
        }
        *prev = first;
        local_flush_cache_all();
index 00373ce2d8fbd872f838ece2de6cd49afd6e45a7..2c8dfeb7ab04b24634bba62532f6ac62a510059b 100644 (file)
@@ -1092,7 +1092,7 @@ static void __init numa_parse_mdesc_group_cpus(struct mdesc_handle *md,
                if (strcmp(name, "cpu"))
                        continue;
                id = mdesc_get_property(md, target, "id", NULL);
-               if (*id < NR_CPUS)
+               if (*id < nr_cpu_ids)
                        cpu_set(*id, *mask);
        }
 }
index fe7ed08390bb720e1c4be141aa5a072f58b843ec..06c9a7d98206f0256c23a281381bf2d6ab7ca441 100644 (file)
@@ -1425,7 +1425,7 @@ static void __init init_vac_layout(void)
                                min_line_size = vac_line_size;
                        //FIXME: cpus not contiguous!!
                        cpu++;
-                       if (cpu >= NR_CPUS || !cpu_online(cpu))
+                       if (cpu >= nr_cpu_ids || !cpu_online(cpu))
                                break;
 #else
                        break;