OSDN Git Service

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 a6738c0..736ed32 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);
        }