|
@@ -1256,6 +1256,15 @@ static int __s390_enable_skey(pte_t *pte, unsigned long addr,
|
|
|
pgste_t pgste;
|
|
|
|
|
|
pgste = pgste_get_lock(pte);
|
|
|
+ /*
|
|
|
+ * Remove all zero page mappings,
|
|
|
+ * after establishing a policy to forbid zero page mappings
|
|
|
+ * following faults for that page will get fresh anonymous pages
|
|
|
+ */
|
|
|
+ if (is_zero_pfn(pte_pfn(*pte))) {
|
|
|
+ ptep_flush_direct(walk->mm, addr, pte);
|
|
|
+ pte_val(*pte) = _PAGE_INVALID;
|
|
|
+ }
|
|
|
/* Clear storage key */
|
|
|
pgste_val(pgste) &= ~(PGSTE_ACC_BITS | PGSTE_FP_BIT |
|
|
|
PGSTE_GR_BIT | PGSTE_GC_BIT);
|
|
@@ -1274,9 +1283,11 @@ void s390_enable_skey(void)
|
|
|
down_write(&mm->mmap_sem);
|
|
|
if (mm_use_skey(mm))
|
|
|
goto out_up;
|
|
|
+
|
|
|
+ mm->context.use_skey = 1;
|
|
|
+
|
|
|
walk.mm = mm;
|
|
|
walk_page_range(0, TASK_SIZE, &walk);
|
|
|
- mm->context.use_skey = 1;
|
|
|
|
|
|
out_up:
|
|
|
up_write(&mm->mmap_sem);
|