hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/arch/sparc/kernel/smp_64.c
....@@ -22,7 +22,7 @@
2222 #include <linux/cache.h>
2323 #include <linux/jiffies.h>
2424 #include <linux/profile.h>
25
-#include <linux/bootmem.h>
25
+#include <linux/memblock.h>
2626 #include <linux/vmalloc.h>
2727 #include <linux/ftrace.h>
2828 #include <linux/cpu.h>
....@@ -43,11 +43,11 @@
4343 #include <asm/irq.h>
4444 #include <asm/irq_regs.h>
4545 #include <asm/page.h>
46
-#include <asm/pgtable.h>
4746 #include <asm/oplib.h>
4847 #include <linux/uaccess.h>
4948 #include <asm/starfire.h>
5049 #include <asm/tlb.h>
50
+#include <asm/pgalloc.h>
5151 #include <asm/sections.h>
5252 #include <asm/prom.h>
5353 #include <asm/mdesc.h>
....@@ -137,9 +137,6 @@
137137 rmb();
138138
139139 set_cpu_online(cpuid, true);
140
-
141
- /* idle thread is expected to have preempt disabled */
142
- preempt_disable();
143140
144141 local_irq_enable();
145142
....@@ -1014,7 +1011,7 @@
10141011 }
10151012
10161013 #ifdef CONFIG_KGDB
1017
-void kgdb_roundup_cpus(unsigned long flags)
1014
+void kgdb_roundup_cpus(void)
10181015 {
10191016 smp_cross_call(&xcall_kgdb_capture, 0, 0, 0);
10201017 }
....@@ -1551,26 +1548,26 @@
15511548 void *ptr;
15521549
15531550 if (!node_online(node) || !NODE_DATA(node)) {
1554
- ptr = __alloc_bootmem(size, align, goal);
1551
+ ptr = memblock_alloc_from(size, align, goal);
15551552 pr_info("cpu %d has no node %d or node-local memory\n",
15561553 cpu, node);
15571554 pr_debug("per cpu data for cpu%d %lu bytes at %016lx\n",
15581555 cpu, size, __pa(ptr));
15591556 } else {
1560
- ptr = __alloc_bootmem_node(NODE_DATA(node),
1561
- size, align, goal);
1557
+ ptr = memblock_alloc_try_nid(size, align, goal,
1558
+ MEMBLOCK_ALLOC_ACCESSIBLE, node);
15621559 pr_debug("per cpu data for cpu%d %lu bytes on node%d at "
15631560 "%016lx\n", cpu, size, node, __pa(ptr));
15641561 }
15651562 return ptr;
15661563 #else
1567
- return __alloc_bootmem(size, align, goal);
1564
+ return memblock_alloc_from(size, align, goal);
15681565 #endif
15691566 }
15701567
15711568 static void __init pcpu_free_bootmem(void *ptr, size_t size)
15721569 {
1573
- free_bootmem(__pa(ptr), size);
1570
+ memblock_free(__pa(ptr), size);
15741571 }
15751572
15761573 static int __init pcpu_cpu_distance(unsigned int from, unsigned int to)
....@@ -1584,21 +1581,36 @@
15841581 static void __init pcpu_populate_pte(unsigned long addr)
15851582 {
15861583 pgd_t *pgd = pgd_offset_k(addr);
1584
+ p4d_t *p4d;
15871585 pud_t *pud;
15881586 pmd_t *pmd;
15891587
15901588 if (pgd_none(*pgd)) {
15911589 pud_t *new;
15921590
1593
- new = __alloc_bootmem(PAGE_SIZE, PAGE_SIZE, PAGE_SIZE);
1591
+ new = memblock_alloc_from(PAGE_SIZE, PAGE_SIZE, PAGE_SIZE);
1592
+ if (!new)
1593
+ goto err_alloc;
15941594 pgd_populate(&init_mm, pgd, new);
15951595 }
15961596
1597
- pud = pud_offset(pgd, addr);
1597
+ p4d = p4d_offset(pgd, addr);
1598
+ if (p4d_none(*p4d)) {
1599
+ pud_t *new;
1600
+
1601
+ new = memblock_alloc_from(PAGE_SIZE, PAGE_SIZE, PAGE_SIZE);
1602
+ if (!new)
1603
+ goto err_alloc;
1604
+ p4d_populate(&init_mm, p4d, new);
1605
+ }
1606
+
1607
+ pud = pud_offset(p4d, addr);
15981608 if (pud_none(*pud)) {
15991609 pmd_t *new;
16001610
1601
- new = __alloc_bootmem(PAGE_SIZE, PAGE_SIZE, PAGE_SIZE);
1611
+ new = memblock_alloc_from(PAGE_SIZE, PAGE_SIZE, PAGE_SIZE);
1612
+ if (!new)
1613
+ goto err_alloc;
16021614 pud_populate(&init_mm, pud, new);
16031615 }
16041616
....@@ -1606,9 +1618,17 @@
16061618 if (!pmd_present(*pmd)) {
16071619 pte_t *new;
16081620
1609
- new = __alloc_bootmem(PAGE_SIZE, PAGE_SIZE, PAGE_SIZE);
1621
+ new = memblock_alloc_from(PAGE_SIZE, PAGE_SIZE, PAGE_SIZE);
1622
+ if (!new)
1623
+ goto err_alloc;
16101624 pmd_populate_kernel(&init_mm, pmd, new);
16111625 }
1626
+
1627
+ return;
1628
+
1629
+err_alloc:
1630
+ panic("%s: Failed to allocate %lu bytes align=%lx from=%lx\n",
1631
+ __func__, PAGE_SIZE, PAGE_SIZE, PAGE_SIZE);
16121632 }
16131633
16141634 void __init setup_per_cpu_areas(void)
....@@ -1624,9 +1644,9 @@
16241644 pcpu_alloc_bootmem,
16251645 pcpu_free_bootmem);
16261646 if (rc)
1627
- pr_warning("PERCPU: %s allocator failed (%d), "
1628
- "falling back to page size\n",
1629
- pcpu_fc_names[pcpu_chosen_fc], rc);
1647
+ pr_warn("PERCPU: %s allocator failed (%d), "
1648
+ "falling back to page size\n",
1649
+ pcpu_fc_names[pcpu_chosen_fc], rc);
16301650 }
16311651 if (rc < 0)
16321652 rc = pcpu_page_first_chunk(PERCPU_MODULE_RESERVE,