Commit ec5c8697 authored by Sean Christopherson's avatar Sean Christopherson Committed by Paolo Bonzini

KVM: s390: Skip gfn/size sanity checks on memslot DELETE or FLAGS_ONLY

Sanity check the hva, gfn, and size of a userspace memory region only if
any of those properties can change, i.e. skip the checks for DELETE and
FLAGS_ONLY.  KVM doesn't allow moving the hva or changing the size, a gfn
change shows up as a MOVE even if flags are being modified, and the
checks are pointless for the DELETE case as userspace_addr and gfn_base
are zeroed by common KVM.

No functional change intended.
Signed-off-by: default avatarSean Christopherson <seanjc@google.com>
Signed-off-by: default avatarMaciej S. Szmigiero <maciej.szmigiero@oracle.com>
Message-Id: <05430738437ac2c9c7371ac4e11f4a533e1677da.1638817640.git.maciej.szmigiero@oracle.com>
parent 77aedf26
...@@ -5011,7 +5011,14 @@ int kvm_arch_prepare_memory_region(struct kvm *kvm, ...@@ -5011,7 +5011,14 @@ int kvm_arch_prepare_memory_region(struct kvm *kvm,
struct kvm_memory_slot *new, struct kvm_memory_slot *new,
enum kvm_mr_change change) enum kvm_mr_change change)
{ {
gpa_t size = new->npages * PAGE_SIZE; gpa_t size;
/* When we are protected, we should not change the memory slots */
if (kvm_s390_pv_get_handle(kvm))
return -EINVAL;
if (change == KVM_MR_DELETE || change == KVM_MR_FLAGS_ONLY)
return 0;
/* A few sanity checks. We can have memory slots which have to be /* A few sanity checks. We can have memory slots which have to be
located/ended at a segment boundary (1MB). The memory in userland is located/ended at a segment boundary (1MB). The memory in userland is
...@@ -5021,15 +5028,13 @@ int kvm_arch_prepare_memory_region(struct kvm *kvm, ...@@ -5021,15 +5028,13 @@ int kvm_arch_prepare_memory_region(struct kvm *kvm,
if (new->userspace_addr & 0xffffful) if (new->userspace_addr & 0xffffful)
return -EINVAL; return -EINVAL;
size = new->npages * PAGE_SIZE;
if (size & 0xffffful) if (size & 0xffffful)
return -EINVAL; return -EINVAL;
if ((new->base_gfn * PAGE_SIZE) + size > kvm->arch.mem_limit) if ((new->base_gfn * PAGE_SIZE) + size > kvm->arch.mem_limit)
return -EINVAL; return -EINVAL;
/* When we are protected, we should not change the memory slots */
if (kvm_s390_pv_get_handle(kvm))
return -EINVAL;
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment