s390/pgtable: Save pgste during modify_prot_start/commit
authorChristian Borntraeger <borntraeger@de.ibm.com>
Wed, 5 Jun 2013 07:22:33 +0000 (09:22 +0200)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Wed, 5 Jun 2013 15:36:20 +0000 (17:36 +0200)
In modify_prot_start we update the pgste value but never store it back
into the original location. Lets save the calculated result, since
modify_prot_commit will use the value of the pgste.

Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
arch/s390/include/asm/pgtable.h

index 391e592..f9a0a70 100644 (file)
@@ -640,6 +640,13 @@ static inline void pgste_set_unlock(pte_t *ptep, pgste_t pgste)
 #endif
 }
 
 #endif
 }
 
+static inline void pgste_set(pte_t *ptep, pgste_t pgste)
+{
+#ifdef CONFIG_PGSTE
+       *(pgste_t *)(ptep + PTRS_PER_PTE) = pgste;
+#endif
+}
+
 static inline pgste_t pgste_update_all(pte_t *ptep, pgste_t pgste)
 {
 #ifdef CONFIG_PGSTE
 static inline pgste_t pgste_update_all(pte_t *ptep, pgste_t pgste)
 {
 #ifdef CONFIG_PGSTE
@@ -1101,8 +1108,10 @@ static inline pte_t ptep_modify_prot_start(struct mm_struct *mm,
        if (!mm_exclusive(mm))
                __ptep_ipte(address, ptep);
 
        if (!mm_exclusive(mm))
                __ptep_ipte(address, ptep);
 
-       if (mm_has_pgste(mm))
+       if (mm_has_pgste(mm)) {
                pgste = pgste_update_all(&pte, pgste);
                pgste = pgste_update_all(&pte, pgste);
+               pgste_set(ptep, pgste);
+       }
        return pte;
 }
 
        return pte;
 }