diff mbox series

[v3,1/3] accel/kvm: Introduce kvm_create_and_park_vcpu() helper

Message ID 20240523072614.256172-2-harshpb@linux.ibm.com (mailing list archive)
State New, archived
Headers show
Series target/ppc: vcpu hotplug failure handling fixes | expand

Commit Message

Harsh Prateek Bora May 23, 2024, 7:26 a.m. UTC
There are distinct helpers for creating and parking a KVM vCPU.
However, there can be cases where a platform needs to create and
immediately park the vCPU during early stages of vcpu init which
can later be reused when vcpu thread gets initialized. This would
help detect failures with kvm_create_vcpu at an early stage.

Based on api refactoring to create/park vcpus introduced in 1/8 of patch series:
https://lore.kernel.org/qemu-devel/20240522211111.232114-1-salil.mehta@huawei.com/

Suggested-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: Harsh Prateek Bora <harshpb@linux.ibm.com>
---
 accel/kvm/kvm-cpus.h |  8 ++++++++
 accel/kvm/kvm-all.c  | 12 ++++++++++++
 2 files changed, 20 insertions(+)

Comments

Nicholas Piggin May 30, 2024, 8:31 a.m. UTC | #1
On Thu May 23, 2024 at 5:26 PM AEST, Harsh Prateek Bora wrote:
> There are distinct helpers for creating and parking a KVM vCPU.
> However, there can be cases where a platform needs to create and
> immediately park the vCPU during early stages of vcpu init which
> can later be reused when vcpu thread gets initialized. This would
> help detect failures with kvm_create_vcpu at an early stage.
>
> Based on api refactoring to create/park vcpus introduced in 1/8 of patch series:
> https://lore.kernel.org/qemu-devel/20240522211111.232114-1-salil.mehta@huawei.com/
>

Reviewed-by: Nicholas Piggin <npiggin@gmail.com>

> Suggested-by: Nicholas Piggin <npiggin@gmail.com>
> Signed-off-by: Harsh Prateek Bora <harshpb@linux.ibm.com>
> ---
>  accel/kvm/kvm-cpus.h |  8 ++++++++
>  accel/kvm/kvm-all.c  | 12 ++++++++++++
>  2 files changed, 20 insertions(+)
>
> diff --git a/accel/kvm/kvm-cpus.h b/accel/kvm/kvm-cpus.h
> index 2e6bb38b5d..00e534b3b9 100644
> --- a/accel/kvm/kvm-cpus.h
> +++ b/accel/kvm/kvm-cpus.h
> @@ -46,4 +46,12 @@ void kvm_park_vcpu(CPUState *cpu);
>   * @returns: KVM fd
>   */
>  int kvm_unpark_vcpu(KVMState *s, unsigned long vcpu_id);
> +
> +/**
> + *  * kvm_create_and_park_vcpu - Create and park a KVM vCPU
> + *   * @cpu: QOM CPUState object for which KVM vCPU has to be created and parked.
> + *    *
> + *     * @returns: 0 when success, errno (<0) when failed.
> + *      */

Something went wrong with re-flowing the comment?

Don't worry about resending for that just now, at least until we work
out the dependency with Salil's series and ready to merge.

Thanks,
Nick

> +int kvm_create_and_park_vcpu(CPUState *cpu);
>  #endif /* KVM_CPUS_H */
> diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c
> index fc30e5d5b8..d70ca62ff5 100644
> --- a/accel/kvm/kvm-all.c
> +++ b/accel/kvm/kvm-all.c
> @@ -398,6 +398,18 @@ int kvm_create_vcpu(CPUState *cpu)
>      return 0;
>  }
>  
> +int kvm_create_and_park_vcpu(CPUState *cpu)
> +{
> +    int ret = 0;
> +
> +    ret = kvm_create_vcpu(cpu);
> +    if (!ret) {
> +        kvm_park_vcpu(cpu);
> +    }
> +
> +    return ret;
> +}
> +
>  static int do_kvm_destroy_vcpu(CPUState *cpu)
>  {
>      KVMState *s = kvm_state;
diff mbox series

Patch

diff --git a/accel/kvm/kvm-cpus.h b/accel/kvm/kvm-cpus.h
index 2e6bb38b5d..00e534b3b9 100644
--- a/accel/kvm/kvm-cpus.h
+++ b/accel/kvm/kvm-cpus.h
@@ -46,4 +46,12 @@  void kvm_park_vcpu(CPUState *cpu);
  * @returns: KVM fd
  */
 int kvm_unpark_vcpu(KVMState *s, unsigned long vcpu_id);
+
+/**
+ *  * kvm_create_and_park_vcpu - Create and park a KVM vCPU
+ *   * @cpu: QOM CPUState object for which KVM vCPU has to be created and parked.
+ *    *
+ *     * @returns: 0 when success, errno (<0) when failed.
+ *      */
+int kvm_create_and_park_vcpu(CPUState *cpu);
 #endif /* KVM_CPUS_H */
diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c
index fc30e5d5b8..d70ca62ff5 100644
--- a/accel/kvm/kvm-all.c
+++ b/accel/kvm/kvm-all.c
@@ -398,6 +398,18 @@  int kvm_create_vcpu(CPUState *cpu)
     return 0;
 }
 
+int kvm_create_and_park_vcpu(CPUState *cpu)
+{
+    int ret = 0;
+
+    ret = kvm_create_vcpu(cpu);
+    if (!ret) {
+        kvm_park_vcpu(cpu);
+    }
+
+    return ret;
+}
+
 static int do_kvm_destroy_vcpu(CPUState *cpu)
 {
     KVMState *s = kvm_state;