Message ID | 20250116113355.32184-5-imbrenda@linux.ibm.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | KVM: s390: Stop using page->index and other things | expand |
On 1/16/25 12:33 PM, Claudio Imbrenda wrote: > Create a fake memslot for ucontrol VMs. The fake memslot identity-maps > userspace. > > Now memslots will always be present, and ucontrol is not a special case > anymore. > > Suggested-by: Sean Christopherson <seanjc@google.com> > Signed-off-by: Claudio Imbrenda <imbrenda@linux.ibm.com> You'll need to update the Documentation because of the ucontrol EINVAL/EEXIST return change. I don't like having EEXIST as a return value but I also don't see a lot of gains in changing common code just so we can return the correct rc.
On Thu, 16 Jan 2025 13:42:50 +0100 Janosch Frank <frankja@linux.ibm.com> wrote: > On 1/16/25 12:33 PM, Claudio Imbrenda wrote: > > Create a fake memslot for ucontrol VMs. The fake memslot identity-maps > > userspace. > > > > Now memslots will always be present, and ucontrol is not a special case > > anymore. > > > > Suggested-by: Sean Christopherson <seanjc@google.com> > > Signed-off-by: Claudio Imbrenda <imbrenda@linux.ibm.com> > > You'll need to update the Documentation because of the ucontrol > EINVAL/EEXIST return change. ufff that fell off my brain cache; I'll fix it > > I don't like having EEXIST as a return value but I also don't see a lot > of gains in changing common code just so we can return the correct rc.
diff --git a/arch/s390/include/asm/kvm_host.h b/arch/s390/include/asm/kvm_host.h index 97c7c8127543..9df37361bc64 100644 --- a/arch/s390/include/asm/kvm_host.h +++ b/arch/s390/include/asm/kvm_host.h @@ -30,6 +30,8 @@ #define KVM_S390_ESCA_CPU_SLOTS 248 #define KVM_MAX_VCPUS 255 +#define KVM_INTERNAL_MEM_SLOTS 1 + /* * These seem to be used for allocating ->chip in the routing table, which we * don't use. 1 is as small as we can get to reduce the needed memory. If we diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c index fda2c1121093..c9496d23470c 100644 --- a/arch/s390/kvm/kvm-s390.c +++ b/arch/s390/kvm/kvm-s390.c @@ -3429,8 +3429,18 @@ int kvm_arch_init_vm(struct kvm *kvm, unsigned long type) VM_EVENT(kvm, 3, "vm created with type %lu", type); if (type & KVM_VM_S390_UCONTROL) { + struct kvm_userspace_memory_region2 fake_memslot = { + .slot = KVM_S390_UCONTROL_MEMSLOT, + .guest_phys_addr = 0, + .userspace_addr = 0, + .memory_size = ALIGN_DOWN(TASK_SIZE, _SEGMENT_SIZE), + .flags = 0, + }; + kvm->arch.gmap = NULL; kvm->arch.mem_limit = KVM_S390_NO_MEM_LIMIT; + /* one flat fake memslot covering the whole address-space */ + KVM_BUG_ON(kvm_set_internal_memslot(kvm, &fake_memslot), kvm); } else { if (sclp.hamax == U64_MAX) kvm->arch.mem_limit = TASK_SIZE_MAX; @@ -5855,7 +5865,7 @@ int kvm_arch_prepare_memory_region(struct kvm *kvm, { gpa_t size; - if (kvm_is_ucontrol(kvm)) + if (kvm_is_ucontrol(kvm) && new->id < KVM_USER_MEM_SLOTS) return -EINVAL; /* When we are protected, we should not change the memory slots */ @@ -5907,6 +5917,9 @@ void kvm_arch_commit_memory_region(struct kvm *kvm, { int rc = 0; + if (kvm_is_ucontrol(kvm)) + return; + switch (change) { case KVM_MR_DELETE: rc = gmap_unmap_segment(kvm->arch.gmap, old->base_gfn * PAGE_SIZE, diff --git a/arch/s390/kvm/kvm-s390.h b/arch/s390/kvm/kvm-s390.h index 597d7a71deeb..30736ac16f84 100644 --- a/arch/s390/kvm/kvm-s390.h +++ b/arch/s390/kvm/kvm-s390.h @@ -20,6 +20,8 @@ #include <asm/processor.h> #include <asm/sclp.h> +#define KVM_S390_UCONTROL_MEMSLOT (KVM_USER_MEM_SLOTS + 0) + static inline void kvm_s390_fpu_store(struct kvm_run *run) { fpu_stfpc(&run->s.regs.fpc);
Create a fake memslot for ucontrol VMs. The fake memslot identity-maps userspace. Now memslots will always be present, and ucontrol is not a special case anymore. Suggested-by: Sean Christopherson <seanjc@google.com> Signed-off-by: Claudio Imbrenda <imbrenda@linux.ibm.com> --- arch/s390/include/asm/kvm_host.h | 2 ++ arch/s390/kvm/kvm-s390.c | 15 ++++++++++++++- arch/s390/kvm/kvm-s390.h | 2 ++ 3 files changed, 18 insertions(+), 1 deletion(-)