提交 54f9f80d 编写于 作者: A Adam Litke 提交者: Linus Torvalds

hugetlb: Add hugetlb_dynamic_pool sysctl

The maximum size of the huge page pool can be controlled using the overall
size of the hugetlb filesystem (via its 'size' mount option).  However in the
common case the this will not be set as the pool is traditionally fixed in
size at boot time.  In order to maintain the expected semantics, we need to
prevent the pool expanding by default.

This patch introduces a new sysctl controlling dynamic pool resizing.  When
this is enabled the pool will expand beyond its base size up to the size of
the hugetlb filesystem.  It is disabled by default.
Signed-off-by: NAdam Litke <agl@us.ibm.com>
Acked-by: NAndy Whitcroft <apw@shadowen.org>
Acked-by: NDave McCracken <dave.mccracken@oracle.com>
Cc: William Irwin <bill.irwin@oracle.com>
Cc: David Gibson <david@gibson.dropbear.id.au>
Cc: Ken Chen <kenchen@google.com>
Cc: Badari Pulavarty <pbadari@us.ibm.com>
Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
上级 e4e574b7
...@@ -33,6 +33,7 @@ void hugetlb_unreserve_pages(struct inode *inode, long offset, long freed); ...@@ -33,6 +33,7 @@ void hugetlb_unreserve_pages(struct inode *inode, long offset, long freed);
extern unsigned long max_huge_pages; extern unsigned long max_huge_pages;
extern unsigned long hugepages_treat_as_movable; extern unsigned long hugepages_treat_as_movable;
extern int hugetlb_dynamic_pool;
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;
......
...@@ -880,6 +880,14 @@ static ctl_table vm_table[] = { ...@@ -880,6 +880,14 @@ static ctl_table vm_table[] = {
.mode = 0644, .mode = 0644,
.proc_handler = &hugetlb_treat_movable_handler, .proc_handler = &hugetlb_treat_movable_handler,
}, },
{
.ctl_name = CTL_UNNUMBERED,
.procname = "hugetlb_dynamic_pool",
.data = &hugetlb_dynamic_pool,
.maxlen = sizeof(hugetlb_dynamic_pool),
.mode = 0644,
.proc_handler = &proc_dointvec,
},
#endif #endif
{ {
.ctl_name = VM_LOWMEM_RESERVE_RATIO, .ctl_name = VM_LOWMEM_RESERVE_RATIO,
......
...@@ -31,6 +31,7 @@ static unsigned int free_huge_pages_node[MAX_NUMNODES]; ...@@ -31,6 +31,7 @@ static unsigned int free_huge_pages_node[MAX_NUMNODES];
static unsigned int surplus_huge_pages_node[MAX_NUMNODES]; static unsigned int surplus_huge_pages_node[MAX_NUMNODES];
static gfp_t htlb_alloc_mask = GFP_HIGHUSER; static gfp_t htlb_alloc_mask = GFP_HIGHUSER;
unsigned long hugepages_treat_as_movable; unsigned long hugepages_treat_as_movable;
int hugetlb_dynamic_pool;
/* /*
* Protects updates to hugepage_freelists, nr_huge_pages, and free_huge_pages * Protects updates to hugepage_freelists, nr_huge_pages, and free_huge_pages
...@@ -201,6 +202,10 @@ static struct page *alloc_buddy_huge_page(struct vm_area_struct *vma, ...@@ -201,6 +202,10 @@ static struct page *alloc_buddy_huge_page(struct vm_area_struct *vma,
{ {
struct page *page; struct page *page;
/* Check if the dynamic pool is enabled */
if (!hugetlb_dynamic_pool)
return NULL;
page = alloc_pages(htlb_alloc_mask|__GFP_COMP|__GFP_NOWARN, page = alloc_pages(htlb_alloc_mask|__GFP_COMP|__GFP_NOWARN,
HUGETLB_PAGE_ORDER); HUGETLB_PAGE_ORDER);
if (page) { if (page) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册