Using get_order() is more robust according to Baolin. It is also better to filter illegal size such as 3KB, 16KB according to David. Suggested-by: Baolin Wang <baolin.wang@xxxxxxxxxxxxxxxxx> Suggested-by: David Hildenbrand <david@xxxxxxxxxx> Signed-off-by: Barry Song <v-songbaohua@xxxxxxxx> --- mm/huge_memory.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/mm/huge_memory.c b/mm/huge_memory.c index 01beda16aece..d6dade8ac5f6 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c @@ -952,14 +952,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; -- 2.34.1 Thanks Barry