From: Barry Song Date: Wed, 14 Aug 2024 22:34:16 +0000 (+1200) Subject: mm: use get_oder() and check size is is_power_of_2 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=8bfb09a8be669eac93ea0149b897ce32d4e2dcd7;p=users%2Fjedix%2Flinux-maple.git mm: use get_oder() and check size is is_power_of_2 Using get_order() is more robust according to Baolin. It is also better to filter illegal size such as 3KB, 16KB according to David. Link: https://lkml.kernel.org/r/20240814224635.43272-1-21cnbao@gmail.com Signed-off-by: Barry Song Suggested-by: Baolin Wang Suggested-by: David Hildenbrand Cc: Jonathan Corbet Cc: Lance Yang Cc: Ryan Roberts Signed-off-by: Andrew Morton --- diff --git a/mm/huge_memory.c b/mm/huge_memory.c index d32ade990059..cf8e34f62976 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c @@ -929,14 +929,17 @@ static inline int get_order_from_str(const char *size_str) int order; size = memparse(size_str, &endptr); - order = fls(size >> PAGE_SHIFT) - 1; - if ((1 << order) & ~THP_ORDERS_ALL_ANON) { - pr_err("invalid size %s(order %d) in thp_anon boot parameter\n", - size_str, order); - return -EINVAL; - } + + if (!is_power_of_2(size >> PAGE_SHIFT)) + goto err; + order = get_order(size); + if ((1 << order) & ~THP_ORDERS_ALL_ANON) + goto err; return order; +err: + pr_err("invalid size %s in thp_anon boot parameter\n", size_str); + return -EINVAL; } static char str_dup[PAGE_SIZE] __meminitdata;