[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen stable-4.9] x86/upcall: inject a spurious event after setting upcall vector
commit c3774d13ee159fa651797d4230c1ca29301e03d8 Author: Roger Pau Monné <roger.pau@xxxxxxxxxx> AuthorDate: Wed Jan 17 17:03:17 2018 +0100 Commit: Jan Beulich <jbeulich@xxxxxxxx> CommitDate: Wed Jan 17 17:03:17 2018 +0100 x86/upcall: inject a spurious event after setting upcall vector In case the vCPU has pending events to inject. This fixes a bug that happened if the guest mapped the vcpu info area using VCPUOP_register_vcpu_info without having setup the event channel upcall, and then setup the upcall vector. In this scenario the guest would not receive any upcalls, because the call to VCPUOP_register_vcpu_info would have marked the vCPU as having pending events, but the vector could not be injected because it was not yet setup. This has not caused issues so far because all the consumers first setup the vector callback and then map the vcpu info page, but there's no limitation that prevents doing it in the inverse order. Signed-off-by: Roger Pau Monné <roger.pau@xxxxxxxxxx> Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx> master commit: 7b5b8ca7dffde866d851f0b87b994e0b13e5b867 master date: 2018-01-04 14:29:16 +0100 --- xen/arch/x86/hvm/hvm.c | 1 + xen/arch/x86/hvm/irq.c | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c index 246eb87..e3e3edc 100644 --- a/xen/arch/x86/hvm/hvm.c +++ b/xen/arch/x86/hvm/hvm.c @@ -3985,6 +3985,7 @@ static int hvmop_set_evtchn_upcall_vector( printk(XENLOG_G_INFO "%pv: upcall vector %02x\n", v, op.vector); v->arch.hvm_vcpu.evtchn_upcall_vector = op.vector; + hvm_assert_evtchn_irq(v); return 0; } diff --git a/xen/arch/x86/hvm/irq.c b/xen/arch/x86/hvm/irq.c index 8625584..2ca31ad 100644 --- a/xen/arch/x86/hvm/irq.c +++ b/xen/arch/x86/hvm/irq.c @@ -336,6 +336,7 @@ void hvm_set_callback_via(struct domain *d, uint64_t via) struct hvm_irq *hvm_irq = hvm_domain_irq(d); unsigned int gsi=0, pdev=0, pintx=0; uint8_t via_type; + struct vcpu *v; via_type = (uint8_t)MASK_EXTR(via, HVM_PARAM_CALLBACK_IRQ_TYPE_MASK) + 1; if ( ((via_type == HVMIRQ_callback_gsi) && (via == 0)) || @@ -398,6 +399,10 @@ void hvm_set_callback_via(struct domain *d, uint64_t via) spin_unlock(&d->arch.hvm_domain.irq_lock); + for_each_vcpu ( d, v ) + if ( is_vcpu_online(v) ) + hvm_assert_evtchn_irq(v); + #ifndef NDEBUG printk(XENLOG_G_INFO "Dom%u callback via changed to ", d->domain_id); switch ( via_type ) -- generated by git-patchbot for /home/xen/git/xen.git#stable-4.9 _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |