• Mark Rutland's avatar
    kvm/arm64: rework guest entry logic · 8cfe148a
    Mark Rutland authored
    In kvm_arch_vcpu_ioctl_run() we enter an RCU extended quiescent state
    (EQS) by calling guest_enter_irqoff(), and unmasked IRQs prior to
    exiting the EQS by calling guest_exit(). As the IRQ entry code will not
    wake RCU in this case, we may run the core IRQ code and IRQ handler
    without RCU watching, leading to various potential problems.
    
    Additionally, we do not inform lockdep or tracing that interrupts will
    be enabled during guest execution, which caan lead to misleading traces
    and warnings that interrupts have been enabled for overly-long periods.
    
    This patch fixes these issues by using the new timing and context
    entry/exit helpers to ensure that interrupts are handled during guest
    vtime but with RCU watching, with a sequence:
    
    	guest_timing_enter_irqoff();
    
    	guest_state_enter_irqoff();
    	< run the vcpu >
    	guest_state_exit_irqoff();
    
    	< take any pending IRQs >
    
    	guest_timing_exit_irqoff();
    
    Since instrumentation may make use of RCU, we must also ensure that no
    instrumented code is run during the EQS. I've split out the critical
    section into a new kvm_arm_enter_exit_vcpu() helper which is marked
    noinstr.
    
    Fixes: 1b3d546d ("arm/arm64: KVM: Properly account for guest CPU time")
    Reported-by: default avatarNicolas Saenz Julienne <nsaenzju@redhat.com>
    Signed-off-by: default avatarMark Rutland <mark.rutland@arm.com>
    Reviewed-by: default avatarMarc Zyngier <maz@kernel.org>
    Reviewed-by: default avatarNicolas Saenz Julienne <nsaenzju@redhat.com>
    Cc: Alexandru Elisei <alexandru.elisei@arm.com>
    Cc: Catalin Marinas <catalin.marinas@arm.com>
    Cc: Frederic Weisbecker <frederic@kernel.org>
    Cc: James Morse <james.morse@arm.com>
    Cc: Paolo Bonzini <pbonzini@redhat.com>
    Cc: Paul E. McKenney <paulmck@kernel.org>
    Cc: Suzuki K Poulose <suzuki.poulose@arm.com>
    Cc: Will Deacon <will@kernel.org>
    Message-Id: <20220201132926.3301912-3-mark.rutland@arm.com>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    8cfe148a
arm.c 52.3 KB