Patch "mm/hugetlb: introduce minimum hugepage order" has been added to the 4.1-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
mm/hugetlb: introduce minimum hugepage order
to the 4.1-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
mm-hugetlb-introduce-minimum-hugepage-order.patch
and it can be found in the queue-4.1 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
641844f5616d7c6597309f560838f996466d7aacMon Sep 17 00:00:00 2001
From: Naoya Horiguchi <[email protected]>
Date: Wed, 24 Jun 2015 16:56:59 -0700
Subject: mm/hugetlb: introduce minimum hugepage order
From: Naoya Horiguchi <[email protected]>
commit 641844f5616d7c6597309f560838f996466d7aac upstream.
Currently the initial value of order in dissolve_free_huge_page is 64 or 32, which leads to the following warning in static checker:
mm/hugetlb.c:1203 dissolve_free_huge_pages()
warn: potential right shift more than type allows '9,18,64'
This is a potential risk of infinite loop, because 1 << order (== 0) is used in for-loop like this:
for (pfn =3D start_pfn; pfn < end_pfn; pfn +=3D 1 << order)
...
So this patch fixes it by using global minimum_order calculated at boot time.
text data bss dec hex filename
28313 469 84236 113018 1b97a mm/hugetlb.o 28256 473 84236 112965 1b945 mm/hugetlb.o (patched)
--- mm/hugetlb.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-)
mm/hugetlb.c +11 -8
@@ -40,6 +40,11 @@ int hugepages_treat_as_movable;int hugetlb_max_hstate__read_mostly ;unsigned int default_hstate_idx;struct hstate hstates[HUGE_MAX_HSTATE ]; +/* +* Minimum page order among possible hugepage sizes, set to a proper value +* at boot time. +*/ +static unsigned int minimum_order__read_mostly =UINT_MAX ;__initdata LIST_HEAD (huge_boot_pages);
@@ -1188,19 +1193,13 @@ static void dissolve_free_huge_page(stru*/ void dissolve_free_huge_pages (unsigned long start_pfn,unsigned long end_pfn) { -unsigned int order =8 *sizeof (void *);unsigned long pfn; -struct hstate *h;if (!hugepages_supported ())return ; -/* Set scan step to minimum hugepage size */ -for_each_hstate (h) -if (order >huge_page_order (h)) - order =huge_page_order (h); -VM_BUG_ON (!IS_ALIGNED (start_pfn,1 << order)); -for (pfn = start_pfn; pfn < end_pfn; pfn +=1 << order) +VM_BUG_ON (!IS_ALIGNED (start_pfn,1 << minimum_order)); +for (pfn = start_pfn; pfn < end_pfn; pfn +=1 << minimum_order)dissolve_free_huge_page (pfn_to_page (pfn)); }
@@ -1627,10 +1626,14 @@ static void __init hugetlb_init_hstates(struct hstate *h;for_each_hstate (h) { +if (minimum_order >huge_page_order (h)) + minimum_order =huge_page_order (h); +/* oversize hugepages were init'ed in early boot */ if (!hstate_is_gigantic (h))hugetlb_hstate_alloc_pages (h); } +VM_BUG_ON (minimum_order ==UINT_MAX ); }static char *__init memfmt (char *buf,unsigned long n)
Patches currently in stable-queue which might be from [email protected] are
queue-4.1/mm-hugetlb-introduce-minimum-hugepage-order.patch