On Mon, Nov 22, 2021 at 8:31 AM Marc Zyngier <maz@xxxxxxxxxx> wrote: > > On Sat, 13 Nov 2021 01:22:26 +0000, > Raghavendra Rao Ananta <rananta@xxxxxxxxxx> 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@xxxxxxxxxx> > > --- > > 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.