Commit 53ba51d2 authored by Jon Tollefson's avatar Jon Tollefson Committed by Linus Torvalds

hugetlb: allow arch overridden hugepage allocation

Allow alloc_bootmem_huge_page() to be overridden by architectures that
can't always use bootmem.  This requires huge_boot_pages to be available
for use by this function.

This is required for powerpc 16G pages, which have to be reserved prior to
boot-time.  The location of these pages are indicated in the device tree.
Acked-by: default avatarAdam Litke <agl@us.ibm.com>
Signed-off-by: default avatarJon Tollefson <kniht@linux.vnet.ibm.com>
Signed-off-by: default avatarNick Piggin <npiggin@suse.de>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent e11bfbfc
...@@ -39,6 +39,7 @@ void hugetlb_unreserve_pages(struct inode *inode, long offset, long freed); ...@@ -39,6 +39,7 @@ void hugetlb_unreserve_pages(struct inode *inode, long offset, long freed);
extern unsigned long hugepages_treat_as_movable; extern unsigned long hugepages_treat_as_movable;
extern const unsigned long hugetlb_zero, hugetlb_infinity; extern const unsigned long hugetlb_zero, hugetlb_infinity;
extern int sysctl_hugetlb_shm_group; extern int sysctl_hugetlb_shm_group;
extern struct list_head huge_boot_pages;
/* arch callbacks */ /* arch callbacks */
...@@ -188,6 +189,14 @@ struct hstate { ...@@ -188,6 +189,14 @@ struct hstate {
char name[HSTATE_NAME_LEN]; char name[HSTATE_NAME_LEN];
}; };
struct huge_bootmem_page {
struct list_head list;
struct hstate *hstate;
};
/* arch callback */
int __init alloc_bootmem_huge_page(struct hstate *h);
void __init hugetlb_add_hstate(unsigned order); void __init hugetlb_add_hstate(unsigned order);
struct hstate *size_to_hstate(unsigned long size); struct hstate *size_to_hstate(unsigned long size);
...@@ -256,6 +265,7 @@ static inline struct hstate *page_hstate(struct page *page) ...@@ -256,6 +265,7 @@ static inline struct hstate *page_hstate(struct page *page)
#else #else
struct hstate {}; struct hstate {};
#define alloc_bootmem_huge_page(h) NULL
#define hstate_file(f) NULL #define hstate_file(f) NULL
#define hstate_vma(v) NULL #define hstate_vma(v) NULL
#define hstate_inode(i) NULL #define hstate_inode(i) NULL
......
...@@ -31,6 +31,8 @@ static int max_hstate; ...@@ -31,6 +31,8 @@ static int max_hstate;
unsigned int default_hstate_idx; unsigned int default_hstate_idx;
struct hstate hstates[HUGE_MAX_HSTATE]; struct hstate hstates[HUGE_MAX_HSTATE];
__initdata LIST_HEAD(huge_boot_pages);
/* for command line parsing */ /* for command line parsing */
static struct hstate * __initdata parsed_hstate; static struct hstate * __initdata parsed_hstate;
static unsigned long __initdata default_hstate_max_huge_pages; static unsigned long __initdata default_hstate_max_huge_pages;
...@@ -925,14 +927,7 @@ static struct page *alloc_huge_page(struct vm_area_struct *vma, ...@@ -925,14 +927,7 @@ static struct page *alloc_huge_page(struct vm_area_struct *vma,
return page; return page;
} }
static __initdata LIST_HEAD(huge_boot_pages); __attribute__((weak)) int alloc_bootmem_huge_page(struct hstate *h)
struct huge_bootmem_page {
struct list_head list;
struct hstate *hstate;
};
static int __init alloc_bootmem_huge_page(struct hstate *h)
{ {
struct huge_bootmem_page *m; struct huge_bootmem_page *m;
int nr_nodes = nodes_weight(node_online_map); int nr_nodes = nodes_weight(node_online_map);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment