Blob Blame History Raw
From: Janosch Frank <frankja@linux.ibm.com>
Subject: s390/mm: hugetlb pages within a gmap can not be freed
Patch-mainline: v4.19-rc1
Git-commit: 7d735b9ae82d073e23ff7d2648e0aa8056049d16
References: FATE#326372, LTC#169184, bsc#1113484

Summary:     kernel: Introduce huge page KVM backing support
Description: This adds the KVM support for libhugetlbfs backings of
             s390 KVM guests.

Upstream-Description:

             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>

Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
Acked-by: Petr Tesarik <ptesarik@suse.com>
---
 arch/s390/mm/gmap.c |    6 ++++++
 1 file changed, 6 insertions(+)

--- a/arch/s390/mm/gmap.c
+++ b/arch/s390/mm/gmap.c
@@ -702,6 +702,12 @@ void gmap_discard(struct gmap *gmap, uns
 		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);
 	}