mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs.git
synced 2026-10-28 12:53:14 +01:00
mm/hugetlb: allow overcommitting gigantic hugepages
Currently, gigantic hugepages cannot use the overcommit mechanism
(nr_overcommit_hugepages), forcing users to permanently reserve memory via
nr_hugepages even when pages might not be actively used.
The restriction was added in 2011 [1], which was before there was support
for reserving 1G hugepages at runtime. Remove this blanket restriction on
gigantic hugepage overcommit. This will bring the same benefits to
gigantic pages as hugepages:
- Memory is only taken out of regular use when actually needed
- Unused surplus pages can be returned to the system
- Better memory utilization, especially with CMA backing which can
significantly increase the changes of hugepage allocation
Without this patch:
echo 3 > /sys/kernel/mm/hugepages/hugepages-1048576kB/nr_overcommit_hugepages
bash: echo: write error: Invalid argument
With this patch:
echo 3 > /sys/kernel/mm/hugepages/hugepages-1048576kB/nr_overcommit_hugepages
./mmap_hugetlb_test
Successfully allocated huge pages at address: 0x7f9d40000000
cat mmap_hugetlb_test.c
...
unsigned long ALLOC_SIZE = 3 * (unsigned long) HUGE_PAGE_SIZE;
addr = mmap(NULL,
ALLOC_SIZE, // 3GB
PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB | MAP_HUGE_1GB,
-1,
0);
if (addr == MAP_FAILED) {
fprintf(stderr, "mmap failed: %s\n", strerror(errno));
return 1;
}
printf("Successfully allocated huge pages at address: %p\n", addr);
...
Link: https://lkml.kernel.org/r/[email protected]
Link: https://git.zx2c4.com/linux-rng/commit/mm/hugetlb.c?id=adbe8726dc2a3805630d517270db17e3af86e526 [1]
Signed-off-by: Usama Arif <[email protected]>
Reviewed-by: Shakeel Butt <[email protected]>
Reviewed-by: Kefeng Wang <[email protected]>
Acked-by: Oscar Salvador <[email protected]>
Cc: David Hildenbrand <[email protected]>
Cc: Johannes Weiner <[email protected]>
Cc: Muchun Song <[email protected]>
Cc: Rik van Riel <[email protected]>
Cc: SeongJae Park <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
This commit is contained in:
1 parent
a743e0af50
commit
eb02f14c4a
1 file changed
+3
-3
+3
-3
@@ -2223,7 +2223,7 @@ static struct folio *alloc_surplus_hugetlb_folio(struct hstate *h,
|
||||
{
|
||||
struct folio *folio = NULL;
|
||||
|
||||
if (hstate_is_gigantic(h))
|
||||
if (hstate_is_gigantic_no_runtime(h))
|
||||
return NULL;
|
||||
|
||||
spin_lock_irq(&hugetlb_lock);
|
||||
@@ -4285,7 +4285,7 @@ static ssize_t nr_overcommit_hugepages_store(struct kobject *kobj,
|
||||
unsigned long input;
|
||||
struct hstate *h = kobj_to_hstate(kobj, NULL);
|
||||
|
||||
if (hstate_is_gigantic(h))
|
||||
if (hstate_is_gigantic_no_runtime(h))
|
||||
return -EINVAL;
|
||||
|
||||
err = kstrtoul(buf, 10, &input);
|
||||
@@ -5172,7 +5172,7 @@ static int hugetlb_overcommit_handler(const struct ctl_table *table, int write,
|
||||
|
||||
tmp = h->nr_overcommit_huge_pages;
|
||||
|
||||
if (write && hstate_is_gigantic(h))
|
||||
if (write && hstate_is_gigantic_no_runtime(h))
|
||||
return -EINVAL;
|
||||
|
||||
ret = proc_hugetlb_doulongvec_minmax(table, write, buffer, length, ppos,
|
||||
|
||||
Reference in new issue
Block a user