• Greg Kurz's avatar
    KVM: PPC: Book3S HV: XIVE: Free previous EQ page when setting up a new one · 31a88c82
    Greg Kurz authored
    The EQ page is allocated by the guest and then passed to the hypervisor
    with the H_INT_SET_QUEUE_CONFIG hcall. A reference is taken on the page
    before handing it over to the HW. This reference is dropped either when
    the guest issues the H_INT_RESET hcall or when the KVM device is released.
    But, the guest can legitimately call H_INT_SET_QUEUE_CONFIG several times,
    either to reset the EQ (vCPU hot unplug) or to set a new EQ (guest reboot).
    In both cases the existing EQ page reference is leaked because we simply
    overwrite it in the XIVE queue structure without calling put_page().
    
    This is especially visible when the guest memory is backed with huge pages:
    start a VM up to the guest userspace, either reboot it or unplug a vCPU,
    quit QEMU. The leak is observed by comparing the value of HugePages_Free in
    /proc/meminfo before and after the VM is run.
    
    Ideally we'd want the XIVE code to handle the EQ page de-allocation at the
    platform level. This isn't the case right now because the various XIVE
    drivers have different allocation needs. It could maybe worth introducing
    hooks for this purpose instead of exposing XIVE internals to the drivers,
    but this is certainly a huge work to be done later.
    
    In the meantime, for easier backport, fix both vCPU unplug and guest reboot
    leaks by introducing a wrapper around xive_native_configure_queue() that
    does the necessary cleanup.
    Reported-by: default avatarSatheesh Rajendran <sathnaga@linux.vnet.ibm.com>
    Cc: stable@vger.kernel.org # v5.2
    Fixes: 13ce3297 ("KVM: PPC: Book3S HV: XIVE: Add controls for the EQ configuration")
    Signed-off-by: default avatarCédric Le Goater <clg@kaod.org>
    Signed-off-by: default avatarGreg Kurz <groug@kaod.org>
    Tested-by: default avatarLijun Pan <ljp@linux.ibm.com>
    Signed-off-by: default avatarPaul Mackerras <paulus@ozlabs.org>
    31a88c82
book3s_xive_native.c 30.4 KB