• Cédric Le Goater's avatar
    KVM: PPC: Book3S HV: XIVE: Free escalation interrupts before disabling the VP · 237aed48
    Cédric Le Goater authored
    When a vCPU is brought done, the XIVE VP (Virtual Processor) is first
    disabled and then the event notification queues are freed. When freeing
    the queues, we check for possible escalation interrupts and free them
    also.
    
    But when a XIVE VP is disabled, the underlying XIVE ENDs also are
    disabled in OPAL. When an END (Event Notification Descriptor) is
    disabled, its ESB pages (ESn and ESe) are disabled and loads return all
    1s. Which means that any access on the ESB page of the escalation
    interrupt will return invalid values.
    
    When an interrupt is freed, the shutdown handler computes a 'saved_p'
    field from the value returned by a load in xive_do_source_set_mask().
    This value is incorrect for escalation interrupts for the reason
    described above.
    
    This has no impact on Linux/KVM today because we don't make use of it
    but we will introduce in future changes a xive_get_irqchip_state()
    handler. This handler will use the 'saved_p' field to return the state
    of an interrupt and 'saved_p' being incorrect, softlockup will occur.
    
    Fix the vCPU cleanup sequence by first freeing the escalation interrupts
    if any, then disable the XIVE VP and last free the queues.
    
    Fixes: 90c73795 ("KVM: PPC: Book3S HV: Add a new KVM device for the XIVE native exploitation mode")
    Fixes: 5af50993 ("KVM: PPC: Book3S HV: Native usage of the XIVE interrupt controller")
    Cc: stable@vger.kernel.org # v4.12+
    Signed-off-by: default avatarCédric Le Goater <clg@kaod.org>
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/20190806172538.5087-1-clg@kaod.org
    237aed48
book3s_xive.c 55.2 KB