On 13/08/19 13:57, Adalbert Lazăr wrote: >> The refcounting approach seems a bit backwards, and AFAICT is driven by >> implementing unhook via a message, which also seems backwards. I assume >> hook and unhook are relatively rare events and not performance critical, >> so make those the restricted/slow flows, e.g. force userspace to quiesce >> the VM by making unhook() mutually exclusive with every vcpu ioctl() and >> maybe anything that takes kvm->lock. >> >> Then kvmi_ioctl_unhook() can use thread_stop() and kvmi_recv() just needs >> to check kthread_should_stop(). >> >> That way kvmi doesn't need to be refcounted since it's guaranteed to be >> alive if the pointer is non-null. Eliminating the refcounting will clean >> up a lot of the code by eliminating calls to kvmi_{get,put}(), e.g. >> wrappers like kvmi_breakpoint_event() just check vcpu->kvmi, or maybe >> even get dropped altogether. > > The unhook event has been added to cover the following case: while the > introspection tool runs in another VM, both VMs, the virtual appliance > and the introspected VM, could be paused by the user. We needed a way > to signal this to the introspection tool and give it time to unhook > (the introspected VM has to run and execute the introspection commands > during this phase). The receiving threads quits when the socket is closed > (by QEMU or by the introspection tool). > > It's a bit unclear how, but we'll try to get ride of the refcount object, > which will remove a lot of code, indeed. You can keep it for now. It may become clearer how to fix it after the event loop is cleaned up. >> >>> +void kvmi_create_vm(struct kvm *kvm) >>> +{ >>> + init_completion(&kvm->kvmi_completed); >>> + complete(&kvm->kvmi_completed); >> Pretty sure you don't want to be calling complete() here. > The intention was to stop the hooking ioctl until the VM is > created. A better name for 'kvmi_completed' would have been > 'ready_to_be_introspected', as kvmi_hook() will wait for it. > > We'll see how we can get ride of the completion object. The ioctls are not accessible while kvm_create_vm runs (only after kvm_dev_ioctl_create_vm calls fd_install). Even if it were, however, you should have placed init_completion much earlier, otherwise wait_for_completion would access uninitialized memory. Paolo