From bd52d0fd57c96146f8d1838588753ab9dabcd2fe Mon Sep 17 00:00:00 2001 From: Vijay Kumar Date: Wed, 9 Mar 2016 11:48:38 -0800 Subject: [PATCH] sparc64: Log warning for invalid hugepages boot param When an invalid hugepage param is mentioned in kernel boot param, appropriate warning should be logged to indicate if it's not a) software supported b) MMU support for xl_hugepagesz c) xl_hugepagesz not in use Signed-off-by: Bob Picco Signed-off-by: Vijay Kumar Acked-by: Nitin Gupta Orabug: 22729791 Signed-off-by: Allen Pais --- arch/sparc/include/asm/page_64.h | 2 + arch/sparc/mm/fault_64.c | 1 - arch/sparc/mm/hugetlbpage.c | 13 ++--- arch/sparc/mm/init_64.c | 86 +++++++++++++++++++++----------- 4 files changed, 63 insertions(+), 39 deletions(-) diff --git a/arch/sparc/include/asm/page_64.h b/arch/sparc/include/asm/page_64.h index d254e2e92016c..a0c5f05562537 100644 --- a/arch/sparc/include/asm/page_64.h +++ b/arch/sparc/include/asm/page_64.h @@ -17,6 +17,8 @@ #define HPAGE_SHIFT 23 #define REAL_HPAGE_SHIFT 22 +#define XLHPAGE_16GB_SHIFT 34 +#define XLHPAGE_2GB_SHIFT 31 #define REAL_HPAGE_SIZE (_AC(1,UL) << REAL_HPAGE_SHIFT) diff --git a/arch/sparc/mm/fault_64.c b/arch/sparc/mm/fault_64.c index 63592cffbc59d..8d0a27fdee9ae 100644 --- a/arch/sparc/mm/fault_64.c +++ b/arch/sparc/mm/fault_64.c @@ -23,7 +23,6 @@ #include #include #include -#include #include #include diff --git a/arch/sparc/mm/hugetlbpage.c b/arch/sparc/mm/hugetlbpage.c index 9a1b2a5d71a05..86bb203af1dc0 100644 --- a/arch/sparc/mm/hugetlbpage.c +++ b/arch/sparc/mm/hugetlbpage.c @@ -202,16 +202,13 @@ static unsigned int sun4v_tte_to_shift(pte_t entry) switch (hugepage_tte) { case _PAGE_SZ16GB_4V: - hugepage_shift = 34U; + hugepage_shift = XLHPAGE_16GB_SHIFT; break; case _PAGE_SZ2GB_4V: - hugepage_shift = 31U; - break; - case _PAGE_SZ256MB_4V: - hugepage_shift = 28U; + hugepage_shift = XLHPAGE_2GB_SHIFT; break; case _PAGE_SZ4MB_4V: - hugepage_shift = 22U; + hugepage_shift = REAL_HPAGE_SHIFT; break; default: WARN_ONCE(1, "hugepage_shift: hugepage_tte=0x%lx\n", @@ -267,11 +264,11 @@ static pte_t hugepage_shift_to_tte(pte_t entry, unsigned int hugepage_shift) switch (hugepage_shift) { /* 16Gb */ - case 34U: + case XLHPAGE_16GB_SHIFT: sun4v_hugepage_size = _PAGE_SZ16GB_4V; break; /* 2Gb */ - case 31U: + case XLHPAGE_2GB_SHIFT: sun4v_hugepage_size = _PAGE_SZ2GB_4V; break; default: diff --git a/arch/sparc/mm/init_64.c b/arch/sparc/mm/init_64.c index d265dacf461b4..c35d3bc420ada 100644 --- a/arch/sparc/mm/init_64.c +++ b/arch/sparc/mm/init_64.c @@ -402,57 +402,83 @@ static void __init sun4v_xl_hugepage_pte_branch_patch(void) : "r" (insn)); } -static int __init setup_hugepagesz(char *string) +static int __init setup_xl_hugepage(unsigned int hugepage_shift) { - unsigned int hugepage_shift, hv_pgsz_mask; - unsigned long long xl_hugepage_size; unsigned short hv_pgsz_idx; + unsigned int hv_pgsz_mask; + int rc = 0; - if (tlb_type != hypervisor) - goto out; - - xl_hugepage_size = memparse(string, &string); - /* Validate the xl_hugepage_size.*/ - if (!is_power_of_2(xl_hugepage_size)) - goto bad; - - /* Now determine whether the size is good for xl_hugepage_size. - * One the chip must support it and two, for now, it must be >= 2Gb. - */ - hugepage_shift = ilog2(xl_hugepage_size); switch (hugepage_shift) { - case 34U: + case XLHPAGE_16GB_SHIFT: + xl_hugepage_pte = _PAGE_SZ16GB_4V; hv_pgsz_mask = HV_PGSZ_MASK_16GB; hv_pgsz_idx = HV_PGSZ_IDX_16GB; - xl_hugepage_pte = _PAGE_SZ16GB_4V; break; - case 31U: + case XLHPAGE_2GB_SHIFT: + xl_hugepage_pte = _PAGE_SZ2GB_4V; hv_pgsz_mask = HV_PGSZ_MASK_2GB; hv_pgsz_idx = HV_PGSZ_IDX_2GB; - xl_hugepage_pte = _PAGE_SZ2GB_4V; break; default: - hv_pgsz_mask = 0U; - hv_pgsz_idx = HV_PGSZ_IDX_8K; - break; + goto out; } - if ((hv_pgsz_mask & cpu_pgsz_mask) == 0U) - goto bad; + if ((hv_pgsz_mask & cpu_pgsz_mask) == 0U) { + pr_warn("hugepagesz=%luM not supported by MMU.\n", + (1UL << (hugepage_shift - 20))); + goto out; + } + + if (xl_hugepage_shift) { + pr_warn("hugepagesz=%luM in use and hugepagesz=%luM" + " ignored.\n", + (1UL << (xl_hugepage_shift - 20)), + (1UL << (hugepage_shift - 20))); + goto out; + } xl_hugepage_shift = hugepage_shift; - xl_hugepage_size = 1UL << hugepage_shift; sun4v_xl_hugepage_hash_patch(); sun4v_xl_hugepage_pte_size_patch(); sun4v_xl_hugepage_pte_branch_patch(); hv_establish_xl_hugepage_tsb_descriptor(hv_pgsz_idx, hv_pgsz_mask); - hugetlb_add_hstate(HUGETLB_PAGE_ORDER); hugetlb_add_hstate(xl_hugepage_shift - PAGE_SHIFT); - goto out; -bad: - pr_warn("Invalid xl_hugepage_size=0x%llx.\n", xl_hugepage_size); + rc = 1; out: - return 0; + return rc; +} + +static int __init setup_hugepagesz(char *string) +{ + unsigned long long xl_hugepage_size; + int rc = 0; + + if (tlb_type != hypervisor) + goto out; + + xl_hugepage_size = memparse(string, &string); + + switch (xl_hugepage_size) { + case 1UL << XLHPAGE_16GB_SHIFT: + case 1UL << XLHPAGE_2GB_SHIFT: + { + unsigned int hugepage_shift = ilog2(xl_hugepage_size); + + rc = setup_xl_hugepage(hugepage_shift); + break; + } + default: + pr_warn("hugepage size(0x%llx) not supported.\n", + xl_hugepage_size); + break; + case HPAGE_SIZE: + hugetlb_add_hstate(HUGETLB_PAGE_ORDER); + rc = 1; + break; + } + +out: + return rc; } __setup("hugepagesz=", setup_hugepagesz); #endif /* CONFIG_HUGETLB_PAGE */ -- 2.49.0