| From a8f60d1fadf7b8b54449fcc9d6b15248917478ba Mon Sep 17 00:00:00 2001 |
| From: Christian Borntraeger <borntraeger@de.ibm.com> |
| Date: Sun, 9 Apr 2017 22:09:38 +0200 |
| Subject: s390/mm: fix CMMA vs KSM vs others |
| |
| From: Christian Borntraeger <borntraeger@de.ibm.com> |
| |
| 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. |
| |
| Signed-of-by: Christian Borntraeger <borntraeger@de.ibm.com> |
| Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| |
| --- |
| arch/s390/include/asm/pgtable.h | 2 ++ |
| 1 file changed, 2 insertions(+) |
| |
| --- a/arch/s390/include/asm/pgtable.h |
| +++ b/arch/s390/include/asm/pgtable.h |
| @@ -829,6 +829,8 @@ static inline void set_pte_at(struct mm_ |
| { |
| pgste_t pgste; |
| |
| + if (pte_present(entry)) |
| + pte_val(entry) &= ~_PAGE_UNUSED; |
| if (mm_has_pgste(mm)) { |
| pgste = pgste_get_lock(ptep); |
| pgste_val(pgste) &= ~_PGSTE_GPS_ZERO; |