* [PATCH AUTOSEL 4.4 10/10] KVM: s390: fix memory slot handling for KVM_SET_USER_MEMORY_REGION [not found] <20190604232532.7953-1-sashal@kernel.org> @ 2019-06-04 23:25 ` Sasha Levin 2019-06-05 12:14 ` Christian Borntraeger 0 siblings, 1 reply; 2+ messages in thread From: Sasha Levin @ 2019-06-04 23:25 UTC (permalink / raw) To: linux-kernel, stable Cc: Christian Borntraeger, Paolo Bonzini, Sasha Levin, linux-s390 From: Christian Borntraeger <borntraeger@de.ibm.com> [ Upstream commit 19ec166c3f39fe1d3789888a74cc95544ac266d4 ] 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 <borntraeger@de.ibm.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Sasha Levin <sashal@kernel.org> --- arch/s390/kvm/kvm-s390.c | 35 +++++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c index 5ddb1debba95..23911ecfbad6 100644 --- a/arch/s390/kvm/kvm-s390.c +++ b/arch/s390/kvm/kvm-s390.c @@ -2721,21 +2721,28 @@ void kvm_arch_commit_memory_region(struct kvm *kvm, const struct kvm_memory_slot *new, enum kvm_mr_change change) { - int rc; - - /* If the basics of the memslot do not change, we do not want - * to update the gmap. Every update causes several unnecessary - * segment translation exceptions. This is usually handled just - * fine by the normal fault handler + gmap, but it will also - * cause faults on the prefix page of running guest CPUs. - */ - if (old->userspace_addr == mem->userspace_addr && - old->base_gfn * PAGE_SIZE == mem->guest_phys_addr && - old->npages * PAGE_SIZE == mem->memory_size) - return; + int rc = 0; - rc = gmap_map_segment(kvm->arch.gmap, mem->userspace_addr, - mem->guest_phys_addr, mem->memory_size); + switch (change) { + case KVM_MR_DELETE: + rc = gmap_unmap_segment(kvm->arch.gmap, old->base_gfn * PAGE_SIZE, + old->npages * PAGE_SIZE); + break; + case KVM_MR_MOVE: + rc = gmap_unmap_segment(kvm->arch.gmap, old->base_gfn * PAGE_SIZE, + old->npages * PAGE_SIZE); + if (rc) + break; + /* FALLTHROUGH */ + case KVM_MR_CREATE: + rc = gmap_map_segment(kvm->arch.gmap, mem->userspace_addr, + mem->guest_phys_addr, mem->memory_size); + break; + case KVM_MR_FLAGS_ONLY: + break; + default: + WARN(1, "Unknown KVM MR CHANGE: %d\n", change); + } if (rc) pr_warn("failed to commit memory region\n"); return; -- 2.20.1 ^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH AUTOSEL 4.4 10/10] KVM: s390: fix memory slot handling for KVM_SET_USER_MEMORY_REGION 2019-06-04 23:25 ` [PATCH AUTOSEL 4.4 10/10] KVM: s390: fix memory slot handling for KVM_SET_USER_MEMORY_REGION Sasha Levin @ 2019-06-05 12:14 ` Christian Borntraeger 0 siblings, 0 replies; 2+ messages in thread From: Christian Borntraeger @ 2019-06-05 12:14 UTC (permalink / raw) To: Sasha Levin, linux-kernel, stable; +Cc: Paolo Bonzini, linux-s390 On 05.06.19 01:25, Sasha Levin wrote: > From: Christian Borntraeger <borntraeger@de.ibm.com> > > [ Upstream commit 19ec166c3f39fe1d3789888a74cc95544ac266d4 ] > > 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. I gave this a quick spin on 4.4.y and it seems to work fine. > > Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com> > Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> > Signed-off-by: Sasha Levin <sashal@kernel.org> > --- > arch/s390/kvm/kvm-s390.c | 35 +++++++++++++++++++++-------------- > 1 file changed, 21 insertions(+), 14 deletions(-) > > diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c > index 5ddb1debba95..23911ecfbad6 100644 > --- a/arch/s390/kvm/kvm-s390.c > +++ b/arch/s390/kvm/kvm-s390.c > @@ -2721,21 +2721,28 @@ void kvm_arch_commit_memory_region(struct kvm *kvm, > const struct kvm_memory_slot *new, > enum kvm_mr_change change) > { > - int rc; > - > - /* If the basics of the memslot do not change, we do not want > - * to update the gmap. Every update causes several unnecessary > - * segment translation exceptions. This is usually handled just > - * fine by the normal fault handler + gmap, but it will also > - * cause faults on the prefix page of running guest CPUs. > - */ > - if (old->userspace_addr == mem->userspace_addr && > - old->base_gfn * PAGE_SIZE == mem->guest_phys_addr && > - old->npages * PAGE_SIZE == mem->memory_size) > - return; > + int rc = 0; > > - rc = gmap_map_segment(kvm->arch.gmap, mem->userspace_addr, > - mem->guest_phys_addr, mem->memory_size); > + switch (change) { > + case KVM_MR_DELETE: > + rc = gmap_unmap_segment(kvm->arch.gmap, old->base_gfn * PAGE_SIZE, > + old->npages * PAGE_SIZE); > + break; > + case KVM_MR_MOVE: > + rc = gmap_unmap_segment(kvm->arch.gmap, old->base_gfn * PAGE_SIZE, > + old->npages * PAGE_SIZE); > + if (rc) > + break; > + /* FALLTHROUGH */ > + case KVM_MR_CREATE: > + rc = gmap_map_segment(kvm->arch.gmap, mem->userspace_addr, > + mem->guest_phys_addr, mem->memory_size); > + break; > + case KVM_MR_FLAGS_ONLY: > + break; > + default: > + WARN(1, "Unknown KVM MR CHANGE: %d\n", change); > + } > if (rc) > pr_warn("failed to commit memory region\n"); > return; > ^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2019-06-05 12:14 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <20190604232532.7953-1-sashal@kernel.org>
2019-06-04 23:25 ` [PATCH AUTOSEL 4.4 10/10] KVM: s390: fix memory slot handling for KVM_SET_USER_MEMORY_REGION Sasha Levin
2019-06-05 12:14 ` Christian Borntraeger
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox