hc
2024-05-10 748e4f3d702def1a4bff191e0cf93b6a05340f01
kernel/arch/sparc/mm/init_64.c
....@@ -11,7 +11,7 @@
1111 #include <linux/sched.h>
1212 #include <linux/string.h>
1313 #include <linux/init.h>
14
-#include <linux/bootmem.h>
14
+#include <linux/memblock.h>
1515 #include <linux/mm.h>
1616 #include <linux/hugetlb.h>
1717 #include <linux/initrd.h>
....@@ -25,14 +25,12 @@
2525 #include <linux/sort.h>
2626 #include <linux/ioport.h>
2727 #include <linux/percpu.h>
28
-#include <linux/memblock.h>
2928 #include <linux/mmzone.h>
3029 #include <linux/gfp.h>
3130
3231 #include <asm/head.h>
3332 #include <asm/page.h>
3433 #include <asm/pgalloc.h>
35
-#include <asm/pgtable.h>
3634 #include <asm/oplib.h>
3735 #include <asm/iommu.h>
3836 #include <asm/io.h>
....@@ -326,23 +324,12 @@
326324 }
327325
328326 #ifdef CONFIG_HUGETLB_PAGE
329
-static void __init add_huge_page_size(unsigned long size)
330
-{
331
- unsigned int order;
332
-
333
- if (size_to_hstate(size))
334
- return;
335
-
336
- order = ilog2(size) - PAGE_SHIFT;
337
- hugetlb_add_hstate(order);
338
-}
339
-
340327 static int __init hugetlbpage_init(void)
341328 {
342
- add_huge_page_size(1UL << HPAGE_64K_SHIFT);
343
- add_huge_page_size(1UL << HPAGE_SHIFT);
344
- add_huge_page_size(1UL << HPAGE_256MB_SHIFT);
345
- add_huge_page_size(1UL << HPAGE_2GB_SHIFT);
329
+ hugetlb_add_hstate(HPAGE_64K_SHIFT - PAGE_SHIFT);
330
+ hugetlb_add_hstate(HPAGE_SHIFT - PAGE_SHIFT);
331
+ hugetlb_add_hstate(HPAGE_256MB_SHIFT - PAGE_SHIFT);
332
+ hugetlb_add_hstate(HPAGE_2GB_SHIFT - PAGE_SHIFT);
346333
347334 return 0;
348335 }
....@@ -361,16 +348,11 @@
361348 __asm__ __volatile__("flush %0" : : "r" (addr));
362349 }
363350
364
-static int __init setup_hugepagesz(char *string)
351
+bool __init arch_hugetlb_valid_size(unsigned long size)
365352 {
366
- unsigned long long hugepage_size;
367
- unsigned int hugepage_shift;
353
+ unsigned int hugepage_shift = ilog2(size);
368354 unsigned short hv_pgsz_idx;
369355 unsigned int hv_pgsz_mask;
370
- int rc = 0;
371
-
372
- hugepage_size = memparse(string, &string);
373
- hugepage_shift = ilog2(hugepage_size);
374356
375357 switch (hugepage_shift) {
376358 case HPAGE_16GB_SHIFT:
....@@ -398,20 +380,11 @@
398380 hv_pgsz_mask = 0;
399381 }
400382
401
- if ((hv_pgsz_mask & cpu_pgsz_mask) == 0U) {
402
- hugetlb_bad_size();
403
- pr_err("hugepagesz=%llu not supported by MMU.\n",
404
- hugepage_size);
405
- goto out;
406
- }
383
+ if ((hv_pgsz_mask & cpu_pgsz_mask) == 0U)
384
+ return false;
407385
408
- add_huge_page_size(hugepage_size);
409
- rc = 1;
410
-
411
-out:
412
- return rc;
386
+ return true;
413387 }
414
-__setup("hugepagesz=", setup_hugepagesz);
415388 #endif /* CONFIG_HUGETLB_PAGE */
416389
417390 void update_mmu_cache(struct vm_area_struct *vma, unsigned long address, pte_t *ptep)
....@@ -530,10 +503,7 @@
530503 if (kaddr >= PAGE_OFFSET)
531504 paddr = kaddr & mask;
532505 else {
533
- pgd_t *pgdp = pgd_offset_k(kaddr);
534
- pud_t *pudp = pud_offset(pgdp, kaddr);
535
- pmd_t *pmdp = pmd_offset(pudp, kaddr);
536
- pte_t *ptep = pte_offset_kernel(pmdp, kaddr);
506
+ pte_t *ptep = virt_to_kpte(kaddr);
537507
538508 paddr = pte_val(*ptep) & mask;
539509 }
....@@ -977,13 +947,13 @@
977947 {
978948 int prev_nid, new_nid;
979949
980
- prev_nid = -1;
950
+ prev_nid = NUMA_NO_NODE;
981951 for ( ; start < end; start += PAGE_SIZE) {
982952 for (new_nid = 0; new_nid < num_node_masks; new_nid++) {
983953 struct node_mem_mask *p = &node_masks[new_nid];
984954
985955 if ((start & p->mask) == p->match) {
986
- if (prev_nid == -1)
956
+ if (prev_nid == NUMA_NO_NODE)
987957 prev_nid = new_nid;
988958 break;
989959 }
....@@ -1090,15 +1060,13 @@
10901060 struct pglist_data *p;
10911061 unsigned long start_pfn, end_pfn;
10921062 #ifdef CONFIG_NEED_MULTIPLE_NODES
1093
- unsigned long paddr;
10941063
1095
- paddr = memblock_alloc_try_nid(sizeof(struct pglist_data), SMP_CACHE_BYTES, nid);
1096
- if (!paddr) {
1064
+ NODE_DATA(nid) = memblock_alloc_node(sizeof(struct pglist_data),
1065
+ SMP_CACHE_BYTES, nid);
1066
+ if (!NODE_DATA(nid)) {
10971067 prom_printf("Cannot allocate pglist_data for nid[%d]\n", nid);
10981068 prom_halt();
10991069 }
1100
- NODE_DATA(nid) = __va(paddr);
1101
- memset(NODE_DATA(nid), 0, sizeof(struct pglist_data));
11021070
11031071 NODE_DATA(nid)->node_id = nid;
11041072 #endif
....@@ -1208,7 +1176,7 @@
12081176 md = mdesc_grab();
12091177
12101178 count = 0;
1211
- nid = -1;
1179
+ nid = NUMA_NO_NODE;
12121180 mdesc_for_each_node_by_name(md, grp, "group") {
12131181 if (!scan_arcs_for_cfg_handle(md, grp, cfg_handle)) {
12141182 nid = count;
....@@ -1224,18 +1192,14 @@
12241192
12251193 static void __init add_node_ranges(void)
12261194 {
1227
- struct memblock_region *reg;
1195
+ phys_addr_t start, end;
12281196 unsigned long prev_max;
1197
+ u64 i;
12291198
12301199 memblock_resized:
12311200 prev_max = memblock.memory.max;
12321201
1233
- for_each_memblock(memory, reg) {
1234
- unsigned long size = reg->size;
1235
- unsigned long start, end;
1236
-
1237
- start = reg->base;
1238
- end = start + size;
1202
+ for_each_mem_range(i, &start, &end) {
12391203 while (start < end) {
12401204 unsigned long this_end;
12411205 int nid;
....@@ -1243,7 +1207,7 @@
12431207 this_end = memblock_nid_range(start, end, &nid);
12441208
12451209 numadbg("Setting memblock NUMA node nid[%d] "
1246
- "start[%lx] end[%lx]\n",
1210
+ "start[%llx] end[%lx]\n",
12471211 nid, start, this_end);
12481212
12491213 memblock_set_node(start, this_end - start,
....@@ -1266,8 +1230,8 @@
12661230 if (!count)
12671231 return -ENOENT;
12681232
1269
- paddr = memblock_alloc(count * sizeof(struct mdesc_mlgroup),
1270
- SMP_CACHE_BYTES);
1233
+ paddr = memblock_phys_alloc(count * sizeof(struct mdesc_mlgroup),
1234
+ SMP_CACHE_BYTES);
12711235 if (!paddr)
12721236 return -ENOMEM;
12731237
....@@ -1307,8 +1271,8 @@
13071271 if (!count)
13081272 return -ENOENT;
13091273
1310
- paddr = memblock_alloc(count * sizeof(struct mdesc_mblock),
1311
- SMP_CACHE_BYTES);
1274
+ paddr = memblock_phys_alloc(count * sizeof(struct mdesc_mblock),
1275
+ SMP_CACHE_BYTES);
13121276 if (!paddr)
13131277 return -ENOMEM;
13141278
....@@ -1642,7 +1606,6 @@
16421606
16431607 /* XXX cpu notifier XXX */
16441608
1645
- sparse_memory_present_with_active_regions(MAX_NUMNODES);
16461609 sparse_init();
16471610
16481611 return end_pfn;
....@@ -1656,6 +1619,7 @@
16561619 bool kern_addr_valid(unsigned long addr)
16571620 {
16581621 pgd_t *pgd;
1622
+ p4d_t *p4d;
16591623 pud_t *pud;
16601624 pmd_t *pmd;
16611625 pte_t *pte;
....@@ -1675,25 +1639,29 @@
16751639
16761640 pgd = pgd_offset_k(addr);
16771641 if (pgd_none(*pgd))
1678
- return 0;
1642
+ return false;
16791643
1680
- pud = pud_offset(pgd, addr);
1644
+ p4d = p4d_offset(pgd, addr);
1645
+ if (p4d_none(*p4d))
1646
+ return false;
1647
+
1648
+ pud = pud_offset(p4d, addr);
16811649 if (pud_none(*pud))
1682
- return 0;
1650
+ return false;
16831651
16841652 if (pud_large(*pud))
16851653 return pfn_valid(pud_pfn(*pud));
16861654
16871655 pmd = pmd_offset(pud, addr);
16881656 if (pmd_none(*pmd))
1689
- return 0;
1657
+ return false;
16901658
16911659 if (pmd_large(*pmd))
16921660 return pfn_valid(pmd_pfn(*pmd));
16931661
16941662 pte = pte_offset_kernel(pmd, addr);
16951663 if (pte_none(*pte))
1696
- return 0;
1664
+ return false;
16971665
16981666 return pfn_valid(pte_pfn(*pte));
16991667 }
....@@ -1803,6 +1771,7 @@
18031771 while (vstart < vend) {
18041772 unsigned long this_end, paddr = __pa(vstart);
18051773 pgd_t *pgd = pgd_offset_k(vstart);
1774
+ p4d_t *p4d;
18061775 pud_t *pud;
18071776 pmd_t *pmd;
18081777 pte_t *pte;
....@@ -1810,11 +1779,27 @@
18101779 if (pgd_none(*pgd)) {
18111780 pud_t *new;
18121781
1813
- new = __alloc_bootmem(PAGE_SIZE, PAGE_SIZE, PAGE_SIZE);
1782
+ new = memblock_alloc_from(PAGE_SIZE, PAGE_SIZE,
1783
+ PAGE_SIZE);
1784
+ if (!new)
1785
+ goto err_alloc;
18141786 alloc_bytes += PAGE_SIZE;
18151787 pgd_populate(&init_mm, pgd, new);
18161788 }
1817
- pud = pud_offset(pgd, vstart);
1789
+
1790
+ p4d = p4d_offset(pgd, vstart);
1791
+ if (p4d_none(*p4d)) {
1792
+ pud_t *new;
1793
+
1794
+ new = memblock_alloc_from(PAGE_SIZE, PAGE_SIZE,
1795
+ PAGE_SIZE);
1796
+ if (!new)
1797
+ goto err_alloc;
1798
+ alloc_bytes += PAGE_SIZE;
1799
+ p4d_populate(&init_mm, p4d, new);
1800
+ }
1801
+
1802
+ pud = pud_offset(p4d, vstart);
18181803 if (pud_none(*pud)) {
18191804 pmd_t *new;
18201805
....@@ -1822,7 +1807,10 @@
18221807 vstart = kernel_map_hugepud(vstart, vend, pud);
18231808 continue;
18241809 }
1825
- new = __alloc_bootmem(PAGE_SIZE, PAGE_SIZE, PAGE_SIZE);
1810
+ new = memblock_alloc_from(PAGE_SIZE, PAGE_SIZE,
1811
+ PAGE_SIZE);
1812
+ if (!new)
1813
+ goto err_alloc;
18261814 alloc_bytes += PAGE_SIZE;
18271815 pud_populate(&init_mm, pud, new);
18281816 }
....@@ -1835,7 +1823,10 @@
18351823 vstart = kernel_map_hugepmd(vstart, vend, pmd);
18361824 continue;
18371825 }
1838
- new = __alloc_bootmem(PAGE_SIZE, PAGE_SIZE, PAGE_SIZE);
1826
+ new = memblock_alloc_from(PAGE_SIZE, PAGE_SIZE,
1827
+ PAGE_SIZE);
1828
+ if (!new)
1829
+ goto err_alloc;
18391830 alloc_bytes += PAGE_SIZE;
18401831 pmd_populate_kernel(&init_mm, pmd, new);
18411832 }
....@@ -1855,6 +1846,11 @@
18551846 }
18561847
18571848 return alloc_bytes;
1849
+
1850
+err_alloc:
1851
+ panic("%s: Failed to allocate %lu bytes align=%lx from=%lx\n",
1852
+ __func__, PAGE_SIZE, PAGE_SIZE, PAGE_SIZE);
1853
+ return -ENOMEM;
18581854 }
18591855
18601856 static void __init flush_all_kernel_tsbs(void)
....@@ -2258,19 +2254,6 @@
22582254 static void sun4u_pgprot_init(void);
22592255 static void sun4v_pgprot_init(void);
22602256
2261
-static phys_addr_t __init available_memory(void)
2262
-{
2263
- phys_addr_t available = 0ULL;
2264
- phys_addr_t pa_start, pa_end;
2265
- u64 i;
2266
-
2267
- for_each_free_mem_range(i, NUMA_NO_NODE, MEMBLOCK_NONE, &pa_start,
2268
- &pa_end, NULL)
2269
- available = available + (pa_end - pa_start);
2270
-
2271
- return available;
2272
-}
2273
-
22742257 #define _PAGE_CACHE_4U (_PAGE_CP_4U | _PAGE_CV_4U)
22752258 #define _PAGE_CACHE_4V (_PAGE_CP_4V | _PAGE_CV_4V)
22762259 #define __DIRTY_BITS_4U (_PAGE_MODIFIED_4U | _PAGE_WRITE_4U | _PAGE_W_4U)
....@@ -2284,33 +2267,8 @@
22842267 */
22852268 static void __init reduce_memory(phys_addr_t limit_ram)
22862269 {
2287
- phys_addr_t avail_ram = available_memory();
2288
- phys_addr_t pa_start, pa_end;
2289
- u64 i;
2290
-
2291
- if (limit_ram >= avail_ram)
2292
- return;
2293
-
2294
- for_each_free_mem_range(i, NUMA_NO_NODE, MEMBLOCK_NONE, &pa_start,
2295
- &pa_end, NULL) {
2296
- phys_addr_t region_size = pa_end - pa_start;
2297
- phys_addr_t clip_start = pa_start;
2298
-
2299
- avail_ram = avail_ram - region_size;
2300
- /* Are we consuming too much? */
2301
- if (avail_ram < limit_ram) {
2302
- phys_addr_t give_back = limit_ram - avail_ram;
2303
-
2304
- region_size = region_size - give_back;
2305
- clip_start = clip_start + give_back;
2306
- }
2307
-
2308
- memblock_remove(clip_start, region_size);
2309
-
2310
- if (avail_ram <= limit_ram)
2311
- break;
2312
- i = 0UL;
2313
- }
2270
+ limit_ram += memblock_reserved_size();
2271
+ memblock_enforce_memory_limit(limit_ram);
23142272 }
23152273
23162274 void __init paging_init(void)
....@@ -2495,7 +2453,7 @@
24952453
24962454 max_zone_pfns[ZONE_NORMAL] = end_pfn;
24972455
2498
- free_area_init_nodes(max_zone_pfns);
2456
+ free_area_init(max_zone_pfns);
24992457 }
25002458
25012459 printk("Booting Linux...\n");
....@@ -2541,12 +2499,12 @@
25412499 {
25422500 high_memory = __va(last_valid_pfn << PAGE_SHIFT);
25432501
2544
- free_all_bootmem();
2502
+ memblock_free_all();
25452503
25462504 /*
25472505 * Must be done after boot memory is put on freelist, because here we
25482506 * might set fields in deferred struct pages that have not yet been
2549
- * initialized, and free_all_bootmem() initializes all the reserved
2507
+ * initialized, and memblock_free_all() initializes all the reserved
25502508 * deferred pages for us.
25512509 */
25522510 register_page_bootmem_info();
....@@ -2599,14 +2557,6 @@
25992557 }
26002558 }
26012559
2602
-#ifdef CONFIG_BLK_DEV_INITRD
2603
-void free_initrd_mem(unsigned long start, unsigned long end)
2604
-{
2605
- free_reserved_area((void *)start, (void *)end, POISON_FREE_INITMEM,
2606
- "initrd");
2607
-}
2608
-#endif
2609
-
26102560 pgprot_t PAGE_KERNEL __read_mostly;
26112561 EXPORT_SYMBOL(PAGE_KERNEL);
26122562
....@@ -2647,13 +2597,18 @@
26472597 for (; vstart < vend; vstart += PMD_SIZE) {
26482598 pgd_t *pgd = vmemmap_pgd_populate(vstart, node);
26492599 unsigned long pte;
2600
+ p4d_t *p4d;
26502601 pud_t *pud;
26512602 pmd_t *pmd;
26522603
26532604 if (!pgd)
26542605 return -ENOMEM;
26552606
2656
- pud = vmemmap_pud_populate(pgd, vstart, node);
2607
+ p4d = vmemmap_p4d_populate(pgd, vstart, node);
2608
+ if (!p4d)
2609
+ return -ENOMEM;
2610
+
2611
+ pud = vmemmap_pud_populate(p4d, vstart, node);
26572612 if (!pud)
26582613 return -ENOMEM;
26592614
....@@ -2922,8 +2877,7 @@
29222877 : : "r" (pstate));
29232878 }
29242879
2925
-pte_t *pte_alloc_one_kernel(struct mm_struct *mm,
2926
- unsigned long address)
2880
+pte_t *pte_alloc_one_kernel(struct mm_struct *mm)
29272881 {
29282882 struct page *page = alloc_page(GFP_KERNEL | __GFP_ZERO);
29292883 pte_t *pte = NULL;
....@@ -2934,14 +2888,13 @@
29342888 return pte;
29352889 }
29362890
2937
-pgtable_t pte_alloc_one(struct mm_struct *mm,
2938
- unsigned long address)
2891
+pgtable_t pte_alloc_one(struct mm_struct *mm)
29392892 {
29402893 struct page *page = alloc_page(GFP_KERNEL | __GFP_ZERO);
29412894 if (!page)
29422895 return NULL;
2943
- if (!pgtable_page_ctor(page)) {
2944
- free_unref_page(page);
2896
+ if (!pgtable_pte_page_ctor(page)) {
2897
+ __free_page(page);
29452898 return NULL;
29462899 }
29472900 return (pte_t *) page_address(page);
....@@ -2956,7 +2909,7 @@
29562909 {
29572910 struct page *page = virt_to_page(pte);
29582911
2959
- pgtable_page_dtor(page);
2912
+ pgtable_pte_page_dtor(page);
29602913 __free_page(page);
29612914 }
29622915