From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-io1-f49.google.com (mail-io1-f49.google.com [209.85.166.49]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9403B2144A0 for ; Fri, 10 Jan 2025 23:42:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.166.49 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736552525; cv=none; b=hqu3N0Q/DyOrl6zx5F0Lke0m0UlZ6hR+jTyotxpu5p+d/b8beUttpPyt8lsT9me9YRyv+wS55Up/mR4tL557CdbeUfzGEHnWH/6y4dwG8A6ocPtZKNnthmrZW8rVjjBXvoV0kLyTghiomK4JrI3MiYsQQf6uHJ8FFIkyZUFwRBU= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736552525; c=relaxed/simple; bh=rIg33OnS0yCiFLFpnOIjwRwhKwMC1og1QwRWPimH85c=; h=Message-ID:Date:MIME-Version:Subject:To:References:From:Cc: In-Reply-To:Content-Type; b=bmqIq8AVWBkHN21Qdwz0d7WqiZiAKJ4TmnhFmL+lJA59KxgArVYz1ArUtLBbmQXXPwU/RJa6cw6RJXQxacCTIqYBIbObmQH1uqk7eGCSHXKVvB/9VYOpTxS0ioKqhJxnBZmIpfCFZgKArsO3Gx9x19wqVxd1SPEpznAbiGBfhCI= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=sifive.com; spf=pass smtp.mailfrom=sifive.com; dkim=pass (2048-bit key) header.d=sifive.com header.i=@sifive.com header.b=PgcqoVv1; arc=none smtp.client-ip=209.85.166.49 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=sifive.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=sifive.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=sifive.com header.i=@sifive.com header.b="PgcqoVv1" Received: by mail-io1-f49.google.com with SMTP id ca18e2360f4ac-844d555491eso81720939f.0 for ; Fri, 10 Jan 2025 15:42:03 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sifive.com; s=google; t=1736552523; x=1737157323; darn=vger.kernel.org; h=content-transfer-encoding:in-reply-to:cc:from:content-language :references:to:subject:user-agent:mime-version:date:message-id:from :to:cc:subject:date:message-id:reply-to; bh=y41MK1nXhHF98Zje9jhZUfIRHZr079NmtrcL30tPVwU=; b=PgcqoVv1u8bNKof9sQlJjzDxOcek2ysOWgyFB59nD6hrNB8oOHxVGD8yQ9PFy8mI1G YmGullwLsLjqEOOgxownYIGVZbVPm2JgN/ycpd6GaL7hU1y5/sV5flJh6a2VcBGTEKPl 3p1pws2eaDBCCoAPDzQESfFHm7B6yArTP/bfTrKuGiuSi2kDWmNbFfyP/fUbO0IwBMhJ OX8VCUdKXdoNJJrrrJP4lfzWFPHNzgB44xevB/YimHIHIsgbH2M0LjXVF/rDUyVm3xgu VLbbYM9PXrGOoT8IfSMnGJmRmJUsBhJM5X8/2cMx8ujCvS1NfBpIp7B+gx6Fj31iLJ09 cBtg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1736552523; x=1737157323; h=content-transfer-encoding:in-reply-to:cc:from:content-language :references:to:subject:user-agent:mime-version:date:message-id :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=y41MK1nXhHF98Zje9jhZUfIRHZr079NmtrcL30tPVwU=; b=fXdZ59rTWhQZTqx552ohNBa1LhTaTAOPoPTfJWoPwGAMojCvrh6/Lk1Dv/4PtLNWQd 8yQOonr2rjKqmOA3mDUNduDDvquzWb6shnNHn6TW/+c2VIDISLB9FdY9QgCVX2gaGRQ0 vzVLDXAWqBckGEqJ4zkrk/TRwIQuewk1dCj5SvOd3Csj6kN3J9t7yTR19wogAlfoI5rk kPr5Fn48t2qnVR3yareSoZDmdZqqrW7Hhito3gvWOdBFIyGFHF+J6pm4/5prekoPQJAy tPtd6iMpVklDDXT9jlstVMsnA+POHPKCwHT+iQqIT9HCJrhryBP8ishM04XvLZXJ8xOH 1bCw== X-Forwarded-Encrypted: i=1; AJvYcCVnAcqHoChvMNcY0bk9uet+ho0rKTb7l5ONQNNHe1o4pvaRjGFHFooGNdsAexdSHq9MNsaFF13Qq+CS4pA=@vger.kernel.org X-Gm-Message-State: AOJu0Yw+kmGvTmmmMKkVZ3JvI/CPTUT+uIWiw9wet6hhYBdm/CNj17iv BAPnoxj1MGDcQG6zWfjl7AAylQAhYZyYeauXQKqHsUagcbLnpXz1qefnMTw4oDg= X-Gm-Gg: ASbGncs1XzqleCWuFQ6qy0tQSgdtICHPIz5CBQoMdKJCzp4Of6MPU27HSKHYEkC+jpr YQJH3XaIev4GMHoFgTbYgam4AATfJSZep04+JbOU3WCfb2SMPysxb0xTmk7c4lEI+NgkxlHBNs/ pGLKWJceGaZNxSma4rWxeFagf6PwYZp6J90kh5T4r+kh7qNkHrofkNbdyRSQgwbi/YfZ06UJDoe U0p5xcEugEr7bnKzKi8FujtLaPivrBtPyVq7S2l4vd21OG/poSc/FOCw7E9rTXoctWbeal20WI3 HnF3 X-Google-Smtp-Source: AGHT+IEvcdQ6WJ2GPTcAtzPp+zU0y4cUD8oHRoixv++8yvMOyxwbuZNKeY1IICJwtAM7OPu+Ww0QiQ== X-Received: by 2002:a05:6602:3787:b0:843:ea9a:acc4 with SMTP id ca18e2360f4ac-84ce01254c3mr1252136939f.8.1736552522737; Fri, 10 Jan 2025 15:42:02 -0800 (PST) Received: from [100.64.0.1] ([165.188.116.9]) by smtp.gmail.com with ESMTPSA id ca18e2360f4ac-84d4faee16bsm113381339f.4.2025.01.10.15.42.01 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 10 Jan 2025 15:42:02 -0800 (PST) Message-ID: Date: Fri, 10 Jan 2025 17:42:00 -0600 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH 3/6] RISC-V: KVM: add SBI extension init()/deinit() functions To: =?UTF-8?B?Q2zDqW1lbnQgTMOpZ2Vy?= References: <20250106154847.1100344-1-cleger@rivosinc.com> <20250106154847.1100344-4-cleger@rivosinc.com> Content-Language: en-US From: Samuel Holland Cc: Paul Walmsley , Palmer Dabbelt , Anup Patel , Atish Patra , linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org, kvm@vger.kernel.org, kvm-riscv@lists.infradead.org In-Reply-To: <20250106154847.1100344-4-cleger@rivosinc.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Hi Clément, On 2025-01-06 9:48 AM, Clément Léger 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 > --- > arch/riscv/include/asm/kvm_vcpu_sbi.h | 9 ++++++++ > arch/riscv/kvm/vcpu.c | 2 ++ > arch/riscv/kvm/vcpu_sbi.c | 31 ++++++++++++++++++++++++++- > 3 files changed, 41 insertions(+), 1 deletion(-) > > diff --git a/arch/riscv/include/asm/kvm_vcpu_sbi.h b/arch/riscv/include/asm/kvm_vcpu_sbi.h > index b96705258cf9..8c465ce90e73 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 e048dcc6e65e..3420a4a62c94 100644 > --- a/arch/riscv/kvm/vcpu.c > +++ b/arch/riscv/kvm/vcpu.c > @@ -180,6 +180,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 6e704ed86a83..d2dbb0762072 100644 > --- a/arch/riscv/kvm/vcpu_sbi.c > +++ b/arch/riscv/kvm/vcpu_sbi.c > @@ -486,7 +486,7 @@ void kvm_riscv_vcpu_sbi_init(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; > + int idx, i, ret; > > for (i = 0; i < ARRAY_SIZE(sbi_ext); i++) { > entry = &sbi_ext[i]; > @@ -501,8 +501,37 @@ void kvm_riscv_vcpu_sbi_init(struct kvm_vcpu *vcpu) > continue; > } > > + if (ext->init) { > + ret = ext->init(vcpu); > + if (ret) > + scontext->ext_status[idx] = > + KVM_RISCV_SBI_EXT_STATUS_UNAVAILABLE; > + } > + > scontext->ext_status[idx] = ext->default_disabled ? > KVM_RISCV_SBI_EXT_STATUS_DISABLED : > KVM_RISCV_SBI_EXT_STATUS_ENABLED; This will overwrite the KVM_RISCV_SBI_EXT_STATUS_UNAVAILABLE set above. > } > } > + > +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_ENABLED || !ext->deinit) Given that an extension can be enabled/disabled after initialization, this should only skip deinit if the status is UNAVAILABLE. Regards, Samuel > + continue; > + > + ext->deinit(vcpu); > + } > +}