lkml.org 
[lkml]   [2020]   [Sep]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[RFC PATCH 02/24] mm/memory_hotplug: Move {get,put}_page_bootmem() to bootmem_info.c
    Date
    In the later patch, we will use {get,put}_page_bootmem() to initialize
    the page for vmemmap or free vmemmap page to buddy. So move them out of
    CONFIG_MEMORY_HOTPLUG_SPARSE.

    Signed-off-by: Muchun Song <songmuchun@bytedance.com>
    ---
    arch/x86/mm/init_64.c | 2 +-
    include/linux/bootmem_info.h | 13 +++++++++++++
    include/linux/memory_hotplug.h | 4 ----
    mm/bootmem_info.c | 26 ++++++++++++++++++++++++++
    mm/memory_hotplug.c | 27 ---------------------------
    mm/sparse.c | 1 +
    6 files changed, 41 insertions(+), 32 deletions(-)

    diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c
    index c7f7ad55b625..0a45f062826e 100644
    --- a/arch/x86/mm/init_64.c
    +++ b/arch/x86/mm/init_64.c
    @@ -1572,7 +1572,7 @@ int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node,
    return err;
    }

    -#if defined(CONFIG_MEMORY_HOTPLUG_SPARSE) && defined(CONFIG_HAVE_BOOTMEM_INFO_NODE)
    +#ifdef CONFIG_HAVE_BOOTMEM_INFO_NODE
    void register_page_bootmem_memmap(unsigned long section_nr,
    struct page *start_page, unsigned long nr_pages)
    {
    diff --git a/include/linux/bootmem_info.h b/include/linux/bootmem_info.h
    index 65bb9b23140f..4ed6dee1adc9 100644
    --- a/include/linux/bootmem_info.h
    +++ b/include/linux/bootmem_info.h
    @@ -18,10 +18,23 @@ enum {

    #ifdef CONFIG_HAVE_BOOTMEM_INFO_NODE
    void __init register_page_bootmem_info_node(struct pglist_data *pgdat);
    +
    +void get_page_bootmem(unsigned long info, struct page *page,
    + unsigned long type);
    +void put_page_bootmem(struct page *page);
    #else
    static inline void register_page_bootmem_info_node(struct pglist_data *pgdat)
    {
    }
    +
    +static inline void put_page_bootmem(struct page *page)
    +{
    +}
    +
    +static inline void get_page_bootmem(unsigned long info, struct page *page,
    + unsigned long type)
    +{
    +}
    #endif

    #endif /* __LINUX_BOOTMEM_INFO_H */
    diff --git a/include/linux/memory_hotplug.h b/include/linux/memory_hotplug.h
    index 19e5d067294c..c9f3361fe84b 100644
    --- a/include/linux/memory_hotplug.h
    +++ b/include/linux/memory_hotplug.h
    @@ -197,10 +197,6 @@ static inline void arch_refresh_nodedata(int nid, pg_data_t *pgdat)
    #endif /* CONFIG_NUMA */
    #endif /* CONFIG_HAVE_ARCH_NODEDATA_EXTENSION */

    -extern void put_page_bootmem(struct page *page);
    -extern void get_page_bootmem(unsigned long ingo, struct page *page,
    - unsigned long type);
    -
    void get_online_mems(void);
    void put_online_mems(void);

    diff --git a/mm/bootmem_info.c b/mm/bootmem_info.c
    index 39fa8fc120bc..d276e96e487f 100644
    --- a/mm/bootmem_info.c
    +++ b/mm/bootmem_info.c
    @@ -10,6 +10,32 @@
    #include <linux/bootmem_info.h>
    #include <linux/memory_hotplug.h>

    +void get_page_bootmem(unsigned long info, struct page *page,
    + unsigned long type)
    +{
    + page->freelist = (void *)type;
    + SetPagePrivate(page);
    + set_page_private(page, info);
    + page_ref_inc(page);
    +}
    +
    +void put_page_bootmem(struct page *page)
    +{
    + unsigned long type;
    +
    + type = (unsigned long) page->freelist;
    + BUG_ON(type < MEMORY_HOTPLUG_MIN_BOOTMEM_TYPE ||
    + type > MEMORY_HOTPLUG_MAX_BOOTMEM_TYPE);
    +
    + if (page_ref_dec_return(page) == 1) {
    + page->freelist = NULL;
    + ClearPagePrivate(page);
    + set_page_private(page, 0);
    + INIT_LIST_HEAD(&page->lru);
    + free_reserved_page(page);
    + }
    +}
    +
    #ifndef CONFIG_SPARSEMEM_VMEMMAP
    static void register_page_bootmem_info_section(unsigned long start_pfn)
    {
    diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c
    index 2da4ad071456..ae57eedc341f 100644
    --- a/mm/memory_hotplug.c
    +++ b/mm/memory_hotplug.c
    @@ -21,7 +21,6 @@
    #include <linux/memory.h>
    #include <linux/memremap.h>
    #include <linux/memory_hotplug.h>
    -#include <linux/bootmem_info.h>
    #include <linux/highmem.h>
    #include <linux/vmalloc.h>
    #include <linux/ioport.h>
    @@ -142,32 +141,6 @@ static void release_memory_resource(struct resource *res)
    }

    #ifdef CONFIG_MEMORY_HOTPLUG_SPARSE
    -void get_page_bootmem(unsigned long info, struct page *page,
    - unsigned long type)
    -{
    - page->freelist = (void *)type;
    - SetPagePrivate(page);
    - set_page_private(page, info);
    - page_ref_inc(page);
    -}
    -
    -void put_page_bootmem(struct page *page)
    -{
    - unsigned long type;
    -
    - type = (unsigned long) page->freelist;
    - BUG_ON(type < MEMORY_HOTPLUG_MIN_BOOTMEM_TYPE ||
    - type > MEMORY_HOTPLUG_MAX_BOOTMEM_TYPE);
    -
    - if (page_ref_dec_return(page) == 1) {
    - page->freelist = NULL;
    - ClearPagePrivate(page);
    - set_page_private(page, 0);
    - INIT_LIST_HEAD(&page->lru);
    - free_reserved_page(page);
    - }
    -}
    -
    static int check_pfn_span(unsigned long pfn, unsigned long nr_pages,
    const char *reason)
    {
    diff --git a/mm/sparse.c b/mm/sparse.c
    index b25ad8e64839..a4138410d890 100644
    --- a/mm/sparse.c
    +++ b/mm/sparse.c
    @@ -13,6 +13,7 @@
    #include <linux/vmalloc.h>
    #include <linux/swap.h>
    #include <linux/swapops.h>
    +#include <linux/bootmem_info.h>

    #include "internal.h"
    #include <asm/dma.h>
    --
    2.20.1
    \
     
     \ /
      Last update: 2020-09-16 02:46    [W:7.943 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site