hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
kernel/arch/s390/mm/pgtable.c
....@@ -19,12 +19,30 @@
1919 #include <linux/ksm.h>
2020 #include <linux/mman.h>
2121
22
-#include <asm/pgtable.h>
23
-#include <asm/pgalloc.h>
2422 #include <asm/tlb.h>
2523 #include <asm/tlbflush.h>
2624 #include <asm/mmu_context.h>
2725 #include <asm/page-states.h>
26
+
27
+pgprot_t pgprot_writecombine(pgprot_t prot)
28
+{
29
+ /*
30
+ * mio_wb_bit_mask may be set on a different CPU, but it is only set
31
+ * once at init and only read afterwards.
32
+ */
33
+ return __pgprot(pgprot_val(prot) | mio_wb_bit_mask);
34
+}
35
+EXPORT_SYMBOL_GPL(pgprot_writecombine);
36
+
37
+pgprot_t pgprot_writethrough(pgprot_t prot)
38
+{
39
+ /*
40
+ * mio_wb_bit_mask may be set on a different CPU, but it is only set
41
+ * once at init and only read afterwards.
42
+ */
43
+ return __pgprot(pgprot_val(prot) & ~mio_wb_bit_mask);
44
+}
45
+EXPORT_SYMBOL_GPL(pgprot_writethrough);
2846
2947 static inline void ptep_ipte_local(struct mm_struct *mm, unsigned long addr,
3048 pte_t *ptep, int nodat)
....@@ -301,12 +319,13 @@
301319 }
302320 EXPORT_SYMBOL(ptep_xchg_lazy);
303321
304
-pte_t ptep_modify_prot_start(struct mm_struct *mm, unsigned long addr,
322
+pte_t ptep_modify_prot_start(struct vm_area_struct *vma, unsigned long addr,
305323 pte_t *ptep)
306324 {
307325 pgste_t pgste;
308326 pte_t old;
309327 int nodat;
328
+ struct mm_struct *mm = vma->vm_mm;
310329
311330 preempt_disable();
312331 pgste = ptep_xchg_start(mm, addr, ptep);
....@@ -318,12 +337,12 @@
318337 }
319338 return old;
320339 }
321
-EXPORT_SYMBOL(ptep_modify_prot_start);
322340
323
-void ptep_modify_prot_commit(struct mm_struct *mm, unsigned long addr,
324
- pte_t *ptep, pte_t pte)
341
+void ptep_modify_prot_commit(struct vm_area_struct *vma, unsigned long addr,
342
+ pte_t *ptep, pte_t old_pte, pte_t pte)
325343 {
326344 pgste_t pgste;
345
+ struct mm_struct *mm = vma->vm_mm;
327346
328347 if (!MACHINE_HAS_NX)
329348 pte_val(pte) &= ~_PAGE_NOEXEC;
....@@ -337,7 +356,6 @@
337356 }
338357 preempt_enable();
339358 }
340
-EXPORT_SYMBOL(ptep_modify_prot_commit);
341359
342360 static inline void pmdp_idte_local(struct mm_struct *mm,
343361 unsigned long addr, pmd_t *pmdp)
....@@ -716,7 +734,7 @@
716734 pgste_val(pgste) |= PGSTE_GR_BIT | PGSTE_GC_BIT;
717735 ptev = pte_val(*ptep);
718736 if (!(ptev & _PAGE_INVALID) && (ptev & _PAGE_WRITE))
719
- page_set_storage_key(ptev & PAGE_MASK, PAGE_DEFAULT_KEY, 1);
737
+ page_set_storage_key(ptev & PAGE_MASK, PAGE_DEFAULT_KEY, 0);
720738 pgste_set_unlock(ptep, pgste);
721739 preempt_enable();
722740 }