s390/gmap: return proper error code on ksm unsharing
authorChristian Borntraeger <borntraeger@de.ibm.com>
Fri, 27 Mar 2020 07:06:42 +0000 (08:06 +0100)
committerChristian Borntraeger <borntraeger@de.ibm.com>
Fri, 27 Mar 2020 10:42:53 +0000 (06:42 -0400)
If a signal is pending we might return -ENOMEM instead of -EINTR.
We should propagate the proper error during KSM unsharing.
unmerge_ksm_pages returns -ERESTARTSYS on signal_pending. This gets
translated by entry.S to -EINTR. It is important to get this error
code so that userspace can retry.

To make this clearer we also add -EINTR to the documentation of the
PV_ENABLE call, which calls unmerge_ksm_pages.

Fixes: 3ac8e38015d4 ("s390/mm: disable KSM for storage key enabled pages")
Reviewed-by: Janosch Frank <frankja@linux.vnet.ibm.com>
Reported-by: Marc Hartmayer <mhartmay@linux.ibm.com>
Tested-by: Marc Hartmayer <mhartmay@linux.ibm.com>
Reviewed-by: David Hildenbrand <david@redhat.com>
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
Documentation/virt/kvm/api.rst
arch/s390/mm/gmap.c

index bae90f3..2edb28b 100644 (file)
@@ -4677,6 +4677,12 @@ KVM_PV_ENABLE
   command has succeeded, any CPU added via hotplug will become
   protected during its creation as well.
 
+  Errors:
+
+  =====      =============================
+  EINTR      an unmasked signal is pending
+  =====      =============================
+
 KVM_PV_DISABLE
 
   Deregister the VM from the Ultravisor and reclaim the memory that
index 03c8998..2fbece4 100644 (file)
@@ -2552,12 +2552,13 @@ int gmap_mark_unmergeable(void)
 {
        struct mm_struct *mm = current->mm;
        struct vm_area_struct *vma;
+       int ret;
 
        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;
-               }
+               ret = ksm_madvise(vma, vma->vm_start, vma->vm_end,
+                                 MADV_UNMERGEABLE, &vma->vm_flags);
+               if (ret)
+                       return ret;
        }
        mm->def_flags &= ~VM_MERGEABLE;
        return 0;