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: Adam Litke <agl@us.ibm.com> Signed-off-by: Jon Tollefson <kniht@linux.vnet.ibm.com> Signed-off-by: Nick Piggin <npiggin@suse.de> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
e11bfbfcb0
commit
53ba51d21d
|
@ -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 {
|
||||||
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)
|
||||||
|
|
||||||
#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
|
||||||
|
|
11
mm/hugetlb.c
11
mm/hugetlb.c
|
@ -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,
|
||||||
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);
|
||||||
|
|
Loading…
Reference in a new issue