Am 02/12/2022 um 07:54 schrieb Robert Hoo: > On Fri, 2022-11-11 at 10:47 -0500, Emanuele Giuseppe Esposito wrote: >> Using the new accel-blocker API, mark where ioctls are being called >> in KVM. Next, we will implement the critical section that will take >> care of performing memslots modifications atomically, therefore >> preventing any new ioctl from running and allowing the running ones >> to finish. >> >> Signed-off-by: David Hildenbrand <david@xxxxxxxxxx> >> Signed-off-by: Emanuele Giuseppe Esposito <eesposit@xxxxxxxxxx> >> --- >> accel/kvm/kvm-all.c | 7 +++++++ >> 1 file changed, 7 insertions(+) >> >> diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c >> index f99b0becd8..ff660fd469 100644 >> --- a/accel/kvm/kvm-all.c >> +++ b/accel/kvm/kvm-all.c >> @@ -2310,6 +2310,7 @@ static int kvm_init(MachineState *ms) >> assert(TARGET_PAGE_SIZE <= qemu_real_host_page_size()); >> >> s->sigmask_len = 8; >> + accel_blocker_init(); >> >> #ifdef KVM_CAP_SET_GUEST_DEBUG >> QTAILQ_INIT(&s->kvm_sw_breakpoints); >> @@ -3014,7 +3015,9 @@ int kvm_vm_ioctl(KVMState *s, int type, ...) >> va_end(ap); >> >> trace_kvm_vm_ioctl(type, arg); >> + accel_ioctl_begin(); >> ret = ioctl(s->vmfd, type, arg); >> + accel_ioctl_end(); >> if (ret == -1) { >> ret = -errno; >> } >> @@ -3032,7 +3035,9 @@ int kvm_vcpu_ioctl(CPUState *cpu, int type, >> ...) >> va_end(ap); >> >> trace_kvm_vcpu_ioctl(cpu->cpu_index, type, arg); >> + accel_cpu_ioctl_begin(cpu); > > Does this mean that kvm_region_commit() can inhibit any other vcpus > doing any ioctls? Yes, because we must prevent any vcpu from reading memslots while we are updating them. > >> ret = ioctl(cpu->kvm_fd, type, arg); >> + accel_cpu_ioctl_end(cpu); >> if (ret == -1) { >> ret = -errno; >> } >> @@ -3050,7 +3055,9 @@ int kvm_device_ioctl(int fd, int type, ...) >> va_end(ap); >> >> trace_kvm_device_ioctl(fd, type, arg); >> + accel_ioctl_begin(); >> ret = ioctl(fd, type, arg); >> + accel_ioctl_end(); >> if (ret == -1) { >> ret = -errno; >> } >