}
 EXPORT_SYMBOL_GPL(s390_enable_sie);
 
+int gmap_mark_unmergeable(void)
+{
+       struct mm_struct *mm = current->mm;
+       struct vm_area_struct *vma;
+
+       for (vma = mm->mmap; vma; vma = vma->vm_next) {
+               if (ksm_madvise(vma, vma->vm_start, vma->vm_end,
+                               MADV_UNMERGEABLE, &vma->vm_flags)) {
+                       return -ENOMEM;
+               }
+       }
+       mm->def_flags &= ~VM_MERGEABLE;
+       return 0;
+}
+EXPORT_SYMBOL_GPL(gmap_mark_unmergeable);
+
 /*
  * Enable storage key handling from now on and initialize the storage
  * keys with the default key.
 int s390_enable_skey(void)
 {
        struct mm_struct *mm = current->mm;
-       struct vm_area_struct *vma;
        int rc = 0;
 
        down_write(&mm->mmap_sem);
                goto out_up;
 
        mm->context.uses_skeys = 1;
-       for (vma = mm->mmap; vma; vma = vma->vm_next) {
-               if (ksm_madvise(vma, vma->vm_start, vma->vm_end,
-                               MADV_UNMERGEABLE, &vma->vm_flags)) {
-                       mm->context.uses_skeys = 0;
-                       rc = -ENOMEM;
-                       goto out_up;
-               }
+       rc = gmap_mark_unmergeable();
+       if (rc) {
+               mm->context.uses_skeys = 0;
+               goto out_up;
        }
-       mm->def_flags &= ~VM_MERGEABLE;
-
        walk_page_range(mm, 0, TASK_SIZE, &enable_skey_walk_ops, NULL);
 
 out_up: