parisc: use memblock_alloc() instead of custom get_memblock()
Subsystems (2)
PATCH v2 1/1 parisc: use memblock_alloc() instead of custom get_memblock()
The get_memblock() function implements custom bottom-up memblock allocator. Setting 'memblock_bottom_up = true' before any memblock allocation is done allows replacing get_memblock() calls with memblock_alloc().
---
v2: fix allocation alignment
arch/parisc/mm/init.c | 52 +++++++++++++++++++-------------------------------- 1 file changed, 19 insertions(+), 33 deletions(-)
arch/parisc/mm/init.c +19 -33
@@ -79,36 +79,6 @@ static struct resource sysram_resources[MAX_PHYSMEM_RANGES] __read_mostly;physmem_range_t pmem_ranges[MAX_PHYSMEM_RANGES ]__read_mostly ;int npmem_ranges__read_mostly ; -/* -* get_memblock() allocates pages via memblock. -* We can't use memblock_find_in_range(0, KERNEL_INITIAL_SIZE) here since it -* doesn't allocate from bottom to top which is needed because we only created -* the initial mapping up to KERNEL_INITIAL_SIZE in the assembly bootup code. -*/ -static void *__init get_memblock (unsigned long size) -{ -static phys_addr_t search_addr__initdata ; -phys_addr_t phys; - -if (!search_addr) - search_addr =PAGE_ALIGN (__pa ((unsigned long ) &_end)); - search_addr =ALIGN (search_addr, size); -while (!memblock_is_region_memory (search_addr, size) || -memblock_is_region_reserved (search_addr, size)) { - search_addr += size; - } - phys = search_addr; - -if (phys) -memblock_reserve (phys, size); -else -panic ("get_memblock() failed.\n" ); - -memset (__va (phys),0 , size); - -return __va (phys); -} -#ifdef CONFIG_64BIT #define MAX_MEM (~0UL)#else /* !CONFIG_64BIT */
@@ -321,6 +291,13 @@ static void __init setup_bootmem(void) max_pfn = start_pfn + npages; } +/* +* We can't use memblock top-down allocations because we only +* created the initial mapping up to KERNEL_INITIAL_SIZE in +* the assembly bootup code. +*/ +memblock_set_bottom_up (true); +/* IOMMU is always used to access "high mem" on those boxes * that can support enough mem that a PCI device couldn't * directly DMA to any physical addresses.
@@ -442,7 +419,10 @@ static void __init map_pages(unsigned long start_vaddr,*/ if (!pmd) { - pmd = (pmd_t *)get_memblock (PAGE_SIZE <<PMD_ORDER ); + pmd =memblock_alloc (PAGE_SIZE <<PMD_ORDER , +PAGE_SIZE <<PMD_ORDER ); +if (!pmd) +panic ("pmd allocation failed.\n" ); pmd = (pmd_t *)__pa (pmd); }
@@ -461,7 +441,10 @@ static void __init map_pages(unsigned long start_vaddr, pg_table = (pte_t *)pmd_address (*pmd);if (!pg_table) { - pg_table = (pte_t *)get_memblock (PAGE_SIZE ); + pg_table =memblock_alloc (PAGE_SIZE , +PAGE_SIZE ); +if (!pg_table) +panic ("page table allocation failed\n" ); pg_table = (pte_t *)__pa (pg_table); }
@@ -700,7 +683,10 @@ static void __init pagetable_init(void) }#endif - empty_zero_page =get_memblock (PAGE_SIZE ); + empty_zero_page =memblock_alloc (PAGE_SIZE ,PAGE_SIZE ); +if (!empty_zero_page) +panic ("zero page allocation failed.\n" ); + }static void __init gateway_init (void )
Signature · 1 line
2.7.4
Any comments on this?
Quoted 105 lines · Mike Rapoport
The
get_memblock()function implements custom bottom-up memblock allocator. Setting 'memblock_bottom_up= true' before any memblock allocation is done allows replacingget_memblock()calls withmemblock_alloc().Signed-off-by Mike Rapoport <[email protected]>---
v2: fix allocation alignmentarch/parisc/mm/init.c | 52 +++++++++++++++++++-------------------------------- 1 file changed, 19 insertions(+), 33 deletions(-)arch/parisc/mm/init.c +19
-33@@ -79,36 +79,6 @@ static struct resource sysram_resources[MAX_PHYSMEM_RANGES] __read_mostly;physmem_range_t pmem_ranges[MAX_PHYSMEM_RANGES ]__read_mostly ;int npmem_ranges__read_mostly ; -/* -* get_memblock() allocates pages via memblock. -* We can't use memblock_find_in_range(0, KERNEL_INITIAL_SIZE) here since it -* doesn't allocate from bottom to top which is needed because we only created -* the initial mapping up to KERNEL_INITIAL_SIZE in the assembly bootup code. -*/ -static void *__init get_memblock (unsigned long size) -{ -static phys_addr_t search_addr__initdata ; -phys_addr_t phys; - -if (!search_addr) - search_addr =PAGE_ALIGN (__pa ((unsigned long ) &_end)); - search_addr =ALIGN (search_addr, size); -while (!memblock_is_region_memory (search_addr, size) || -memblock_is_region_reserved (search_addr, size)) { - search_addr += size; - } - phys = search_addr; - -if (phys) -memblock_reserve (phys, size); -else -panic ("get_memblock() failed.\n" ); - -memset (__va (phys),0 , size); - -return __va (phys); -} -#ifdef CONFIG_64BIT #define MAX_MEM (~0UL)#else /* !CONFIG_64BIT */ @@ -321,6 +291,13 @@ static void __init setup_bootmem(void) max_pfn = start_pfn + npages; } +/* +* We can't use memblock top-down allocations because we only +* created the initial mapping up to KERNEL_INITIAL_SIZE in +* the assembly bootup code. +*/ +memblock_set_bottom_up (true); +/* IOMMU is always used to access "high mem" on those boxes * that can support enough mem that a PCI device couldn't * directly DMA to any physical addresses. @@ -442,7 +419,10 @@ static void __init map_pages(unsigned long start_vaddr,*/ if (!pmd) { - pmd = (pmd_t *)get_memblock (PAGE_SIZE <<PMD_ORDER ); + pmd =memblock_alloc (PAGE_SIZE <<PMD_ORDER , +PAGE_SIZE <<PMD_ORDER ); +if (!pmd) +panic ("pmd allocation failed.\n" ); pmd = (pmd_t *)__pa (pmd); }@@ -461,7 +441,10 @@ static void __init map_pages(unsigned long start_vaddr, pg_table = (pte_t *)pmd_address (*pmd);if (!pg_table) { - pg_table = (pte_t *)get_memblock (PAGE_SIZE ); + pg_table =memblock_alloc (PAGE_SIZE , +PAGE_SIZE ); +if (!pg_table) +panic ("page table allocation failed\n" ); pg_table = (pte_t *)__pa (pg_table); }@@ -700,7 +683,10 @@ static void __init pagetable_init(void) }#endif - empty_zero_page =get_memblock (PAGE_SIZE ); + empty_zero_page =memblock_alloc (PAGE_SIZE ,PAGE_SIZE ); +if (!empty_zero_page) +panic ("zero page allocation failed.\n" ); + }static void __init gateway_init (void )Signature · 1 line
2.7.4
Signature · 2 lines
Sincerely yours, Mike.
Quoted 6 lines · Mike Rapoport
Quoted 5 lines · Mike Rapoport
The
get_memblock()function implements custom bottom-up memblock allocator. Setting 'memblock_bottom_up= true' before any memblock allocation is done allows replacingget_memblock()calls withmemblock_alloc().Signed-off-by Mike Rapoport <[email protected]>
Thanks!
Shall I push the patch upstream with the parisc tree?
Helge
Quoted 101 lines
Quoted 100 lines
---
v2: fix allocation alignmentarch/parisc/mm/init.c | 52 +++++++++++++++++++-------------------------------- 1 file changed, 19 insertions(+), 33 deletions(-)arch/parisc/mm/init.c +19
-33@@ -79,36 +79,6 @@ static struct resource sysram_resources[MAX_PHYSMEM_RANGES] __read_mostly;physmem_range_t pmem_ranges[MAX_PHYSMEM_RANGES ]__read_mostly ;int npmem_ranges__read_mostly ; -/* -* get_memblock() allocates pages via memblock. -* We can't use memblock_find_in_range(0, KERNEL_INITIAL_SIZE) here since it -* doesn't allocate from bottom to top which is needed because we only created -* the initial mapping up to KERNEL_INITIAL_SIZE in the assembly bootup code. -*/ -static void *__init get_memblock (unsigned long size) -{ -static phys_addr_t search_addr__initdata ; -phys_addr_t phys; - -if (!search_addr) - search_addr =PAGE_ALIGN (__pa ((unsigned long ) &_end)); - search_addr =ALIGN (search_addr, size); -while (!memblock_is_region_memory (search_addr, size) || -memblock_is_region_reserved (search_addr, size)) { - search_addr += size; - } - phys = search_addr; - -if (phys) -memblock_reserve (phys, size); -else -panic ("get_memblock() failed.\n" ); - -memset (__va (phys),0 , size); - -return __va (phys); -} -#ifdef CONFIG_64BIT #define MAX_MEM (~0UL)#else /* !CONFIG_64BIT */ @@ -321,6 +291,13 @@ static void __init setup_bootmem(void) max_pfn = start_pfn + npages; } +/* +* We can't use memblock top-down allocations because we only +* created the initial mapping up to KERNEL_INITIAL_SIZE in +* the assembly bootup code. +*/ +memblock_set_bottom_up (true); +/* IOMMU is always used to access "high mem" on those boxes * that can support enough mem that a PCI device couldn't * directly DMA to any physical addresses. @@ -442,7 +419,10 @@ static void __init map_pages(unsigned long start_vaddr,*/ if (!pmd) { - pmd = (pmd_t *)get_memblock (PAGE_SIZE <<PMD_ORDER ); + pmd =memblock_alloc (PAGE_SIZE <<PMD_ORDER , +PAGE_SIZE <<PMD_ORDER ); +if (!pmd) +panic ("pmd allocation failed.\n" ); pmd = (pmd_t *)__pa (pmd); }@@ -461,7 +441,10 @@ static void __init map_pages(unsigned long start_vaddr, pg_table = (pte_t *)pmd_address (*pmd);if (!pg_table) { - pg_table = (pte_t *)get_memblock (PAGE_SIZE ); + pg_table =memblock_alloc (PAGE_SIZE , +PAGE_SIZE ); +if (!pg_table) +panic ("page table allocation failed\n" ); pg_table = (pte_t *)__pa (pg_table); }@@ -700,7 +683,10 @@ static void __init pagetable_init(void) }#endif - empty_zero_page =get_memblock (PAGE_SIZE ); + empty_zero_page =memblock_alloc (PAGE_SIZE ,PAGE_SIZE ); +if (!empty_zero_page) +panic ("zero page allocation failed.\n" ); + }static void __init gateway_init (void )Signature · 1 line
2.7.4
Quoted 6 lines · Helge Deller
Quoted 4 lines · Mike Rapoport
Quoted 3 lines · Mike Rapoport
The
get_memblock()function implements custom bottom-up memblock allocator. Setting 'memblock_bottom_up= true' before any memblock allocation is done allows replacingget_memblock()calls withmemblock_alloc().
Quoted 7 lines
Quoted 1 line
Quoted 1 line
Signed-off-by Mike Rapoport <[email protected]>Acked-by Helge Deller <[email protected]>Tested-by Helge Deller <[email protected]>Thanks!
Shall I push the patch upstream with the parisc tree?
Yes, please.
Quoted 106 lines
Helge
Quoted 101 lines
Quoted 100 lines
---
v2: fix allocation alignmentarch/parisc/mm/init.c | 52 +++++++++++++++++++-------------------------------- 1 file changed, 19 insertions(+), 33 deletions(-)arch/parisc/mm/init.c +19
-33@@ -79,36 +79,6 @@ static struct resource sysram_resources[MAX_PHYSMEM_RANGES] __read_mostly;physmem_range_t pmem_ranges[MAX_PHYSMEM_RANGES ]__read_mostly ;int npmem_ranges__read_mostly ; -/* -* get_memblock() allocates pages via memblock. -* We can't use memblock_find_in_range(0, KERNEL_INITIAL_SIZE) here since it -* doesn't allocate from bottom to top which is needed because we only created -* the initial mapping up to KERNEL_INITIAL_SIZE in the assembly bootup code. -*/ -static void *__init get_memblock (unsigned long size) -{ -static phys_addr_t search_addr__initdata ; -phys_addr_t phys; - -if (!search_addr) - search_addr =PAGE_ALIGN (__pa ((unsigned long ) &_end)); - search_addr =ALIGN (search_addr, size); -while (!memblock_is_region_memory (search_addr, size) || -memblock_is_region_reserved (search_addr, size)) { - search_addr += size; - } - phys = search_addr; - -if (phys) -memblock_reserve (phys, size); -else -panic ("get_memblock() failed.\n" ); - -memset (__va (phys),0 , size); - -return __va (phys); -} -#ifdef CONFIG_64BIT #define MAX_MEM (~0UL)#else /* !CONFIG_64BIT */ @@ -321,6 +291,13 @@ static void __init setup_bootmem(void) max_pfn = start_pfn + npages; } +/* +* We can't use memblock top-down allocations because we only +* created the initial mapping up to KERNEL_INITIAL_SIZE in +* the assembly bootup code. +*/ +memblock_set_bottom_up (true); +/* IOMMU is always used to access "high mem" on those boxes * that can support enough mem that a PCI device couldn't * directly DMA to any physical addresses. @@ -442,7 +419,10 @@ static void __init map_pages(unsigned long start_vaddr,*/ if (!pmd) { - pmd = (pmd_t *)get_memblock (PAGE_SIZE <<PMD_ORDER ); + pmd =memblock_alloc (PAGE_SIZE <<PMD_ORDER , +PAGE_SIZE <<PMD_ORDER ); +if (!pmd) +panic ("pmd allocation failed.\n" ); pmd = (pmd_t *)__pa (pmd); }@@ -461,7 +441,10 @@ static void __init map_pages(unsigned long start_vaddr, pg_table = (pte_t *)pmd_address (*pmd);if (!pg_table) { - pg_table = (pte_t *)get_memblock (PAGE_SIZE ); + pg_table =memblock_alloc (PAGE_SIZE , +PAGE_SIZE ); +if (!pg_table) +panic ("page table allocation failed\n" ); pg_table = (pte_t *)__pa (pg_table); }@@ -700,7 +683,10 @@ static void __init pagetable_init(void) }#endif - empty_zero_page =get_memblock (PAGE_SIZE ); + empty_zero_page =memblock_alloc (PAGE_SIZE ,PAGE_SIZE ); +if (!empty_zero_page) +panic ("zero page allocation failed.\n" ); + }static void __init gateway_init (void )Signature · 1 line
2.7.4
Signature · 2 lines
Sincerely yours, Mike.