[PATCH v5 0/5] Use NMI to notify vCPUs with lapic-pt
ACRN hypervisor needs to kick vCPU off VMX non-root mode to do some
operations in hypervisor, such as interrupt/exception injection, EPT
flush etc. For non lapic-pt vCPUs, we can use IPI to do so. But, it
doesn't work for lapic-pt vCPUs as the IPI will be injected to VMs
directly without vmexit.
Without the way to kick the vCPU off VMX non-root mode to handle pending
request on time, there may be fatal errors triggered.
1). Certain operation may not be carried out on time which may further
lead to fatal errors. Taking the EPT flush request as an example, once we
don't flush the EPT on time and the guest access the out-of-date EPT,
fatal error happens.
2). ACRN now will send an IPI with vector 0xF0 to target vCPU to kick the vCPU
off VMX non-root mode if it wants to do some operations on target vCPU.
However, this way doesn't work for lapic-pt vCPUs. The IPI will be delivered
to the guest directly without vmexit and the guest will receive a unexpected
interrupt. Consequently, if the guest can't handle this interrupt properly,
fatal error may happen.
The NMI can be used as the notification signal to kick the vCPU off VMX
non-root mode for lapic-pt vCPUs. So, this patchset uses NMI as notification signal
to address the above issues for lapic-pt vCPUs.
- Filter out all NMI sources:
* Write ICR with deliver mode NMI
* Program the MSI data with deliver mode NMI
* Program the LVTs with deliver mode NMI
- Implement the smp_call for lapic-pt VMs to facilitate the debug of lapic-pt VMs.
v4 -> v5:
- PRed first 3 of v4 patchset
v3 -> v4:
- Add a nmi handler instead of handling it in dispatch_exception.
- Refine commit message in "Use NMI to kick lapic-pt vCPU's thread" to describe the
#2 issue more clearly.
- Don't make the NMI injection request when using NMI to notify vCPU instead of ignoring
NMI injection request in acrn_handle_pending_request.
v2 -> v3:
- Address Like's comment on 4/7: use is_lapic_pt_configured instead of is_lapic_pt_enabled.
- Collect Acks from Eddie.
v1 -> v2:
- Fix wrong comment in patch 1/7.
- Move the 'virtual NMI' enabling codes to switch_apicv_mode_x2apic. So, we only
need to enable 'NMI-window exiting' in nmi handler and disable 'NMI-window
exiting' in nmi window exiting handler.
- Add comment for why acrn don't support vNMI when NMI is used as notification
signal in patch "ignore the NMI injection request for lapic-pt vCPUs".
Kaige Fu (5):
HV: Use NMI to kick lapic-pt vCPU's thread
HV: Don't make NMI injection req when notifying vCPU
HV: Use NMI-window exiting to address req missing issue
HV: Use NMI to replace INIT signal for lapic-pt VMs S5
HV: Remove INIT signal notification related code
hypervisor/arch/x86/guest/virq.c | 25 +++++++++++++++++++++-
hypervisor/arch/x86/guest/vmcs.c | 18 +++++++++++++---
hypervisor/arch/x86/guest/vmexit.c | 32 ++++++++--------------------
hypervisor/arch/x86/irq.c | 31 +++++++++++++++++++++++++--
hypervisor/arch/x86/lapic.c | 20 -----------------
hypervisor/arch/x86/notify.c | 24 +++++++++++++++++++++
hypervisor/common/schedule.c | 24 +++++++++++++++------
hypervisor/include/arch/x86/irq.h | 3 +++
hypervisor/include/arch/x86/lapic.h | 9 --------
hypervisor/include/common/schedule.h | 4 ++--
10 files changed, 123 insertions(+), 67 deletions(-)