]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - arch/sparc/kernel/smp_64.c
Merge branch 'for-3.20' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/wq
[karo-tx-linux.git] / arch / sparc / kernel / smp_64.c
index f7ba87543e5ff092e723a14cf6df8403e343ac4c..da6f1a7fc4db4713425d1927af185cb797b4c1fc 100644 (file)
@@ -816,13 +816,17 @@ void arch_send_call_function_single_ipi(int cpu)
 void __irq_entry smp_call_function_client(int irq, struct pt_regs *regs)
 {
        clear_softint(1 << irq);
+       irq_enter();
        generic_smp_call_function_interrupt();
+       irq_exit();
 }
 
 void __irq_entry smp_call_function_single_client(int irq, struct pt_regs *regs)
 {
        clear_softint(1 << irq);
+       irq_enter();
        generic_smp_call_function_single_interrupt();
+       irq_exit();
 }
 
 static void tsb_sync(void *info)
@@ -1138,7 +1142,7 @@ static unsigned long penguins_are_doing_time;
 
 void smp_capture(void)
 {
-       int result = atomic_add_ret(1, &smp_capture_depth);
+       int result = atomic_add_return(1, &smp_capture_depth);
 
        if (result == 1) {
                int ncpus = num_online_cpus();
@@ -1467,6 +1471,13 @@ static void __init pcpu_populate_pte(unsigned long addr)
        pud_t *pud;
        pmd_t *pmd;
 
+       if (pgd_none(*pgd)) {
+               pud_t *new;
+
+               new = __alloc_bootmem(PAGE_SIZE, PAGE_SIZE, PAGE_SIZE);
+               pgd_populate(&init_mm, pgd, new);
+       }
+
        pud = pud_offset(pgd, addr);
        if (pud_none(*pud)) {
                pmd_t *new;