| From 450e7a52674332c1ffd7ce2435b5526831452806 Mon Sep 17 00:00:00 2001 |
| From: Christian Borntraeger <borntraeger@de.ibm.com> |
| Date: Sun, 9 Apr 2017 22:09:38 +0200 |
| Subject: [PATCH] s390/mm: fix CMMA vs KSM vs others |
| |
| commit a8f60d1fadf7b8b54449fcc9d6b15248917478ba upstream. |
| |
| On heavy paging with KSM I see guest data corruption. Turns out that |
| KSM will add pages to its tree, where the mapping return true for |
| pte_unused (or might become as such later). KSM will unmap such pages |
| and reinstantiate with different attributes (e.g. write protected or |
| special, e.g. in replace_page or write_protect_page)). This uncovered |
| a bug in our pagetable handling: We must remove the unused flag as |
| soon as an entry becomes present again. |
| |
| Cc: stable@vger.kernel.org |
| Signed-of-by: Christian Borntraeger <borntraeger@de.ibm.com> |
| Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/arch/s390/include/asm/pgtable.h b/arch/s390/include/asm/pgtable.h |
| index 72c7f60bfe83..e025cfde3055 100644 |
| --- a/arch/s390/include/asm/pgtable.h |
| +++ b/arch/s390/include/asm/pgtable.h |
| @@ -1033,6 +1033,8 @@ int get_guest_storage_key(struct mm_struct *mm, unsigned long addr, |
| static inline void set_pte_at(struct mm_struct *mm, unsigned long addr, |
| pte_t *ptep, pte_t entry) |
| { |
| + if (pte_present(entry)) |
| + pte_val(entry) &= ~_PAGE_UNUSED; |
| if (mm_has_pgste(mm)) |
| ptep_set_pte_at(mm, addr, ptep, entry); |
| else |
| -- |
| 2.12.0 |
| |