Move {release,acquire}_gmap_shadow() up in preparation for the next patch. No change intended. Signed-off-by: Christoph Schlameuss --- arch/s390/kvm/vsie.c | 130 +++++++++++++++++++++++++-------------------------- 1 file changed, 65 insertions(+), 65 deletions(-) diff --git a/arch/s390/kvm/vsie.c b/arch/s390/kvm/vsie.c index 1b4f6b1691a2..c935a375f57c 100644 --- a/arch/s390/kvm/vsie.c +++ b/arch/s390/kvm/vsie.c @@ -150,6 +150,71 @@ static int prefix_is_mapped(struct vsie_page *vsie_page) return !(atomic_read(&vsie_page->scb_s.prog20) & PROG_REQUEST); } +static void release_gmap_shadow(struct vsie_page *vsie_page) +{ + struct gmap *gmap = vsie_page->gmap_cache.gmap; + + lockdep_assert_held(&gmap->kvm->arch.gmap->children_lock); + + list_del(&vsie_page->gmap_cache.list); + vsie_page->gmap_cache.gmap = NULL; + prefix_unmapped(vsie_page); + + if (list_empty(&gmap->scb_users)) { + gmap_remove_child(gmap); + gmap_put(gmap); + } +} + +static struct gmap *acquire_gmap_shadow(struct kvm_vcpu *vcpu, struct vsie_page *vsie_page) +{ + union ctlreg0 cr0; + struct gmap *gmap; + union asce asce; + int edat; + + asce.val = vcpu->arch.sie_block->gcr[1]; + cr0.val = vcpu->arch.sie_block->gcr[0]; + edat = cr0.edat && test_kvm_facility(vcpu->kvm, 8); + edat += edat && test_kvm_facility(vcpu->kvm, 78); + + scoped_guard(spinlock, &vcpu->kvm->arch.gmap->children_lock) { + gmap = vsie_page->gmap_cache.gmap; + if (gmap) { + /* + * ASCE or EDAT could have changed since last icpt, or the gmap + * we're holding has been unshadowed. If the gmap is still valid, + * we can safely reuse it. + */ + if (gmap_is_shadow_valid(gmap, asce, edat)) { + vcpu->kvm->stat.gmap_shadow_reuse++; + gmap_get(gmap); + return gmap; + } + /* release the old shadow and mark the prefix as unmapped */ + release_gmap_shadow(vsie_page); + } + } +again: + gmap = gmap_create_shadow(vcpu->arch.mc, vcpu->kvm->arch.gmap, asce, edat); + if (IS_ERR(gmap)) + return gmap; + scoped_guard(spinlock, &vcpu->kvm->arch.gmap->children_lock) { + /* unlikely race condition, remove the previous shadow */ + if (vsie_page->gmap_cache.gmap) + release_gmap_shadow(vsie_page); + if (!gmap->parent) { + gmap_put(gmap); + goto again; + } + vcpu->kvm->stat.gmap_shadow_create++; + list_add(&vsie_page->gmap_cache.list, &gmap->scb_users); + vsie_page->gmap_cache.gmap = gmap; + prefix_unmapped(vsie_page); + } + return gmap; +} + /* * Pin the guest page given by gpa and set hpa to the pinned host address. * Will always be pinned writable. @@ -1311,71 +1376,6 @@ static int do_vsie_run(struct kvm_vcpu *vcpu, struct vsie_page *vsie_page, struc return rc; } -static void release_gmap_shadow(struct vsie_page *vsie_page) -{ - struct gmap *gmap = vsie_page->gmap_cache.gmap; - - lockdep_assert_held(&gmap->kvm->arch.gmap->children_lock); - - list_del(&vsie_page->gmap_cache.list); - vsie_page->gmap_cache.gmap = NULL; - prefix_unmapped(vsie_page); - - if (list_empty(&gmap->scb_users)) { - gmap_remove_child(gmap); - gmap_put(gmap); - } -} - -static struct gmap *acquire_gmap_shadow(struct kvm_vcpu *vcpu, struct vsie_page *vsie_page) -{ - union ctlreg0 cr0; - struct gmap *gmap; - union asce asce; - int edat; - - asce.val = vcpu->arch.sie_block->gcr[1]; - cr0.val = vcpu->arch.sie_block->gcr[0]; - edat = cr0.edat && test_kvm_facility(vcpu->kvm, 8); - edat += edat && test_kvm_facility(vcpu->kvm, 78); - - scoped_guard(spinlock, &vcpu->kvm->arch.gmap->children_lock) { - gmap = vsie_page->gmap_cache.gmap; - if (gmap) { - /* - * ASCE or EDAT could have changed since last icpt, or the gmap - * we're holding has been unshadowed. If the gmap is still valid, - * we can safely reuse it. - */ - if (gmap_is_shadow_valid(gmap, asce, edat)) { - vcpu->kvm->stat.gmap_shadow_reuse++; - gmap_get(gmap); - return gmap; - } - /* release the old shadow and mark the prefix as unmapped */ - release_gmap_shadow(vsie_page); - } - } -again: - gmap = gmap_create_shadow(vcpu->arch.mc, vcpu->kvm->arch.gmap, asce, edat); - if (IS_ERR(gmap)) - return gmap; - scoped_guard(spinlock, &vcpu->kvm->arch.gmap->children_lock) { - /* unlikely race condition, remove the previous shadow */ - if (vsie_page->gmap_cache.gmap) - release_gmap_shadow(vsie_page); - if (!gmap->parent) { - gmap_put(gmap); - goto again; - } - vcpu->kvm->stat.gmap_shadow_create++; - list_add(&vsie_page->gmap_cache.list, &gmap->scb_users); - vsie_page->gmap_cache.gmap = gmap; - prefix_unmapped(vsie_page); - } - return gmap; -} - /* * Register the shadow scb at the VCPU, e.g. for kicking out of vsie. */ -- 2.55.0