Skip to content

Commit ac8372f

Browse files
gerald-schaeferVasily Gorbik
authored andcommitted
s390/mm: fix set_huge_pte_at() for empty ptes
On s390, the layout of normal and large ptes (i.e. pmds/puds) differs. Therefore, set_huge_pte_at() does a conversion from a normal pte to the corresponding large pmd/pud. So, when converting an empty pte, this should result in an empty pmd/pud, which would return true for pmd/pud_none(). However, after conversion we also mark the pmd/pud as large, and therefore present. For empty ptes, this will result in an empty pmd/pud that is also marked as large, and pmd/pud_none() would not return true. There is currently no issue with this behaviour, as set_huge_pte_at() does not seem to be called for empty ptes. It would be valid though, so let's fix this by not marking empty ptes as large in set_huge_pte_at(). This was found by testing a patch from from Anshuman Khandual, which is currently discussed on LKML ("mm/debug: Add more arch page table helper tests"). Signed-off-by: Gerald Schaefer <[email protected]> Signed-off-by: Vasily Gorbik <[email protected]>
1 parent 70b6905 commit ac8372f

File tree

1 file changed

+6
-3
lines changed

1 file changed

+6
-3
lines changed

arch/s390/mm/hugetlbpage.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -159,10 +159,13 @@ void set_huge_pte_at(struct mm_struct *mm, unsigned long addr,
159159
rste &= ~_SEGMENT_ENTRY_NOEXEC;
160160

161161
/* Set correct table type for 2G hugepages */
162-
if ((pte_val(*ptep) & _REGION_ENTRY_TYPE_MASK) == _REGION_ENTRY_TYPE_R3)
163-
rste |= _REGION_ENTRY_TYPE_R3 | _REGION3_ENTRY_LARGE;
164-
else
162+
if ((pte_val(*ptep) & _REGION_ENTRY_TYPE_MASK) == _REGION_ENTRY_TYPE_R3) {
163+
if (likely(pte_present(pte)))
164+
rste |= _REGION3_ENTRY_LARGE;
165+
rste |= _REGION_ENTRY_TYPE_R3;
166+
} else if (likely(pte_present(pte)))
165167
rste |= _SEGMENT_ENTRY_LARGE;
168+
166169
clear_huge_pte_skeys(mm, rste);
167170
pte_val(*ptep) = rste;
168171
}

0 commit comments

Comments
 (0)