On 26/07/2017 16:07, Andi Kleen wrote: > On Wed, Jul 26, 2017 at 11:26:07AM +0200, Paolo Bonzini wrote: >> On 26/07/2017 02:20, Andi Kleen wrote: >>> From: Andi Kleen <ak@xxxxxxxxxxxxxxx> >>> >>> KVM and perf have a special backdoor mechanism to report the IP for interrupts >>> re-executed after vm exit. This works for the NMIs that perf normally uses. >>> >>> However when perf is in timer mode it doesn't work because the timer interrupt >>> doesn't get this special treatment. This is common when KVM is running >>> nested in another hypervisor which may not implement the PMU, so only >>> timer mode is available. >>> >>> Call the functions to set up the backdoor IP also for non NMI interrupts. >>> >>> I renamed the functions to set up the backdoor IP reporting to be more >>> appropiate for their new use. The SVM change is only compile tested. >>> >>> v2: Moved the functions inline. >>> For the normal interrupt case the before/after functions are now >>> called from x86.c, not arch specific code. >> >> You haven't removed the code from vmx_handle_external_intr and >> svm_handle_external_intr. > > Ok. > >> >>> For the NMI case we still need to call it in the architecture >>> specific code, because it's already needed in the low level *_run >>> functions. >> >> I must have been unclear; what I was asking is, can the calls cover >> a much wider range of vcpu_enter_guest? > > Handling the external interrupt case from x86 without exporting > is no problem (like my patch did) > > But to handle the NMI case it needs to be exported because > the NMI case is directly handled in the lowlevel vcpu_runs*. > > And I'm not sure it's safe to set over the actual low level > guest runs. e.g. the AMD code already seems to change interrupts > there. AMD only enables interrupts while GIF is 0, so it would be safe. (The processor switches GIF atomically to 1 with VMRUN and to 0 with #VMEXIT, so "clgi;sti" means "enable interrupts while the guest runs" and is paired with "cli;stgi" after VMRUN returns). The main difference would be for an NMI happening before the VMRUN/VMRESUME instruction; it would be accounted to the guest rather than the host. I guess it would be better done as a separate change anyway. I'll commit your v2 with fixed vmx.c and svm.c. Paolo