arm64: hugetlb: Cleanup setup_hugepagesz
authorSteve Capper <steve.capper@arm.com>
Tue, 22 Aug 2017 10:42:49 +0000 (11:42 +0100)
committerCatalin Marinas <catalin.marinas@arm.com>
Tue, 22 Aug 2017 16:47:12 +0000 (17:47 +0100)
Replace a lot of if statements with switch and case labels to make it
much clearer which huge page sizes are supported.

Also, we prevent PUD_SIZE from being used on systems not running with
4KB PAGE_SIZE. Before if one supplied PUD_SIZE in these circumstances,
then unusuable huge page sizes would be in use.

Fixes: 084bd29810a5 ("ARM64: mm: HugeTLB support.")
Cc: David Woods <dwoods@mellanox.com>
Signed-off-by: Steve Capper <steve.capper@arm.com>
Signed-off-by: Punit Agrawal <punit.agrawal@arm.com>
Reviewed-by: Mark Rutland <mark.rutland@arm.com>
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
arch/arm64/mm/hugetlbpage.c

index 3ceb4f275a1ae675418e7894c0dba8d59171b8ba..6cb0fa92a65162ecce1e84b8ef09177fcc54785d 100644 (file)
@@ -404,20 +404,20 @@ static __init int setup_hugepagesz(char *opt)
 {
        unsigned long ps = memparse(opt, &opt);
 
-       if (ps == PMD_SIZE) {
-               hugetlb_add_hstate(PMD_SHIFT - PAGE_SHIFT);
-       } else if (ps == PUD_SIZE) {
-               hugetlb_add_hstate(PUD_SHIFT - PAGE_SHIFT);
-       } else if (ps == (PAGE_SIZE * CONT_PTES)) {
-               hugetlb_add_hstate(CONT_PTE_SHIFT);
-       } else if (ps == (PMD_SIZE * CONT_PMDS)) {
-               hugetlb_add_hstate((PMD_SHIFT + CONT_PMD_SHIFT) - PAGE_SHIFT);
-       } else {
-               hugetlb_bad_size();
-               pr_err("hugepagesz: Unsupported page size %lu K\n", ps >> 10);
-               return 0;
+       switch (ps) {
+#ifdef CONFIG_ARM64_4K_PAGES
+       case PUD_SIZE:
+#endif
+       case PMD_SIZE * CONT_PMDS:
+       case PMD_SIZE:
+       case PAGE_SIZE * CONT_PTES:
+               hugetlb_add_hstate(ilog2(ps) - PAGE_SHIFT);
+               return 1;
        }
-       return 1;
+
+       hugetlb_bad_size();
+       pr_err("hugepagesz: Unsupported page size %lu K\n", ps >> 10);
+       return 0;
 }
 __setup("hugepagesz=", setup_hugepagesz);