Skip to content

Commit 19ec166

Browse files
borntraegerbonzini
authored andcommitted
KVM: s390: fix memory slot handling for KVM_SET_USER_MEMORY_REGION
kselftests exposed a problem in the s390 handling for memory slots. Right now we only do proper memory slot handling for creation of new memory slots. Neither MOVE, nor DELETION are handled properly. Let us implement those. Signed-off-by: Christian Borntraeger <[email protected]> Signed-off-by: Paolo Bonzini <[email protected]>
1 parent 2924b52 commit 19ec166

File tree

1 file changed

+21
-14
lines changed

1 file changed

+21
-14
lines changed

arch/s390/kvm/kvm-s390.c

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4524,21 +4524,28 @@ void kvm_arch_commit_memory_region(struct kvm *kvm,
45244524
const struct kvm_memory_slot *new,
45254525
enum kvm_mr_change change)
45264526
{
4527-
int rc;
4528-
4529-
/* If the basics of the memslot do not change, we do not want
4530-
* to update the gmap. Every update causes several unnecessary
4531-
* segment translation exceptions. This is usually handled just
4532-
* fine by the normal fault handler + gmap, but it will also
4533-
* cause faults on the prefix page of running guest CPUs.
4534-
*/
4535-
if (old->userspace_addr == mem->userspace_addr &&
4536-
old->base_gfn * PAGE_SIZE == mem->guest_phys_addr &&
4537-
old->npages * PAGE_SIZE == mem->memory_size)
4538-
return;
4527+
int rc = 0;
45394528

4540-
rc = gmap_map_segment(kvm->arch.gmap, mem->userspace_addr,
4541-
mem->guest_phys_addr, mem->memory_size);
4529+
switch (change) {
4530+
case KVM_MR_DELETE:
4531+
rc = gmap_unmap_segment(kvm->arch.gmap, old->base_gfn * PAGE_SIZE,
4532+
old->npages * PAGE_SIZE);
4533+
break;
4534+
case KVM_MR_MOVE:
4535+
rc = gmap_unmap_segment(kvm->arch.gmap, old->base_gfn * PAGE_SIZE,
4536+
old->npages * PAGE_SIZE);
4537+
if (rc)
4538+
break;
4539+
/* FALLTHROUGH */
4540+
case KVM_MR_CREATE:
4541+
rc = gmap_map_segment(kvm->arch.gmap, mem->userspace_addr,
4542+
mem->guest_phys_addr, mem->memory_size);
4543+
break;
4544+
case KVM_MR_FLAGS_ONLY:
4545+
break;
4546+
default:
4547+
WARN(1, "Unknown KVM MR CHANGE: %d\n", change);
4548+
}
45424549
if (rc)
45434550
pr_warn("failed to commit memory region\n");
45444551
return;

0 commit comments

Comments
 (0)