summaryrefslogtreecommitdiffstats
path: root/arch/s390/mm/gmap.c
diff options
context:
space:
mode:
authorDominik Dingel <dingel@linux.vnet.ibm.com>2018-07-13 11:28:29 +0100
committerJanosch Frank <frankja@linux.ibm.com>2018-07-30 23:13:38 +0200
commit7d735b9ae82d073e23ff7d2648e0aa8056049d16 (patch)
tree988468917dcbaff06ff30f9ec0393942eb71d298 /arch/s390/mm/gmap.c
parentbd096f6443194e57382686a3ac5f2ce4e82b55d7 (diff)
downloadlinux-stable-7d735b9ae82d073e23ff7d2648e0aa8056049d16.tar.gz
linux-stable-7d735b9ae82d073e23ff7d2648e0aa8056049d16.tar.bz2
linux-stable-7d735b9ae82d073e23ff7d2648e0aa8056049d16.zip
s390/mm: hugetlb pages within a gmap can not be freed
Guests backed by huge pages could theoretically free unused pages via the diagnose 10 instruction. We currently don't allow that, so we don't have to refault it once it's needed again. Signed-off-by: Dominik Dingel <dingel@linux.vnet.ibm.com> Reviewed-by: Martin Schwidefsky <schwidefsky@de.ibm.com> Reviewed-by: David Hildenbrand <david@redhat.com> Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
Diffstat (limited to 'arch/s390/mm/gmap.c')
-rw-r--r--arch/s390/mm/gmap.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/arch/s390/mm/gmap.c b/arch/s390/mm/gmap.c
index a6738c0c4499..736ed32a83c5 100644
--- a/arch/s390/mm/gmap.c
+++ b/arch/s390/mm/gmap.c
@@ -706,6 +706,12 @@ void gmap_discard(struct gmap *gmap, unsigned long from, unsigned long to)
vmaddr |= gaddr & ~PMD_MASK;
/* Find vma in the parent mm */
vma = find_vma(gmap->mm, vmaddr);
+ /*
+ * We do not discard pages that are backed by
+ * hugetlbfs, so we don't have to refault them.
+ */
+ if (vma && is_vm_hugetlb_page(vma))
+ continue;
size = min(to - gaddr, PMD_SIZE - (gaddr & ~PMD_MASK));
zap_page_range(vma, vmaddr, size);
}