[PATCH 1/3] RISC-V: KVM: Disable SBI extension when its probe fails
Anup Patel
anup at brainfault.org
Fri May 19 07:57:36 PDT 2023
On Wed, Apr 26, 2023 at 10:43 PM Andrew Jones <ajones at ventanamicro.com> wrote:
>
> When an SBI extension specific probe function exists and fails, then
> use the extension_disabled context to disable the extension. This
> ensures the extension's functions cannot be invoked. Doing the
> disabling in kvm_vcpu_sbi_find_ext() allows it to be done lazily
> on its first use. Checking extension_disabled prior to probing
> ensures the probe is only executed once for disabled extensions.
> Later patches ensure we only execute probe once for enabled
> extensions as well.
>
> Signed-off-by: Andrew Jones <ajones at ventanamicro.com>
> ---
> arch/riscv/kvm/vcpu_sbi.c | 23 +++++++++++++++--------
> 1 file changed, 15 insertions(+), 8 deletions(-)
>
> diff --git a/arch/riscv/kvm/vcpu_sbi.c b/arch/riscv/kvm/vcpu_sbi.c
> index e52fde504433..aa3c126d2e3c 100644
> --- a/arch/riscv/kvm/vcpu_sbi.c
> +++ b/arch/riscv/kvm/vcpu_sbi.c
> @@ -307,18 +307,25 @@ int kvm_riscv_vcpu_get_reg_sbi_ext(struct kvm_vcpu *vcpu,
> const struct kvm_vcpu_sbi_extension *kvm_vcpu_sbi_find_ext(
> struct kvm_vcpu *vcpu, unsigned long extid)
> {
> - int i;
> - const struct kvm_riscv_sbi_extension_entry *sext;
> 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 i;
>
> for (i = 0; i < ARRAY_SIZE(sbi_ext); i++) {
> - sext = &sbi_ext[i];
> - if (sext->ext_ptr->extid_start <= extid &&
> - sext->ext_ptr->extid_end >= extid) {
> - if (sext->dis_idx < KVM_RISCV_SBI_EXT_MAX &&
> - scontext->extension_disabled[sext->dis_idx])
> + entry = &sbi_ext[i];
> + ext = entry->ext_ptr;
> +
> + if (ext->extid_start <= extid && ext->extid_end >= extid) {
> + if (entry->dis_idx >= KVM_RISCV_SBI_EXT_MAX)
> + return ext;
> + if (scontext->extension_disabled[entry->dis_idx])
> + return NULL;
> + if (ext->probe && !ext->probe(vcpu)) {
Calling probe() upon every kvm_vcpu_sbi_find_ext() will simply slow down
all SBI calls.
How about caching probe return values in "struct kvm_vcpu_sbi_context"
as an array?
Maybe we can have two arrays:
1) probe_done[] : Boolean array to check whether probe was done.
2) probe_retval[] : Cached probe() return values.
The SBI_EXT_BASE_PROBE_EXT call should also return the
cached value.
> + scontext->extension_disabled[entry->dis_idx] = true;
> return NULL;
> - return sbi_ext[i].ext_ptr;
> + }
> + return ext;
> }
> }
>
> --
> 2.39.2
>
Regards,
Anup
More information about the linux-riscv
mailing list