These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / arch / s390 / mm / hugetlbpage.c
index e617e74..f81096b 100644 (file)
@@ -40,6 +40,7 @@ static inline pmd_t __pte_to_pmd(pte_t pte)
                pmd_val(pmd) |= (pte_val(pte) & _PAGE_PROTECT);
                pmd_val(pmd) |= (pte_val(pte) & _PAGE_DIRTY) << 10;
                pmd_val(pmd) |= (pte_val(pte) & _PAGE_YOUNG) << 10;
+               pmd_val(pmd) |= (pte_val(pte) & _PAGE_SOFT_DIRTY) << 13;
        } else
                pmd_val(pmd) = _SEGMENT_ENTRY_INVALID;
        return pmd;
@@ -78,6 +79,7 @@ static inline pte_t __pmd_to_pte(pmd_t pmd)
                pte_val(pte) |= (pmd_val(pmd) & _SEGMENT_ENTRY_PROTECT);
                pte_val(pte) |= (pmd_val(pmd) & _SEGMENT_ENTRY_DIRTY) >> 10;
                pte_val(pte) |= (pmd_val(pmd) & _SEGMENT_ENTRY_YOUNG) >> 10;
+               pte_val(pte) |= (pmd_val(pmd) & _SEGMENT_ENTRY_SOFT_DIRTY) >> 13;
        } else
                pte_val(pte) = _PAGE_INVALID;
        return pte;
@@ -86,31 +88,16 @@ static inline pte_t __pmd_to_pte(pmd_t pmd)
 void set_huge_pte_at(struct mm_struct *mm, unsigned long addr,
                     pte_t *ptep, pte_t pte)
 {
-       pmd_t pmd;
+       pmd_t pmd = __pte_to_pmd(pte);
 
-       pmd = __pte_to_pmd(pte);
-       if (!MACHINE_HAS_HPAGE) {
-               /* Emulated huge ptes loose the dirty and young bit */
-               pmd_val(pmd) &= ~_SEGMENT_ENTRY_ORIGIN;
-               pmd_val(pmd) |= pte_page(pte)[1].index;
-       } else
-               pmd_val(pmd) |= _SEGMENT_ENTRY_LARGE;
+       pmd_val(pmd) |= _SEGMENT_ENTRY_LARGE;
        *(pmd_t *) ptep = pmd;
 }
 
 pte_t huge_ptep_get(pte_t *ptep)
 {
-       unsigned long origin;
-       pmd_t pmd;
+       pmd_t pmd = *(pmd_t *) ptep;
 
-       pmd = *(pmd_t *) ptep;
-       if (!MACHINE_HAS_HPAGE && pmd_present(pmd)) {
-               origin = pmd_val(pmd) & _SEGMENT_ENTRY_ORIGIN;
-               pmd_val(pmd) &= ~_SEGMENT_ENTRY_ORIGIN;
-               pmd_val(pmd) |= *(unsigned long *) origin;
-               /* Emulated huge ptes are young and dirty by definition */
-               pmd_val(pmd) |= _SEGMENT_ENTRY_YOUNG | _SEGMENT_ENTRY_DIRTY;
-       }
        return __pmd_to_pte(pmd);
 }
 
@@ -125,45 +112,6 @@ pte_t huge_ptep_get_and_clear(struct mm_struct *mm,
        return pte;
 }
 
-int arch_prepare_hugepage(struct page *page)
-{
-       unsigned long addr = page_to_phys(page);
-       pte_t pte;
-       pte_t *ptep;
-       int i;
-
-       if (MACHINE_HAS_HPAGE)
-               return 0;
-
-       ptep = (pte_t *) pte_alloc_one(&init_mm, addr);
-       if (!ptep)
-               return -ENOMEM;
-
-       pte_val(pte) = addr;
-       for (i = 0; i < PTRS_PER_PTE; i++) {
-               set_pte_at(&init_mm, addr + i * PAGE_SIZE, ptep + i, pte);
-               pte_val(pte) += PAGE_SIZE;
-       }
-       page[1].index = (unsigned long) ptep;
-       return 0;
-}
-
-void arch_release_hugepage(struct page *page)
-{
-       pte_t *ptep;
-
-       if (MACHINE_HAS_HPAGE)
-               return;
-
-       ptep = (pte_t *) page[1].index;
-       if (!ptep)
-               return;
-       clear_table((unsigned long *) ptep, _PAGE_INVALID,
-                   PTRS_PER_PTE * sizeof(pte_t));
-       page_table_free(&init_mm, (unsigned long *) ptep);
-       page[1].index = 0;
-}
-
 pte_t *huge_pte_alloc(struct mm_struct *mm,
                        unsigned long addr, unsigned long sz)
 {
@@ -193,17 +141,9 @@ pte_t *huge_pte_offset(struct mm_struct *mm, unsigned long addr)
        return (pte_t *) pmdp;
 }
 
-int huge_pmd_unshare(struct mm_struct *mm, unsigned long *addr, pte_t *ptep)
-{
-       return 0;
-}
-
 int pmd_huge(pmd_t pmd)
 {
-       if (!MACHINE_HAS_HPAGE)
-               return 0;
-
-       return !!(pmd_val(pmd) & _SEGMENT_ENTRY_LARGE);
+       return pmd_large(pmd);
 }
 
 int pud_huge(pud_t pud)