summaryrefslogtreecommitdiffstats
path: root/mm
diff options
context:
space:
mode:
authorFrank van der Linden <fvdl@google.com>2024-04-04 16:25:15 +0000
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2024-06-16 13:51:07 +0200
commita68ebd3dcd44e26e8e13b181a80628dacc16b8b7 (patch)
treec6c19d96bac2e24bbb798faf4bb8e2c1213cfa83 /mm
parent012998e21f578af06db3b9ee66a7762692640f80 (diff)
downloadlinux-stable-a68ebd3dcd44e26e8e13b181a80628dacc16b8b7.tar.gz
linux-stable-a68ebd3dcd44e26e8e13b181a80628dacc16b8b7.tar.bz2
linux-stable-a68ebd3dcd44e26e8e13b181a80628dacc16b8b7.zip
mm/hugetlb: pass correct order_per_bit to cma_declare_contiguous_nid
commit 55d134a7b499c77e7cfd0ee41046f3c376e791e5 upstream. The hugetlb_cma code passes 0 in the order_per_bit argument to cma_declare_contiguous_nid (the alignment, computed using the page order, is correctly passed in). This causes a bit in the cma allocation bitmap to always represent a 4k page, making the bitmaps potentially very large, and slower. It would create bitmaps that would be pretty big. E.g. for a 4k page size on x86, hugetlb_cma=64G would mean a bitmap size of (64G / 4k) / 8 == 2M. With HUGETLB_PAGE_ORDER as order_per_bit, as intended, this would be (64G / 2M) / 8 == 4k. So, that's quite a difference. Also, this restricted the hugetlb_cma area to ((PAGE_SIZE << MAX_PAGE_ORDER) * 8) * PAGE_SIZE (e.g. 128G on x86) , since bitmap_alloc uses normal page allocation, and is thus restricted by MAX_PAGE_ORDER. Specifying anything about that would fail the CMA initialization. So, correctly pass in the order instead. Link: https://lkml.kernel.org/r/20240404162515.527802-2-fvdl@google.com Fixes: cf11e85fc08c ("mm: hugetlb: optionally allocate gigantic hugepages using cma") Signed-off-by: Frank van der Linden <fvdl@google.com> Acked-by: Roman Gushchin <roman.gushchin@linux.dev> Acked-by: David Hildenbrand <david@redhat.com> Cc: Marek Szyprowski <m.szyprowski@samsung.com> Cc: Muchun Song <muchun.song@linux.dev> Cc: <stable@vger.kernel.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'mm')
-rw-r--r--mm/hugetlb.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/mm/hugetlb.c b/mm/hugetlb.c
index f45c119bb8cc..c445e6fd8579 100644
--- a/mm/hugetlb.c
+++ b/mm/hugetlb.c
@@ -7879,9 +7879,9 @@ void __init hugetlb_cma_reserve(int order)
* huge page demotion.
*/
res = cma_declare_contiguous_nid(0, size, 0,
- PAGE_SIZE << HUGETLB_PAGE_ORDER,
- 0, false, name,
- &hugetlb_cma[nid], nid);
+ PAGE_SIZE << HUGETLB_PAGE_ORDER,
+ HUGETLB_PAGE_ORDER, false, name,
+ &hugetlb_cma[nid], nid);
if (res) {
pr_warn("hugetlb_cma: reservation failed: err %d, node %d",
res, nid);