From: Hugh Dickins <hughd@google•com>
To: Andrew Morton <akpm@linux-foundation•org>
Cc: linux-ia64@vger•kernel.org, David Hildenbrand <david@redhat•com>,
Catalin Marinas <catalin.marinas@arm•com>,
Qi Zheng <zhengqi.arch@bytedance•com>,
linux-kernel@vger•kernel.org, Max Filippov <jcmvbkbc@gmail•com>,
sparclinux@vger•kernel.org, linux-riscv@lists•infradead.org,
Claudio Imbrenda <imbrenda@linux•ibm.com>,
Will Deacon <will@kernel•org>, Greg Ungerer <gerg@linux-m68k•org>,
linux-s390@vger•kernel.org, linux-sh@vger•kernel.org,
Helge Deller <deller@gmx•de>,
x86@kernel•org, Russell King <linux@armlinux•org.uk>,
Matthew Wilcox <willy@infradead•org>,
Geert Uytterhoeven <geert@linux-m68k•org>,
Christian Borntraeger <borntraeger@linux•ibm.com>,
Alexandre Ghiti <alexghiti@rivosinc•com>,
Heiko Carstens <hca@linux•ibm.com>,
linux-m68k@lists•linux-m68k.org,
John Paul Adrian Glaubitz <glaubitz@physik•fu-berlin.de>,
John David Anglin <dave.anglin@bell•net>,
Suren Baghdasaryan <surenb@google•com>,
linux-arm-kernel@lists•infradead.org,
Chris Zankel <chris@zankel•net>, Michal Simek <mons tr@monstr•eu>,
Thomas Bogendoerfer <tsbogend@alpha•franken.de>,
linux-parisc@vger•kernel.org, linux-mm@kvack•org,
linux-mips@vger•kernel.org, Palmer Dabbelt <palmer@dabbelt•com>,
"Kirill A. Shutemov" <kirill.shutemov@linux•intel.com>,
"Aneesh Kumar K.V" <aneesh.kumar@linux•ibm.com>,
linuxppc-dev@lists•ozlabs.org,
"David S. Miller" <davem@davemloft•net>,
Mike Rapoport <rppt@kernel•org>,
Mike Kravetz <mike.kravetz@oracle•com>
Subject: [PATCH 15/23] s390: allow pte_offset_map_lock() to fail
Date: Tue, 9 May 2023 22:01:16 -0700 (PDT) [thread overview]
Message-ID: <94aec8fe-383f-892-dcbf-d4c14e460a7@google.com> (raw)
In-Reply-To: <77a5d8c-406b-7068-4f17-23b7ac53bc83@google.com>
In rare transient cases, not yet made possible, pte_offset_map() and
pte_offset_map_lock() may not find a page table: handle appropriately.
Signed-off-by: Hugh Dickins <hughd@google•com>
---
arch/s390/kernel/uv.c | 2 ++
arch/s390/mm/gmap.c | 2 ++
arch/s390/mm/pgtable.c | 12 +++++++++---
3 files changed, 13 insertions(+), 3 deletions(-)
diff --git a/arch/s390/kernel/uv.c b/arch/s390/kernel/uv.c
index cb2ee06df286..3c62d1b218b1 100644
--- a/arch/s390/kernel/uv.c
+++ b/arch/s390/kernel/uv.c
@@ -294,6 +294,8 @@ int gmap_make_secure(struct gmap *gmap, unsigned long gaddr, void *uvcb)
rc = -ENXIO;
ptep = get_locked_pte(gmap->mm, uaddr, &ptelock);
+ if (!ptep)
+ goto out;
if (pte_present(*ptep) && !(pte_val(*ptep) & _PAGE_INVALID) && pte_write(*ptep)) {
page = pte_page(*ptep);
rc = -EAGAIN;
diff --git a/arch/s390/mm/gmap.c b/arch/s390/mm/gmap.c
index dc90d1eb0d55..d198fc9475a2 100644
--- a/arch/s390/mm/gmap.c
+++ b/arch/s390/mm/gmap.c
@@ -2549,6 +2549,8 @@ static int __zap_zero_pages(pmd_t *pmd, unsigned long start,
spinlock_t *ptl;
ptep = pte_offset_map_lock(walk->mm, pmd, addr, &ptl);
+ if (!ptep)
+ break;
if (is_zero_pfn(pte_pfn(*ptep)))
ptep_xchg_direct(walk->mm, addr, ptep, __pte(_PAGE_INVALID));
pte_unmap_unlock(ptep, ptl);
diff --git a/arch/s390/mm/pgtable.c b/arch/s390/mm/pgtable.c
index 6effb24de6d9..3bd2ab2a9a34 100644
--- a/arch/s390/mm/pgtable.c
+++ b/arch/s390/mm/pgtable.c
@@ -829,7 +829,7 @@ int set_guest_storage_key(struct mm_struct *mm, unsigned long addr,
default:
return -EFAULT;
}
-
+again:
ptl = pmd_lock(mm, pmdp);
if (!pmd_present(*pmdp)) {
spin_unlock(ptl);
@@ -850,6 +850,8 @@ int set_guest_storage_key(struct mm_struct *mm, unsigned long addr,
spin_unlock(ptl);
ptep = pte_offset_map_lock(mm, pmdp, addr, &ptl);
+ if (!ptep)
+ goto again;
new = old = pgste_get_lock(ptep);
pgste_val(new) &= ~(PGSTE_GR_BIT | PGSTE_GC_BIT |
PGSTE_ACC_BITS | PGSTE_FP_BIT);
@@ -938,7 +940,7 @@ int reset_guest_reference_bit(struct mm_struct *mm, unsigned long addr)
default:
return -EFAULT;
}
-
+again:
ptl = pmd_lock(mm, pmdp);
if (!pmd_present(*pmdp)) {
spin_unlock(ptl);
@@ -955,6 +957,8 @@ int reset_guest_reference_bit(struct mm_struct *mm, unsigned long addr)
spin_unlock(ptl);
ptep = pte_offset_map_lock(mm, pmdp, addr, &ptl);
+ if (!ptep)
+ goto again;
new = old = pgste_get_lock(ptep);
/* Reset guest reference bit only */
pgste_val(new) &= ~PGSTE_GR_BIT;
@@ -1000,7 +1004,7 @@ int get_guest_storage_key(struct mm_struct *mm, unsigned long addr,
default:
return -EFAULT;
}
-
+again:
ptl = pmd_lock(mm, pmdp);
if (!pmd_present(*pmdp)) {
spin_unlock(ptl);
@@ -1017,6 +1021,8 @@ int get_guest_storage_key(struct mm_struct *mm, unsigned long addr,
spin_unlock(ptl);
ptep = pte_offset_map_lock(mm, pmdp, addr, &ptl);
+ if (!ptep)
+ goto again;
pgste = pgste_get_lock(ptep);
*key = (pgste_val(pgste) & (PGSTE_ACC_BITS | PGSTE_FP_BIT)) >> 56;
paddr = pte_val(*ptep) & PAGE_MASK;
--
2.35.3
next prev parent reply other threads:[~2023-05-10 5:02 UTC|newest]
Thread overview: 50+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-05-10 4:39 [PATCH 00/23] arch: allow pte_offset_map[_lock]() to fail Hugh Dickins
2023-05-10 4:42 ` [PATCH 01/23] arm: " Hugh Dickins
2023-05-10 14:28 ` Matthew Wilcox
2023-05-11 3:40 ` Hugh Dickins
2023-05-10 4:43 ` [PATCH 02/23] arm64: allow pte_offset_map() " Hugh Dickins
2023-05-25 16:37 ` Catalin Marinas
2023-05-10 4:45 ` [PATCH 03/23] arm64/hugetlb: pte_alloc_huge() pte_offset_huge() Hugh Dickins
2023-05-25 16:37 ` Catalin Marinas
2023-05-10 4:47 ` [PATCH 04/23] ia64/hugetlb: " Hugh Dickins
2023-05-10 4:48 ` [PATCH 05/23] m68k: allow pte_offset_map[_lock]() to fail Hugh Dickins
2023-05-10 7:13 ` Geert Uytterhoeven
2023-05-11 2:57 ` Hugh Dickins
2023-05-11 6:53 ` Geert Uytterhoeven
2023-05-10 4:49 ` [PATCH 06/23] microblaze: allow pte_offset_map() " Hugh Dickins
2023-05-10 4:51 ` [PATCH 07/23] mips: update_mmu_cache() can replace __update_tlb() Hugh Dickins
2023-05-10 4:52 ` [PATCH 08/23] parisc: add pte_unmap() to balance get_ptep() Hugh Dickins
2023-05-13 21:35 ` Helge Deller
2023-05-14 18:20 ` Hugh Dickins
2023-05-10 4:54 ` [PATCH 09/23] parisc: unmap_uncached_pte() use pte_offset_kernel() Hugh Dickins
2023-05-10 4:55 ` [PATCH 10/23] parisc/hugetlb: pte_alloc_huge() pte_offset_huge() Hugh Dickins
2023-05-10 4:56 ` [PATCH 11/23] powerpc: kvmppc_unmap_free_pmd() pte_offset_kernel() Hugh Dickins
2023-05-10 4:57 ` [PATCH 12/23] powerpc: allow pte_offset_map[_lock]() to fail Hugh Dickins
2023-05-10 4:58 ` [PATCH 13/23] powerpc/hugetlb: pte_alloc_huge() Hugh Dickins
2023-05-10 4:59 ` [PATCH 14/23] riscv/hugetlb: pte_alloc_huge() pte_offset_huge() Hugh Dickins
2023-05-10 8:01 ` Alexandre Ghiti
2023-05-10 14:01 ` Palmer Dabbelt
2023-05-10 5:01 ` Hugh Dickins [this message]
2023-05-17 10:35 ` [PATCH 15/23] s390: allow pte_offset_map_lock() to fail Claudio Imbrenda
2023-05-17 21:50 ` Hugh Dickins
2023-05-23 12:00 ` Claudio Imbrenda
2023-05-24 1:49 ` Hugh Dickins
2023-05-25 7:23 ` Claudio Imbrenda
2023-05-10 5:02 ` [PATCH 16/23] s390: gmap use pte_unmap_unlock() not spin_unlock() Hugh Dickins
2023-05-17 11:28 ` Alexander Gordeev
2023-05-10 5:03 ` [PATCH 17/23] sh/hugetlb: pte_alloc_huge() pte_offset_huge() Hugh Dickins
2023-05-10 5:04 ` [PATCH 18/23] sparc/hugetlb: " Hugh Dickins
2023-05-10 5:05 ` [PATCH 19/23] sparc: allow pte_offset_map() to fail Hugh Dickins
2023-05-10 5:07 ` [PATCH 20/23] sparc: iounit and iommu use pte_offset_kernel() Hugh Dickins
2023-05-10 5:08 ` [PATCH 21/23] x86: Allow get_locked_pte() to fail Hugh Dickins
2023-05-10 8:18 ` Peter Zijlstra
2023-05-11 3:16 ` Hugh Dickins
2023-05-11 7:29 ` Peter Zijlstra
2023-05-10 5:09 ` [PATCH 22/23] x86: sme_populate_pgd() use pte_offset_kernel() Hugh Dickins
2023-05-10 5:11 ` [PATCH 23/23] xtensa: add pte_unmap() to balance pte_offset_map() Hugh Dickins
2023-05-10 6:07 ` [PATCH 00/23] arch: allow pte_offset_map[_lock]() to fail Matthew Wilcox
2023-05-11 4:35 ` Hugh Dickins
2023-05-11 14:02 ` Matthew Wilcox
2023-05-11 22:37 ` Hugh Dickins
2023-05-12 3:38 ` Mike Rapoport
2023-05-16 10:41 ` Peter Zijlstra
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=94aec8fe-383f-892-dcbf-d4c14e460a7@google.com \
--to=hughd@google$(echo .)com \
--cc=akpm@linux-foundation$(echo .)org \
--cc=alexghiti@rivosinc$(echo .)com \
--cc=borntraeger@linux$(echo .)ibm.com \
--cc=catalin.marinas@arm$(echo .)com \
--cc=chris@zankel$(echo .)net \
--cc=dave.anglin@bell$(echo .)net \
--cc=david@redhat$(echo .)com \
--cc=deller@gmx$(echo .)de \
--cc=geert@linux-m68k$(echo .)org \
--cc=gerg@linux-m68k$(echo .)org \
--cc=glaubitz@physik$(echo .)fu-berlin.de \
--cc=hca@linux$(echo .)ibm.com \
--cc=imbrenda@linux$(echo .)ibm.com \
--cc=jcmvbkbc@gmail$(echo .)com \
--cc=linux-arm-kernel@lists$(echo .)infradead.org \
--cc=linux-ia64@vger$(echo .)kernel.org \
--cc=linux-kernel@vger$(echo .)kernel.org \
--cc=linux-m68k@lists$(echo .)linux-m68k.org \
--cc=linux-riscv@lists$(echo .)infradead.org \
--cc=linux-s390@vger$(echo .)kernel.org \
--cc=linux-sh@vger$(echo .)kernel.org \
--cc=linux@armlinux$(echo .)org.uk \
--cc=sparclinux@vger$(echo .)kernel.org \
--cc=surenb@google$(echo .)com \
--cc=will@kernel$(echo .)org \
--cc=willy@infradead$(echo .)org \
--cc=x86@kernel$(echo .)org \
--cc=zhengqi.arch@bytedance$(echo .)com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox