blob: 230623af7fb9b0f252aa2ba414b714dc15eaeb0b [file] [log] [blame]
From ef771e8fb2f8d37e0fd0b906d30b7777ce42cb4a Mon Sep 17 00:00:00 2001
From: Gerald Schaefer <>
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: <> # 5.2+
Fixes: 1a42010cdc26 ("s390/mm: convert to the generic get_user_pages_fast code")
Signed-off-by: Gerald Schaefer <>
Reviewed-by: Heiko Carstens <>
Signed-off-by: Vasily Gorbik <>
Signed-off-by: Paul Gortmaker <>
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;