• Jeremy Fitzhardinge's avatar
    xen: fix RMW when unmasking events · 04c44a08
    Jeremy Fitzhardinge authored
    xen_irq_enable_direct and xen_sysexit were using "andw $0x00ff,
    XEN_vcpu_info_pending(vcpu)" to unmask events and test for pending ones
    in one instuction.
    
    Unfortunately, the pending flag must be modified with a locked operation
    since it can be set by another CPU, and the unlocked form of this
    operation was causing the pending flag to get lost, allowing the processor
    to return to usermode with pending events and ultimately deadlock.
    
    The simple fix would be to make it a locked operation, but that's rather
    costly and unnecessary.  The fix here is to split the mask-clearing and
    pending-testing into two instructions; the interrupt window between
    them is of no concern because either way pending or new events will
    be processed.
    
    This should fix lingering bugs in using direct vcpu structure access too.
    
    [ Stable: needed in 2.6.24.x ]
    Signed-off-by: default avatarJeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
    Cc: Stable <stable@kernel.org>
    Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
    04c44a08
enlighten.c 29.5 KB