• Boris Ostrovsky's avatar
    xen/events: Clear cpu_evtchn_mask before resuming · 06e826e0
    Boris Ostrovsky authored
    commit 5cec9883 upstream.
    
    When a guest is resumed, the hypervisor may change event channel
    assignments. If this happens and the guest uses 2-level events it
    is possible for the interrupt to be claimed by wrong VCPU since
    cpu_evtchn_mask bits may be stale. This can happen even though
    evtchn_2l_bind_to_cpu() attempts to clear old bits: irq_info that
    is passed in is not necessarily the original one (from pre-migration
    times) but instead is freshly allocated during resume and so any
    information about which CPU the channel was bound to is lost.
    
    Thus we should clear the mask during resume.
    
    We also need to make sure that bits for xenstore and console channels
    are set when these two subsystems are resumed. While rebind_evtchn_irq()
    (which is invoked for both of them on a resume) calls irq_set_affinity(),
    the latter will in fact postpone setting affinity until handling the
    interrupt. But because cpu_evtchn_mask will have bits for these two
    cleared we won't be able to take the interrupt.
    
    With that in mind, we need to bind those two channels explicitly in
    rebind_evtchn_irq(). We will keep irq_set_affinity() so that we have a
    pass through generic irq affinity code later, in case something needs
    to be updated there as well.
    
    (Also replace cpumask_of(0) with cpumask_of(info->cpu) in
    rebind_evtchn_irq(): it should be set to zero in preceding
    xen_irq_info_evtchn_setup().)
    Signed-off-by: default avatarBoris Ostrovsky <boris.ostrovsky@oracle.com>
    Reported-by: default avatarAnnie Li <annie.li@oracle.com>
    Signed-off-by: default avatarDavid Vrabel <david.vrabel@citrix.com>
    Signed-off-by: default avatarLuis Henriques <luis.henriques@canonical.com>
    06e826e0
events_base.c 37.3 KB