[PATCH] mm: use get_oder() and check size is is_power_of_2
From: Barry Song
Date: Wed Aug 14 2024 - 18:34:16 EST
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