Re: mmots: memory-hotplug: implementregister_page_bootmem_info_section of sparse-vmemmap fix

From: Michal Hocko
Date: Fri Jan 11 2013 - 05:17:35 EST


On Fri 11-01-13 10:56:58, Michal Hocko wrote:
[...]
> diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c
> index be2b90c..1501d25 100644
> --- a/mm/memory_hotplug.c
> +++ b/mm/memory_hotplug.c
> @@ -91,7 +91,6 @@ static void release_memory_resource(struct resource *res)
> return;
> }
>
> -#ifdef CONFIG_MEMORY_HOTPLUG_SPARSE
> void get_page_bootmem(unsigned long info, struct page *page,
> unsigned long type)
> {
> @@ -101,6 +100,7 @@ void get_page_bootmem(unsigned long info, struct page *page,
> atomic_inc(&page->_count);
> }
>
> +#ifdef CONFIG_MEMORY_HOTPLUG_SPARSE
> /* reference to __meminit __free_pages_bootmem is valid
> * so use __ref to tell modpost not to generate a warning */
> void __ref put_page_bootmem(struct page *page)

Ups this slipped through and it is unnecessary.
---
Defconfig for x86_64 complains
arch/x86/mm/init_64.c: In function âregister_page_bootmem_memmapâ:
arch/x86/mm/init_64.c:1340: error: implicit declaration of function âget_page_bootmemâ
arch/x86/mm/init_64.c:1340: error: âMIX_SECTION_INFOâ undeclared (first
use in this function)
arch/x86/mm/init_64.c:1340: error: (Each undeclared identifier is
reported only once
arch/x86/mm/init_64.c:1340: error: for each function it appears in.)
arch/x86/mm/init_64.c:1361: error: âSECTION_INFOâ undeclared (first use in this function)

move register_page_bootmem_memmap to memory_hotplug where it is used and
where it has all required symbols

Signed-off-by: Michal Hocko <mhocko@xxxxxxx>
---
arch/x86/mm/init_64.c | 58 -------------------------------------------------
include/linux/mm.h | 2 --
mm/memory_hotplug.c | 58 +++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 58 insertions(+), 60 deletions(-)

diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c
index ddd3b58..a6a7494 100644
--- a/arch/x86/mm/init_64.c
+++ b/arch/x86/mm/init_64.c
@@ -1317,64 +1317,6 @@ vmemmap_populate(struct page *start_page, unsigned long size, int node)
return 0;
}

-void register_page_bootmem_memmap(unsigned long section_nr,
- struct page *start_page, unsigned long size)
-{
- unsigned long addr = (unsigned long)start_page;
- unsigned long end = (unsigned long)(start_page + size);
- unsigned long next;
- pgd_t *pgd;
- pud_t *pud;
- pmd_t *pmd;
- unsigned int nr_pages;
- struct page *page;
-
- for (; addr < end; addr = next) {
- pte_t *pte = NULL;
-
- pgd = pgd_offset_k(addr);
- if (pgd_none(*pgd)) {
- next = (addr + PAGE_SIZE) & PAGE_MASK;
- continue;
- }
- get_page_bootmem(section_nr, pgd_page(*pgd), MIX_SECTION_INFO);
-
- pud = pud_offset(pgd, addr);
- if (pud_none(*pud)) {
- next = (addr + PAGE_SIZE) & PAGE_MASK;
- continue;
- }
- get_page_bootmem(section_nr, pud_page(*pud), MIX_SECTION_INFO);
-
- if (!cpu_has_pse) {
- next = (addr + PAGE_SIZE) & PAGE_MASK;
- pmd = pmd_offset(pud, addr);
- if (pmd_none(*pmd))
- continue;
- get_page_bootmem(section_nr, pmd_page(*pmd),
- MIX_SECTION_INFO);
-
- pte = pte_offset_kernel(pmd, addr);
- if (pte_none(*pte))
- continue;
- get_page_bootmem(section_nr, pte_page(*pte),
- SECTION_INFO);
- } else {
- next = pmd_addr_end(addr, end);
-
- pmd = pmd_offset(pud, addr);
- if (pmd_none(*pmd))
- continue;
-
- nr_pages = 1 << (get_order(PMD_SIZE));
- page = pmd_page(*pmd);
- while (nr_pages--)
- get_page_bootmem(section_nr, page++,
- SECTION_INFO);
- }
- }
-}
-
void __meminit vmemmap_populate_print_last(void)
{
if (p_start) {
diff --git a/include/linux/mm.h b/include/linux/mm.h
index 7c57bd0..1fea1b23 100644
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
@@ -1724,8 +1724,6 @@ void vmemmap_populate_print_last(void);
#ifdef CONFIG_MEMORY_HOTPLUG
void vmemmap_free(struct page *memmap, unsigned long nr_pages);
#endif
-void register_page_bootmem_memmap(unsigned long section_nr, struct page *map,
- unsigned long size);

enum mf_flags {
MF_COUNT_INCREASED = 1 << 0,
diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c
index be2b90c..59eddff 100644
--- a/mm/memory_hotplug.c
+++ b/mm/memory_hotplug.c
@@ -128,6 +128,64 @@ void __ref put_page_bootmem(struct page *page)

}

+void register_page_bootmem_memmap(unsigned long section_nr,
+ struct page *start_page, unsigned long size)
+{
+ unsigned long addr = (unsigned long)start_page;
+ unsigned long end = (unsigned long)(start_page + size);
+ unsigned long next;
+ pgd_t *pgd;
+ pud_t *pud;
+ pmd_t *pmd;
+ unsigned int nr_pages;
+ struct page *page;
+
+ for (; addr < end; addr = next) {
+ pte_t *pte = NULL;
+
+ pgd = pgd_offset_k(addr);
+ if (pgd_none(*pgd)) {
+ next = (addr + PAGE_SIZE) & PAGE_MASK;
+ continue;
+ }
+ get_page_bootmem(section_nr, pgd_page(*pgd), MIX_SECTION_INFO);
+
+ pud = pud_offset(pgd, addr);
+ if (pud_none(*pud)) {
+ next = (addr + PAGE_SIZE) & PAGE_MASK;
+ continue;
+ }
+ get_page_bootmem(section_nr, pud_page(*pud), MIX_SECTION_INFO);
+
+ if (!cpu_has_pse) {
+ next = (addr + PAGE_SIZE) & PAGE_MASK;
+ pmd = pmd_offset(pud, addr);
+ if (pmd_none(*pmd))
+ continue;
+ get_page_bootmem(section_nr, pmd_page(*pmd),
+ MIX_SECTION_INFO);
+
+ pte = pte_offset_kernel(pmd, addr);
+ if (pte_none(*pte))
+ continue;
+ get_page_bootmem(section_nr, pte_page(*pte),
+ SECTION_INFO);
+ } else {
+ next = pmd_addr_end(addr, end);
+
+ pmd = pmd_offset(pud, addr);
+ if (pmd_none(*pmd))
+ continue;
+
+ nr_pages = 1 << (get_order(PMD_SIZE));
+ page = pmd_page(*pmd);
+ while (nr_pages--)
+ get_page_bootmem(section_nr, page++,
+ SECTION_INFO);
+ }
+ }
+}
+
#ifndef CONFIG_SPARSEMEM_VMEMMAP
static void register_page_bootmem_info_section(unsigned long start_pfn)
{
--
1.7.10.4

--
Michal Hocko
SUSE Labs
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/