Message ID | 20220802230718.1891356-4-mizhang@google.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Fix a race between posted interrupt delivery and migration in a nested VM | expand |
On Tue, Aug 02, 2022, Mingwei Zhang wrote: > Introduce vcpu_run_interruptable() to allow selftests execute their own > code when a vcpu is kicked out of KVM_RUN on receiving a POSIX signal. But that's what __vcpu_run() is for. Clearing "immediate_exit" after KVM_RUN does not scream "interruptible" to me. There's only one user after this series, just clear vcpu->run->immediate_exit manually in that test (a comment on _why_ it's cleared would be helpful). > +int vcpu_run_interruptable(struct kvm_vcpu *vcpu) > +{ > + int rc; > + > + rc = __vcpu_run(vcpu); > + > + vcpu->run->immediate_exit = 0; > + > + return rc; > +} > + > int _vcpu_run(struct kvm_vcpu *vcpu) > { > int rc; > -- > 2.37.1.455.g008518b4e5-goog >
On Thu, Aug 25, 2022, Sean Christopherson wrote: > On Tue, Aug 02, 2022, Mingwei Zhang wrote: > > Introduce vcpu_run_interruptable() to allow selftests execute their own > > code when a vcpu is kicked out of KVM_RUN on receiving a POSIX signal. > > But that's what __vcpu_run() is for. Clearing "immediate_exit" after KVM_RUN does > not scream "interruptible" to me. > > There's only one user after this series, just clear vcpu->run->immediate_exit > manually in that test (a comment on _why_ it's cleared would be helpful). > hmm. good point. __vcpu_run() I thought it was internal function private to kvm_util.c, but now after your selftest refactoring, this is useable. Will use __vcpu_run() instead. > > +int vcpu_run_interruptable(struct kvm_vcpu *vcpu) > > +{ > > + int rc; > > + > > + rc = __vcpu_run(vcpu); > > + > > + vcpu->run->immediate_exit = 0; > > + > > + return rc; > > +} > > + > > int _vcpu_run(struct kvm_vcpu *vcpu) > > { > > int rc; > > -- > > 2.37.1.455.g008518b4e5-goog > >
diff --git a/tools/testing/selftests/kvm/include/kvm_util_base.h b/tools/testing/selftests/kvm/include/kvm_util_base.h index ac883b8eab57..cfb91c63d8c3 100644 --- a/tools/testing/selftests/kvm/include/kvm_util_base.h +++ b/tools/testing/selftests/kvm/include/kvm_util_base.h @@ -398,6 +398,8 @@ static inline int __vcpu_run(struct kvm_vcpu *vcpu) return __vcpu_ioctl(vcpu, KVM_RUN, NULL); } +int vcpu_run_interruptable(struct kvm_vcpu *vcpu); + void vcpu_run_complete_io(struct kvm_vcpu *vcpu); struct kvm_reg_list *vcpu_get_reg_list(struct kvm_vcpu *vcpu); diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/selftests/kvm/lib/kvm_util.c index 9889fe0d8919..aca418ce4e8c 100644 --- a/tools/testing/selftests/kvm/lib/kvm_util.c +++ b/tools/testing/selftests/kvm/lib/kvm_util.c @@ -1406,6 +1406,17 @@ void vm_create_irqchip(struct kvm_vm *vm) vm->has_irqchip = true; } +int vcpu_run_interruptable(struct kvm_vcpu *vcpu) +{ + int rc; + + rc = __vcpu_run(vcpu); + + vcpu->run->immediate_exit = 0; + + return rc; +} + int _vcpu_run(struct kvm_vcpu *vcpu) { int rc;
Introduce vcpu_run_interruptable() to allow selftests execute their own code when a vcpu is kicked out of KVM_RUN on receiving a POSIX signal. This function gives selftests the flexibility to execute their own logic especially when a vCPU is halted. Note that vcpu_run_complete_io() almost achieves the same effect. However, it explicitly disallows the case of returning to caller when errno is EINTR. Signed-off-by: Mingwei Zhang <mizhang@google.com> --- tools/testing/selftests/kvm/include/kvm_util_base.h | 2 ++ tools/testing/selftests/kvm/lib/kvm_util.c | 11 +++++++++++ 2 files changed, 13 insertions(+)