On Tue, Sep 28, 2021 at 6:42 AM Joerg Roedel <joro@xxxxxxxxxx> wrote: > > On Tue, Sep 14, 2021 at 09:47:24AM -0700, Peter Gonda wrote: > > +static int sev_lock_vcpus_for_migration(struct kvm *kvm) > > +{ > > + struct kvm_vcpu *vcpu; > > + int i, j; > > + > > + kvm_for_each_vcpu(i, vcpu, kvm) { > > + if (mutex_lock_killable(&vcpu->mutex)) > > + goto out_unlock; > > + } > > + > > + return 0; > > + > > +out_unlock: > > + kvm_for_each_vcpu(j, vcpu, kvm) { > > + mutex_unlock(&vcpu->mutex); > > + if (i == j) > > + break; > > Hmm, doesn't the mutex_unlock() need to happen after the check? > Ah good catch, thanks for the review Joerg! Yes you are right this results in calling mutex_unlock on a mutex we didn't successfully lock. I'll fix it in the next version.