s390/mm: hugetlb pages within a gmap can not be freed
authorDominik Dingel <dingel@linux.vnet.ibm.com>
Fri, 13 Jul 2018 10:28:29 +0000 (11:28 +0100)
committerJanosch Frank <frankja@linux.ibm.com>
Mon, 30 Jul 2018 21:13:38 +0000 (23:13 +0200)
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>
arch/s390/mm/gmap.c

index a6738c0c4499aa73770eb2634dae7a30742e78f0..736ed32a83c58f98de0ce25ff4886bee4a0801e2 100644 (file)
@@ -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);
        }