| From be3286507dab888d4aad9f91fd6ff5202b24cd5b Mon Sep 17 00:00:00 2001 |
| From: Gerald Schaefer <gerald.schaefer@de.ibm.com> |
| Date: Mon, 21 Jan 2013 16:48:07 +0100 |
| Subject: s390/thp: implement pmdp_set_wrprotect() |
| |
| From: Gerald Schaefer <gerald.schaefer@de.ibm.com> |
| |
| commit be3286507dab888d4aad9f91fd6ff5202b24cd5b upstream. |
| |
| On s390, an architecture-specific implementation of the function |
| pmdp_set_wrprotect() is missing and the generic version is currently |
| being used. The generic version does not flush the tlb as it would be |
| needed on s390 when modifying an active pmd, which can lead to subtle |
| tlb errors on s390 when using transparent hugepages. |
| |
| This patch adds an s390-specific implementation of pmdp_set_wrprotect() |
| including the missing tlb flush. |
| |
| Signed-off-by: Gerald Schaefer <gerald.schaefer@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 | 12 ++++++++++++ |
| 1 file changed, 12 insertions(+) |
| |
| --- a/arch/s390/include/asm/pgtable.h |
| +++ b/arch/s390/include/asm/pgtable.h |
| @@ -1365,6 +1365,18 @@ static inline void pmdp_invalidate(struc |
| __pmd_idte(address, pmdp); |
| } |
| |
| +#define __HAVE_ARCH_PMDP_SET_WRPROTECT |
| +static inline void pmdp_set_wrprotect(struct mm_struct *mm, |
| + unsigned long address, pmd_t *pmdp) |
| +{ |
| + pmd_t pmd = *pmdp; |
| + |
| + if (pmd_write(pmd)) { |
| + __pmd_idte(address, pmdp); |
| + set_pmd_at(mm, address, pmdp, pmd_wrprotect(pmd)); |
| + } |
| +} |
| + |
| static inline pmd_t mk_pmd_phys(unsigned long physpage, pgprot_t pgprot) |
| { |
| pmd_t __pmd; |