Message ID | 20211113012234.1443009-4-rananta@google.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | KVM: arm64: Add support for hypercall services selection | expand |
On Sat, 13 Nov 2021 01:22:26 +0000, Raghavendra Rao Ananta <rananta@google.com> wrote: > > The upcoming patches need a way to detect if the VM, as > a whole, has started. Hence, unionize kvm_vcpu_has_run_once() > of all the vcpus of the VM and build kvm_vm_has_run_once() > to achieve the functionality. > > No functional change intended. > > Signed-off-by: Raghavendra Rao Ananta <rananta@google.com> > --- > include/linux/kvm_host.h | 2 ++ > virt/kvm/kvm_main.c | 17 +++++++++++++++++ > 2 files changed, 19 insertions(+) > > diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h > index b373929c71eb..102e00c0e21c 100644 > --- a/include/linux/kvm_host.h > +++ b/include/linux/kvm_host.h > @@ -1854,4 +1854,6 @@ static inline bool kvm_vcpu_has_run_once(struct kvm_vcpu *vcpu) > return vcpu->has_run_once; > } > > +bool kvm_vm_has_run_once(struct kvm *kvm); > + > #endif > diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c > index 1ec8a8e959b2..3d8d96e8f61d 100644 > --- a/virt/kvm/kvm_main.c > +++ b/virt/kvm/kvm_main.c > @@ -4339,6 +4339,23 @@ static int kvm_vm_ioctl_get_stats_fd(struct kvm *kvm) > return fd; > } > > +bool kvm_vm_has_run_once(struct kvm *kvm) > +{ > + int i, ret = false; > + struct kvm_vcpu *vcpu; > + > + mutex_lock(&kvm->lock); > + > + kvm_for_each_vcpu(i, vcpu, kvm) { > + ret = kvm_vcpu_has_run_once(vcpu); > + if (ret) > + break; > + } > + > + mutex_unlock(&kvm->lock); > + return ret; > +} This is horribly racy. Nothing prevents a vcpu from running behind your back. If you want any sort of guarantee, look at what we do in kvm_vgic_create(). Alexandru has patches that extract it to make it generally available (at least for arm64). M.
On Mon, Nov 22, 2021 at 8:31 AM Marc Zyngier <maz@kernel.org> wrote: > > On Sat, 13 Nov 2021 01:22:26 +0000, > Raghavendra Rao Ananta <rananta@google.com> wrote: > > > > The upcoming patches need a way to detect if the VM, as > > a whole, has started. Hence, unionize kvm_vcpu_has_run_once() > > of all the vcpus of the VM and build kvm_vm_has_run_once() > > to achieve the functionality. > > > > No functional change intended. > > > > Signed-off-by: Raghavendra Rao Ananta <rananta@google.com> > > --- > > include/linux/kvm_host.h | 2 ++ > > virt/kvm/kvm_main.c | 17 +++++++++++++++++ > > 2 files changed, 19 insertions(+) > > > > diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h > > index b373929c71eb..102e00c0e21c 100644 > > --- a/include/linux/kvm_host.h > > +++ b/include/linux/kvm_host.h > > @@ -1854,4 +1854,6 @@ static inline bool kvm_vcpu_has_run_once(struct kvm_vcpu *vcpu) > > return vcpu->has_run_once; > > } > > > > +bool kvm_vm_has_run_once(struct kvm *kvm); > > + > > #endif > > diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c > > index 1ec8a8e959b2..3d8d96e8f61d 100644 > > --- a/virt/kvm/kvm_main.c > > +++ b/virt/kvm/kvm_main.c > > @@ -4339,6 +4339,23 @@ static int kvm_vm_ioctl_get_stats_fd(struct kvm *kvm) > > return fd; > > } > > > > +bool kvm_vm_has_run_once(struct kvm *kvm) > > +{ > > + int i, ret = false; > > + struct kvm_vcpu *vcpu; > > + > > + mutex_lock(&kvm->lock); > > + > > + kvm_for_each_vcpu(i, vcpu, kvm) { > > + ret = kvm_vcpu_has_run_once(vcpu); > > + if (ret) > > + break; > > + } > > + > > + mutex_unlock(&kvm->lock); > > + return ret; > > +} > > This is horribly racy. Nothing prevents a vcpu from running behind > your back. If you want any sort of guarantee, look at what we do in > kvm_vgic_create(). Alexandru has patches that extract it to make it > generally available (at least for arm64). > Yes, I looked into kvm_lock_all_vcpus(), but the fact that the series would call the function with the current vcpu lock held caused me to back off.. Perhaps I can come up with a similar function, kvm_lock_all_vcpus_except(vcpu) ? Regards, Raghavendra > M. > > -- > Without deviation from the norm, progress is not possible.
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index b373929c71eb..102e00c0e21c 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -1854,4 +1854,6 @@ static inline bool kvm_vcpu_has_run_once(struct kvm_vcpu *vcpu) return vcpu->has_run_once; } +bool kvm_vm_has_run_once(struct kvm *kvm); + #endif diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 1ec8a8e959b2..3d8d96e8f61d 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -4339,6 +4339,23 @@ static int kvm_vm_ioctl_get_stats_fd(struct kvm *kvm) return fd; } +bool kvm_vm_has_run_once(struct kvm *kvm) +{ + int i, ret = false; + struct kvm_vcpu *vcpu; + + mutex_lock(&kvm->lock); + + kvm_for_each_vcpu(i, vcpu, kvm) { + ret = kvm_vcpu_has_run_once(vcpu); + if (ret) + break; + } + + mutex_unlock(&kvm->lock); + return ret; +} + static long kvm_vm_ioctl(struct file *filp, unsigned int ioctl, unsigned long arg) {
The upcoming patches need a way to detect if the VM, as a whole, has started. Hence, unionize kvm_vcpu_has_run_once() of all the vcpus of the VM and build kvm_vm_has_run_once() to achieve the functionality. No functional change intended. Signed-off-by: Raghavendra Rao Ananta <rananta@google.com> --- include/linux/kvm_host.h | 2 ++ virt/kvm/kvm_main.c | 17 +++++++++++++++++ 2 files changed, 19 insertions(+)