• Mark Rutland's avatar
    kvm/mips: rework guest entry logic · 72e32445
    Mark Rutland authored
    In kvm_arch_vcpu_ioctl_run() we use guest_enter_irqoff() and
    guest_exit_irqoff() directly, with interrupts masked between these. As
    we don't handle any timer ticks during this window, we will not account
    time spent within the guest as guest time, which is unfortunate.
    
    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();
    
    In addition, as guest exits during the "run the vcpu" step are handled
    by kvm_mips_handle_exit(), a wrapper function is added which ensures
    that such exists are handled with a sequence:
    
    	guest_state_exit_irqoff();
    	< handle the exit >
    	guest_state_enter_irqoff();
    
    This means that exits which stop the vCPU running will have a redundant
    guest_state_enter_irqoff() .. guest_state_exit_irqoff() sequence, which
    can be addressed with future rework.
    
    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_mips_enter_exit_vcpu() helper which is marked
    noinstr.
    Signed-off-by: default avatarMark Rutland <mark.rutland@arm.com>
    Cc: Aleksandar Markovic <aleksandar.qemu.devel@gmail.com>
    Cc: Frederic Weisbecker <frederic@kernel.org>
    Cc: Huacai Chen <chenhuacai@kernel.org>
    Cc: Paolo Bonzini <pbonzini@redhat.com>
    Cc: Paul E. McKenney <paulmck@kernel.org>
    Cc: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
    Message-Id: <20220201132926.3301912-6-mark.rutland@arm.com>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    72e32445
mips.c 40.4 KB