s390/mm,hugetlb: don't use pte_val()/pXd_val() as lvalue
authorHeiko Carstens <hca@linux.ibm.com>
Mon, 21 Feb 2022 20:24:51 +0000 (21:24 +0100)
committerVasily Gorbik <gor@linux.ibm.com>
Tue, 1 Mar 2022 20:05:10 +0000 (21:05 +0100)
Convert pgtable code so pte_val()/pXd_val() aren't used as lvalue
anymore. This allows in later step to convert pte_val()/pXd_val() to
functions, which in turn makes it impossible to use these macros to
modify page table entries like they have been used before.

Therefore a construct like this:

        pte_val(*pte) = __pa(addr) | prot;

which would directly write into a page table, isn't possible anymore
with the last step of this series.

Reviewed-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
Reviewed-by: Alexander Gordeev <agordeev@linux.ibm.com>
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
arch/s390/mm/hugetlbpage.c

index 082b72d..10e51ef 100644 (file)
@@ -73,8 +73,8 @@ static inline unsigned long __pte_to_rste(pte_t pte)
 
 static inline pte_t __rste_to_pte(unsigned long rste)
 {
+       unsigned long pteval;
        int present;
-       pte_t pte;
 
        if ((rste & _REGION_ENTRY_TYPE_MASK) == _REGION_ENTRY_TYPE_R3)
                present = pud_present(__pud(rste));
@@ -102,29 +102,21 @@ static inline pte_t __rste_to_pte(unsigned long rste)
         *          u unused, l large
         */
        if (present) {
-               pte_val(pte) = rste & _SEGMENT_ENTRY_ORIGIN_LARGE;
-               pte_val(pte) |= _PAGE_LARGE | _PAGE_PRESENT;
-               pte_val(pte) |= move_set_bit(rste, _SEGMENT_ENTRY_READ,
-                                            _PAGE_READ);
-               pte_val(pte) |= move_set_bit(rste, _SEGMENT_ENTRY_WRITE,
-                                            _PAGE_WRITE);
-               pte_val(pte) |= move_set_bit(rste, _SEGMENT_ENTRY_INVALID,
-                                            _PAGE_INVALID);
-               pte_val(pte) |= move_set_bit(rste, _SEGMENT_ENTRY_PROTECT,
-                                            _PAGE_PROTECT);
-               pte_val(pte) |= move_set_bit(rste, _SEGMENT_ENTRY_DIRTY,
-                                            _PAGE_DIRTY);
-               pte_val(pte) |= move_set_bit(rste, _SEGMENT_ENTRY_YOUNG,
-                                            _PAGE_YOUNG);
+               pteval = rste & _SEGMENT_ENTRY_ORIGIN_LARGE;
+               pteval |= _PAGE_LARGE | _PAGE_PRESENT;
+               pteval |= move_set_bit(rste, _SEGMENT_ENTRY_READ, _PAGE_READ);
+               pteval |= move_set_bit(rste, _SEGMENT_ENTRY_WRITE, _PAGE_WRITE);
+               pteval |= move_set_bit(rste, _SEGMENT_ENTRY_INVALID, _PAGE_INVALID);
+               pteval |= move_set_bit(rste, _SEGMENT_ENTRY_PROTECT, _PAGE_PROTECT);
+               pteval |= move_set_bit(rste, _SEGMENT_ENTRY_DIRTY, _PAGE_DIRTY);
+               pteval |= move_set_bit(rste, _SEGMENT_ENTRY_YOUNG, _PAGE_YOUNG);
 #ifdef CONFIG_MEM_SOFT_DIRTY
-               pte_val(pte) |= move_set_bit(rste, _SEGMENT_ENTRY_SOFT_DIRTY,
-                                            _PAGE_SOFT_DIRTY);
+               pteval |= move_set_bit(rste, _SEGMENT_ENTRY_SOFT_DIRTY, _PAGE_SOFT_DIRTY);
 #endif
-               pte_val(pte) |= move_set_bit(rste, _SEGMENT_ENTRY_NOEXEC,
-                                            _PAGE_NOEXEC);
+               pteval |= move_set_bit(rste, _SEGMENT_ENTRY_NOEXEC, _PAGE_NOEXEC);
        } else
-               pte_val(pte) = _PAGE_INVALID;
-       return pte;
+               pteval = _PAGE_INVALID;
+       return __pte(pteval);
 }
 
 static void clear_huge_pte_skeys(struct mm_struct *mm, unsigned long rste)