Hi Palmer, On Thu, May 8, 2025 at 10:57 PM Palmer Dabbelt <pal...@dabbelt.com> wrote: > > On Thu, 24 Apr 2025 10:31:58 PDT (-0700), cle...@rivosinc.com wrote: > > The FWFT SBI extension will need to dynamically allocate memory and do > > init time specific initialization. Add an init/deinit callbacks that > > allows to do so. > > > > Signed-off-by: Clément Léger <cle...@rivosinc.com> > > Reviewed-by: Andrew Jones <ajo...@ventanamicro.com> > > --- > > arch/riscv/include/asm/kvm_vcpu_sbi.h | 9 +++++++++ > > arch/riscv/kvm/vcpu.c | 2 ++ > > arch/riscv/kvm/vcpu_sbi.c | 26 ++++++++++++++++++++++++++ > > 3 files changed, 37 insertions(+) > > There's 4 KVM patches in here without an Ack from Atish or Anup. > They're all tied up in the SBIv3 stuff, so just LMK if you want me to > take them into that staging branch or if you want me to wait. > > For now I'm going to go look at other stuff, no rush on my end.
The 4 KVM patches of this series should go through the KVM RISC-V tree to avoid conflicts when it reaches Linus. I am okay doing a shared tag for the first 10 patches. Regards, Anup > > > > > diff --git a/arch/riscv/include/asm/kvm_vcpu_sbi.h > > b/arch/riscv/include/asm/kvm_vcpu_sbi.h > > index 4ed6203cdd30..bcb90757b149 100644 > > --- a/arch/riscv/include/asm/kvm_vcpu_sbi.h > > +++ b/arch/riscv/include/asm/kvm_vcpu_sbi.h > > @@ -49,6 +49,14 @@ struct kvm_vcpu_sbi_extension { > > > > /* Extension specific probe function */ > > unsigned long (*probe)(struct kvm_vcpu *vcpu); > > + > > + /* > > + * Init/deinit function called once during VCPU init/destroy. These > > + * might be use if the SBI extensions need to allocate or do specific > > + * init time only configuration. > > + */ > > + int (*init)(struct kvm_vcpu *vcpu); > > + void (*deinit)(struct kvm_vcpu *vcpu); > > }; > > > > void kvm_riscv_vcpu_sbi_forward(struct kvm_vcpu *vcpu, struct kvm_run > > *run); > > @@ -69,6 +77,7 @@ const struct kvm_vcpu_sbi_extension > > *kvm_vcpu_sbi_find_ext( > > bool riscv_vcpu_supports_sbi_ext(struct kvm_vcpu *vcpu, int idx); > > int kvm_riscv_vcpu_sbi_ecall(struct kvm_vcpu *vcpu, struct kvm_run *run); > > void kvm_riscv_vcpu_sbi_init(struct kvm_vcpu *vcpu); > > +void kvm_riscv_vcpu_sbi_deinit(struct kvm_vcpu *vcpu); > > > > int kvm_riscv_vcpu_get_reg_sbi_sta(struct kvm_vcpu *vcpu, unsigned long > > reg_num, > > unsigned long *reg_val); > > diff --git a/arch/riscv/kvm/vcpu.c b/arch/riscv/kvm/vcpu.c > > index 60d684c76c58..877bcc85c067 100644 > > --- a/arch/riscv/kvm/vcpu.c > > +++ b/arch/riscv/kvm/vcpu.c > > @@ -185,6 +185,8 @@ void kvm_arch_vcpu_postcreate(struct kvm_vcpu *vcpu) > > > > void kvm_arch_vcpu_destroy(struct kvm_vcpu *vcpu) > > { > > + kvm_riscv_vcpu_sbi_deinit(vcpu); > > + > > /* Cleanup VCPU AIA context */ > > kvm_riscv_vcpu_aia_deinit(vcpu); > > > > diff --git a/arch/riscv/kvm/vcpu_sbi.c b/arch/riscv/kvm/vcpu_sbi.c > > index d1c83a77735e..3139f171c20f 100644 > > --- a/arch/riscv/kvm/vcpu_sbi.c > > +++ b/arch/riscv/kvm/vcpu_sbi.c > > @@ -508,5 +508,31 @@ void kvm_riscv_vcpu_sbi_init(struct kvm_vcpu *vcpu) > > scontext->ext_status[idx] = ext->default_disabled ? > > KVM_RISCV_SBI_EXT_STATUS_DISABLED : > > KVM_RISCV_SBI_EXT_STATUS_ENABLED; > > + > > + if (ext->init && ext->init(vcpu) != 0) > > + scontext->ext_status[idx] = > > KVM_RISCV_SBI_EXT_STATUS_UNAVAILABLE; > > + } > > +} > > + > > +void kvm_riscv_vcpu_sbi_deinit(struct kvm_vcpu *vcpu) > > +{ > > + struct kvm_vcpu_sbi_context *scontext = &vcpu->arch.sbi_context; > > + const struct kvm_riscv_sbi_extension_entry *entry; > > + const struct kvm_vcpu_sbi_extension *ext; > > + int idx, i; > > + > > + for (i = 0; i < ARRAY_SIZE(sbi_ext); i++) { > > + entry = &sbi_ext[i]; > > + ext = entry->ext_ptr; > > + idx = entry->ext_idx; > > + > > + if (idx < 0 || idx >= ARRAY_SIZE(scontext->ext_status)) > > + continue; > > + > > + if (scontext->ext_status[idx] == > > KVM_RISCV_SBI_EXT_STATUS_UNAVAILABLE || > > + !ext->deinit) > > + continue; > > + > > + ext->deinit(vcpu); > > } > > }