On Tue, May 20, 2025 at 01:30:07PM +0200, Magnus Kulke wrote: > Implement MSHV-specific hooks for vCPU creation and teardown in the > i386 target. A list of locks per vCPU is maintained to lock CPU state in > MMIO operations. > > Signed-off-by: Magnus Kulke <magnusku...@linux.microsoft.com> > --- > target/i386/mshv/mshv-cpu.c | 61 +++++++++++++++++++++++++++++++++---- > 1 file changed, 55 insertions(+), 6 deletions(-) > > diff --git a/target/i386/mshv/mshv-cpu.c b/target/i386/mshv/mshv-cpu.c > index c4b2c297e2..0ba1dacaed 100644 > --- a/target/i386/mshv/mshv-cpu.c > +++ b/target/i386/mshv/mshv-cpu.c > @@ -14,6 +14,8 @@ > */ > > #include "qemu/osdep.h" > +#include "qemu/atomic.h" > +#include "qemu/lockable.h" > #include "qemu/error-report.h" > #include "qemu/typedefs.h" > > @@ -30,6 +32,36 @@ > #include "trace-accel_mshv.h" > #include "trace.h" > > +#include <sys/ioctl.h> > + > +static QemuMutex *cpu_guards_lock; > +static GHashTable *cpu_guards; > + > +static void add_cpu_guard(int cpu_fd) > +{ > + QemuMutex *guard; > + > + WITH_QEMU_LOCK_GUARD(cpu_guards_lock) { > + guard = g_new0(QemuMutex, 1); > + qemu_mutex_init(guard); > + g_hash_table_insert(cpu_guards, GUINT_TO_POINTER(cpu_fd), guard); > + } > +} > + > +static void remove_cpu_guard(int cpu_fd) > +{ > + QemuMutex *guard; > + > + WITH_QEMU_LOCK_GUARD(cpu_guards_lock) { > + guard = g_hash_table_lookup(cpu_guards, GUINT_TO_POINTER(cpu_fd)); > + if (guard) { > + qemu_mutex_destroy(guard); > + g_free(guard); > + g_hash_table_remove(cpu_guards, GUINT_TO_POINTER(cpu_fd)); > + } > + } > +} > + > int mshv_store_regs(CPUState *cpu) > { > error_report("unimplemented"); > @@ -62,20 +94,37 @@ int mshv_run_vcpu(int vm_fd, CPUState *cpu, hv_message > *msg, MshvVmExit *exit) > > void mshv_remove_vcpu(int vm_fd, int cpu_fd) > { > - error_report("unimplemented"); > - abort(); > + /* > + * TODO: don't we have to perform an ioctl to remove the vcpu? > + * there is WHvDeleteVirtualProcessor in the WHV api > + */ > + remove_cpu_guard(cpu_fd);
Can you just park that CPU and never schedule it again? There is a DELETE_VP call but we may not have exposed that to user space. The code as-is seems to be leaking the cpu_fd. If it is handled elsewhere you can ignore this comment. Thanks, Wei. > } > > + > int mshv_create_vcpu(int vm_fd, uint8_t vp_index, int *cpu_fd) > { > - error_report("unimplemented"); > - abort(); > + int ret; > + struct mshv_create_vp vp_arg = { > + .vp_index = vp_index, > + }; > + ret = ioctl(vm_fd, MSHV_CREATE_VP, &vp_arg); > + if (ret < 0) { > + error_report("failed to create mshv vcpu: %s", strerror(errno)); > + return -1; > + } > + > + add_cpu_guard(ret); > + *cpu_fd = ret; > + > + return 0; > } > > void mshv_init_cpu_logic(void) > { > - error_report("unimplemented"); > - abort(); > + cpu_guards_lock = g_new0(QemuMutex, 1); > + qemu_mutex_init(cpu_guards_lock); > + cpu_guards = g_hash_table_new(g_direct_hash, g_direct_equal); > } > > void mshv_arch_init_vcpu(CPUState *cpu) > -- > 2.34.1 >