• Sam Bobroff's avatar
    KVM: PPC: Book3S HV: Improve H_CONFER implementation · 90fd09f8
    Sam Bobroff authored
    Currently the H_CONFER hcall is implemented in kernel virtual mode,
    meaning that whenever a guest thread does an H_CONFER, all the threads
    in that virtual core have to exit the guest.  This is bad for
    performance because it interrupts the other threads even if they
    are doing useful work.
    
    The H_CONFER hcall is called by a guest VCPU when it is spinning on a
    spinlock and it detects that the spinlock is held by a guest VCPU that
    is currently not running on a physical CPU.  The idea is to give this
    VCPU's time slice to the holder VCPU so that it can make progress
    towards releasing the lock.
    
    To avoid having the other threads exit the guest unnecessarily,
    we add a real-mode implementation of H_CONFER that checks whether
    the other threads are doing anything.  If all the other threads
    are idle (i.e. in H_CEDE) or trying to confer (i.e. in H_CONFER),
    it returns H_TOO_HARD which causes a guest exit and allows the
    H_CONFER to be handled in virtual mode.
    
    Otherwise it spins for a short time (up to 10 microseconds) to give
    other threads the chance to observe that this thread is trying to
    confer.  The spin loop also terminates when any thread exits the guest
    or when all other threads are idle or trying to confer.  If the
    timeout is reached, the H_CONFER returns H_SUCCESS.  In this case the
    guest VCPU will recheck the spinlock word and most likely call
    H_CONFER again.
    
    This also improves the implementation of the H_CONFER virtual mode
    handler.  If the VCPU is part of a virtual core (vcore) which is
    runnable, there will be a 'runner' VCPU which has taken responsibility
    for running the vcore.  In this case we yield to the runner VCPU
    rather than the target VCPU.
    
    We also introduce a check on the target VCPU's yield count: if it
    differs from the yield count passed to H_CONFER, the target VCPU
    has run since H_CONFER was called and may have already released
    the lock.  This check is required by PAPR.
    Signed-off-by: default avatarSam Bobroff <sam.bobroff@au1.ibm.com>
    Signed-off-by: default avatarPaul Mackerras <paulus@samba.org>
    Signed-off-by: default avatarAlexander Graf <agraf@suse.de>
    90fd09f8
kvm_host.h 15.9 KB