]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
sparc64: Log warning for invalid hugepages boot param
authorVijay Kumar <vijay.ac.kumar@oracle.com>
Wed, 9 Mar 2016 19:48:38 +0000 (11:48 -0800)
committerAllen Pais <allen.pais@oracle.com>
Tue, 24 May 2016 05:12:26 +0000 (10:42 +0530)
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 <bob.picco@oracle.com>
Signed-off-by: Vijay Kumar <vijay.ac.kumar@oracle.com>
Acked-by: Nitin Gupta <nitin.m.gupta@oracle.com>
Orabug: 22729791
Signed-off-by: Allen Pais <allen.pais@oracle.com>
arch/sparc/include/asm/page_64.h
arch/sparc/mm/fault_64.c
arch/sparc/mm/hugetlbpage.c
arch/sparc/mm/init_64.c

index d254e2e92016c3ffe6b34a61a95070ea6cc12e39..a0c5f05562537de06240c137c68dd45591ecd180 100644 (file)
@@ -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)
 
index 63592cffbc59d8b643975f2c6cde0c420b0d2ebc..8d0a27fdee9aeb0600f991082ad92262a13b7982 100644 (file)
@@ -23,7 +23,6 @@
 #include <linux/percpu.h>
 #include <linux/context_tracking.h>
 #include <linux/hugetlb.h>
-#include <linux/dtrace_os.h>
 
 #include <asm/page.h>
 #include <asm/pgtable.h>
index 9a1b2a5d71a05f8e10e4e68de3cc7140eb8a1079..86bb203af1dc0ef86d2908c0460fecfc499ee829 100644 (file)
@@ -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:
index d265dacf461b40d521e4a3d64751330335f83607..c35d3bc420ada82efcd30918405d75589361ca5b 100644 (file)
@@ -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 */