Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Leap:15.0:Rings:1-MinimalX
xen
5a4e2c2c-x86-upcall-inject-spurious-event-after...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 5a4e2c2c-x86-upcall-inject-spurious-event-after-setting-vector.patch of Package xen
# Commit 7b5b8ca7dffde866d851f0b87b994e0b13e5b867 # Date 2018-01-04 14:29:16 +0100 # Author Roger Pau Monné <roger.pau@citrix.com> # Committer Jan Beulich <jbeulich@suse.com> 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@citrix.com> Reviewed-by: Jan Beulich <jbeulich@suse.com> --- a/xen/arch/x86/hvm/hvm.c +++ b/xen/arch/x86/hvm/hvm.c @@ -4069,6 +4069,7 @@ static int hvmop_set_evtchn_upcall_vecto 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; } --- a/xen/arch/x86/hvm/irq.c +++ b/xen/arch/x86/hvm/irq.c @@ -385,6 +385,7 @@ void hvm_set_callback_via(struct domain 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)) || @@ -447,6 +448,10 @@ void hvm_set_callback_via(struct domain 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 )
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor