--- /dev/null
+From d41aa5252394c065d1f04d1ceea885b70d00c9c6 Mon Sep 17 00:00:00 2001
+From: Daniel Black <daniel@linux.ibm.com>
+Date: Fri, 5 Oct 2018 15:52:19 -0700
+Subject: mm: madvise(MADV_DODUMP): allow hugetlbfs pages
+
+From: Daniel Black <daniel@linux.ibm.com>
+
+commit d41aa5252394c065d1f04d1ceea885b70d00c9c6 upstream.
+
+Reproducer, assuming 2M of hugetlbfs available:
+
+Hugetlbfs mounted, size=2M and option user=testuser
+
+ # mount | grep ^hugetlbfs
+ hugetlbfs on /dev/hugepages type hugetlbfs (rw,pagesize=2M,user=dan)
+ # sysctl vm.nr_hugepages=1
+ vm.nr_hugepages = 1
+ # grep Huge /proc/meminfo
+ AnonHugePages: 0 kB
+ ShmemHugePages: 0 kB
+ HugePages_Total: 1
+ HugePages_Free: 1
+ HugePages_Rsvd: 0
+ HugePages_Surp: 0
+ Hugepagesize: 2048 kB
+ Hugetlb: 2048 kB
+
+Code:
+
+ #include <sys/mman.h>
+ #include <stddef.h>
+ #define SIZE 2*1024*1024
+ int main()
+ {
+ void *ptr;
+ ptr = mmap(NULL, SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_HUGETLB | MAP_ANONYMOUS, -1, 0);
+ madvise(ptr, SIZE, MADV_DONTDUMP);
+ madvise(ptr, SIZE, MADV_DODUMP);
+ }
+
+Compile and strace:
+
+ mmap(NULL, 2097152, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_HUGETLB, -1, 0) = 0x7ff7c9200000
+ madvise(0x7ff7c9200000, 2097152, MADV_DONTDUMP) = 0
+ madvise(0x7ff7c9200000, 2097152, MADV_DODUMP) = -1 EINVAL (Invalid argument)
+
+hugetlbfs pages have VM_DONTEXPAND in the VmFlags driver pages based on
+author testing with analysis from Florian Weimer[1].
+
+The inclusion of VM_DONTEXPAND into the VM_SPECIAL defination was a
+consequence of the large useage of VM_DONTEXPAND in device drivers.
+
+A consequence of [2] is that VM_DONTEXPAND marked pages are unable to be
+marked DODUMP.
+
+A user could quite legitimately madvise(MADV_DONTDUMP) their hugetlbfs
+memory for a while and later request that madvise(MADV_DODUMP) on the same
+memory. We correct this omission by allowing madvice(MADV_DODUMP) on
+hugetlbfs pages.
+
+[1] https://stackoverflow.com/questions/52548260/madvisedodump-on-the-same-ptr-size-as-a-successful-madvisedontdump-fails-wit
+[2] commit 0103bd16fb90 ("mm: prepare VM_DONTDUMP for using in drivers")
+
+Link: http://lkml.kernel.org/r/20180930054629.29150-1-daniel@linux.ibm.com
+Link: https://lists.launchpad.net/maria-discuss/msg05245.html
+Fixes: 0103bd16fb90 ("mm: prepare VM_DONTDUMP for using in drivers")
+Reported-by: Kenneth Penza <kpenza@gmail.com>
+Signed-off-by: Daniel Black <daniel@linux.ibm.com>
+Reviewed-by: Mike Kravetz <mike.kravetz@oracle.com>
+Cc: Konstantin Khlebnikov <khlebnikov@openvz.org>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ mm/madvise.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/mm/madvise.c
++++ b/mm/madvise.c
+@@ -96,7 +96,7 @@ static long madvise_behavior(struct vm_a
+ new_flags |= VM_DONTDUMP;
+ break;
+ case MADV_DODUMP:
+- if (new_flags & VM_SPECIAL) {
++ if (!is_vm_hugetlb_page(vma) && new_flags & VM_SPECIAL) {
+ error = -EINVAL;
+ goto out;
+ }