| From ef771e8fb2f8d37e0fd0b906d30b7777ce42cb4a Mon Sep 17 00:00:00 2001 |
| From: Gerald Schaefer <gerald.schaefer@de.ibm.com> |
| Date: Thu, 27 Feb 2020 12:56:42 +0100 |
| Subject: [PATCH] s390/mm: fix panic in gup_fast on large pud |
| |
| commit 582b4e55403e053d8a48ff687a05174da9cc3fb0 upstream. |
| |
| On s390 there currently is no implementation of pud_write(). That was ok |
| as long as we had our own implementation of get_user_pages_fast() which |
| checked for pud protection by testing the bit directly w/o using |
| pud_write(). The other callers of pud_write() are not reachable on s390. |
| |
| After commit 1a42010cdc26 ("s390/mm: convert to the generic |
| get_user_pages_fast code") we use the generic get_user_pages_fast(), which |
| does call pud_write() in pud_access_permitted() for FOLL_WRITE access on |
| a large pud. Without an s390 specific pud_write(), the generic version is |
| called, which contains a BUG() statement to remind us that we don't have a |
| proper implementation. This results in a kernel panic. |
| |
| Fix this by providing an implementation of pud_write(). |
| |
| Cc: <stable@vger.kernel.org> # 5.2+ |
| Fixes: 1a42010cdc26 ("s390/mm: convert to the generic get_user_pages_fast code") |
| Signed-off-by: Gerald Schaefer <gerald.schaefer@de.ibm.com> |
| Reviewed-by: Heiko Carstens <heiko.carstens@de.ibm.com> |
| Signed-off-by: Vasily Gorbik <gor@linux.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 6251bfa11d5c..cb9ded67c77c 100644 |
| --- a/arch/s390/include/asm/pgtable.h |
| +++ b/arch/s390/include/asm/pgtable.h |
| @@ -755,6 +755,12 @@ static inline int pmd_write(pmd_t pmd) |
| return (pmd_val(pmd) & _SEGMENT_ENTRY_WRITE) != 0; |
| } |
| |
| +#define pud_write pud_write |
| +static inline int pud_write(pud_t pud) |
| +{ |
| + return (pud_val(pud) & _REGION3_ENTRY_WRITE) != 0; |
| +} |
| + |
| static inline int pmd_dirty(pmd_t pmd) |
| { |
| int dirty = 1; |
| -- |
| 2.7.4 |
| |