• Konrad Rzeszutek Wilk's avatar
    xen/spinlock: Fix locking path engaging too soon under PVHVM. · 1fb3a8b2
    Konrad Rzeszutek Wilk authored
    The xen_lock_spinning has a check for the kicker interrupts
    and if it is not initialized it will spin normally (not enter
    the slowpath).
    
    But for PVHVM case we would initialize the kicker interrupt
    before the CPU came online. This meant that if the booting
    CPU used a spinlock and went in the slowpath - it would
    enter the slowpath and block forever. The forever part because
    during bootup: the spinlock would be taken _before_ the CPU
    sets itself to be online (more on this further), and we enter
    to poll on the event channel forever.
    
    The bootup CPU (see commit fc78d343
    "xen/smp: initialize IPI vectors before marking CPU online"
    for details) and the CPU that started the bootup consult
    the cpu_online_mask to determine whether the booting CPU should
    get an IPI. The booting CPU has to set itself in this mask via:
    
      set_cpu_online(smp_processor_id(), true);
    
    However, if the spinlock is taken before this (and it is) and
    it polls on an event channel - it will never be woken up as
    the kernel will never send an IPI to an offline CPU.
    
    Note that the PVHVM logic in sending IPIs is using the HVM
    path which has numerous checks using the cpu_online_mask
    and cpu_active_mask. See above mention git commit for details.
    Signed-off-by: default avatarKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
    Reviewed-by: default avatarDavid Vrabel <david.vrabel@citrix.com>
    1fb3a8b2
smp.c 17.5 KB