On Mon, 30 Jan 2012, Avi Kivity wrote: > On 01/17/2012 08:40 PM, Eric B Munson wrote: > > Now that we have a flag that will tell the guest it was suspended, create an > > interface for that communication using a KVM ioctl. > > > > > > diff --git a/Documentation/virtual/kvm/api.txt b/Documentation/virtual/kvm/api.txt > > index e1d94bf..1931e5c 100644 > > --- a/Documentation/virtual/kvm/api.txt > > +++ b/Documentation/virtual/kvm/api.txt > > @@ -1491,6 +1491,19 @@ following algorithm: > > Some guests configure the LINT1 NMI input to cause a panic, aiding in > > debugging. > > > > +4.65 KVMCLOCK_GUEST_PAUSED > > + > > +Capability: KVM_CAP_GUEST_PAUSED > > +Architechtures: Any that implement pvclocks (currently x86 only) > > +Type: vcpu ioctl > > vm ioctl. > > > +Parameters: None > > +Returns: 0 on success, -1 on error > > + > > +This signals to the host kernel that the specified guest is being paused by > > +userspace. The host will set a flag in the pvclock structure that is checked > > +from the soft lockup watchdog. This ioctl can be called during pause or > > +unpause. > > + > > 5. The kvm_run structure > > > > > > +/* > > + * kvm_set_guest_paused() indicates to the guest kernel that it has been > > + * stopped by the hypervisor. This function will be called from the host only. > > + */ > > +static int kvm_set_guest_paused(struct kvm *kvm) > > +{ > > + struct kvm_vcpu *vcpu; > > + struct pvclock_vcpu_time_info *src; > > + int i; > > + > > + kvm_for_each_vcpu(i, vcpu, kvm) { > > + if (!vcpu->arch.time_page) > > + continue; > > + src = &vcpu->arch.hv_clock; > > + src->flags |= PVCLOCK_GUEST_STOPPED; > > This looks racy. The vcpu can remove its kvmclock concurrently with > this access, and src will be NULL. > > Can you point me to the discussion that moved this to be a vm ioctl? In > general vm ioctls that do things for all vcpus are racy, like here. > You're accessing variables that are protected by the vcpu mutex, and not > taking the mutex (nor can you, since it is held while the guest is > running, unlike most kernel mutexes). > Jan Kiszka suggested that becuase there isn't a use case for notifying individual vcpus (can vcpu's be paused individually?) that it makes more sense to have a vm ioctl. http://thread.gmane.org/gmane.comp.emulators.qemu/131624 If the per vcpu ioctl is the right choice I can resend those patches. Eric
Attachment:
signature.asc
Description: Digital signature