[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] xc_hvm_inject_trap() races
On 11/07/2016 04:59 PM, Jan Beulich wrote: >>>> On 07.11.16 at 15:34, <rcojocaru@xxxxxxxxxxxxxxx> wrote: >> My proposal was simply something along the lines of: >> >> diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c >> index 704fd64..58f5ae4 100644 >> --- a/xen/arch/x86/hvm/hvm.c >> +++ b/xen/arch/x86/hvm/hvm.c >> @@ -535,8 +535,22 @@ void hvm_do_resume(struct vcpu *v) >> /* Inject pending hw/sw trap */ >> if ( v->arch.hvm_vcpu.inject_trap.vector != -1 ) >> { >> - hvm_inject_trap(&v->arch.hvm_vcpu.inject_trap); >> + unsigned int success = 0; >> + >> + /* Check for already pending interrupts (races). */ >> + if ( !hvm_event_pending(v) ) >> + { >> + hvm_inject_trap(&v->arch.hvm_vcpu.inject_trap); >> + success = 1; >> + } >> + >> v->arch.hvm_vcpu.inject_trap.vector = -1; >> + >> + hvm_monitor_injection_result(v->arch.hvm_vcpu.inject_trap.vector, >> + v->arch.hvm_vcpu.inject_trap.type, >> + >> v->arch.hvm_vcpu.inject_trap.error_code, >> + v->arch.hvm_vcpu.inject_trap.cr2, >> + success); >> } >> } >> > > But you realize that injection isn't really VM event related; it's an > independent interface. Hence my "too special cased"complaint. > What if the event I did propose would be a one shot one, which > you enable right before (or after) doing your event injection (it > could also be an injection flag)? You'd then see whether the > next event the vCPU gets is the one you tried to inject. Not only do I realize that, but the irony is that that's been my initial reply to Tamas' suggestion. :) Unfortunately after looking carefully at all the alternatives, this one has turned out to be the simplest and most effective one - since it's not possible to know if the injection will succeed after xc_hvm_inject_trap() returns, the only way to know is if the application can be somehow notified asynchronously when the hypervisor knows, and the simplest way to do that is via vm_event. The one-shot vm_event does sound reasonable. I could set a flag per-VCPU, basically similar to v->arch.hvm_vcpu.inject_trap.vector, and fire a single event from hvm_inject_trap() if it's set (then unset it) - the flag would be set via an xc_monitor_next_interrupt() call in libxc. If nobody objects, I'll test that and see how it goes. Thanks, Razvan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |