kvm/x86: add sending hyper-v crash notification to user space
Sending of notification is done by exiting vcpu to user space if KVM_REQ_HV_CRASH is enabled for vcpu. At exit to user space the kvm_run structure contains system_event with type KVM_SYSTEM_EVENT_CRASH to notify about guest crash occurred. Signed-off-by: Andrey Smetanin <asmetanin@virtuozzo.com> Signed-off-by: Denis V. Lunev <den@openvz.org> Reviewed-by: Peter Hornyack <peterhornyack@google.com> CC: Paolo Bonzini <pbonzini@redhat.com> CC: Gleb Natapov <gleb@kernel.org> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
e7d9513b60
commit
2ce7918990
|
@ -3277,6 +3277,7 @@ should put the acknowledged interrupt vector into the 'epr' field.
|
||||||
struct {
|
struct {
|
||||||
#define KVM_SYSTEM_EVENT_SHUTDOWN 1
|
#define KVM_SYSTEM_EVENT_SHUTDOWN 1
|
||||||
#define KVM_SYSTEM_EVENT_RESET 2
|
#define KVM_SYSTEM_EVENT_RESET 2
|
||||||
|
#define KVM_SYSTEM_EVENT_CRASH 3
|
||||||
__u32 type;
|
__u32 type;
|
||||||
__u64 flags;
|
__u64 flags;
|
||||||
} system_event;
|
} system_event;
|
||||||
|
@ -3296,6 +3297,10 @@ Valid values for 'type' are:
|
||||||
KVM_SYSTEM_EVENT_RESET -- the guest has requested a reset of the VM.
|
KVM_SYSTEM_EVENT_RESET -- the guest has requested a reset of the VM.
|
||||||
As with SHUTDOWN, userspace can choose to ignore the request, or
|
As with SHUTDOWN, userspace can choose to ignore the request, or
|
||||||
to schedule the reset to occur in the future and may call KVM_RUN again.
|
to schedule the reset to occur in the future and may call KVM_RUN again.
|
||||||
|
KVM_SYSTEM_EVENT_CRASH -- the guest crash occurred and the guest
|
||||||
|
has requested a crash condition maintenance. Userspace can choose
|
||||||
|
to ignore the request, or to gather VM memory core dump and/or
|
||||||
|
reset/shutdown of the VM.
|
||||||
|
|
||||||
/* Fix the size of the union. */
|
/* Fix the size of the union. */
|
||||||
char padding[256];
|
char padding[256];
|
||||||
|
|
|
@ -6263,6 +6263,12 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu)
|
||||||
vcpu_scan_ioapic(vcpu);
|
vcpu_scan_ioapic(vcpu);
|
||||||
if (kvm_check_request(KVM_REQ_APIC_PAGE_RELOAD, vcpu))
|
if (kvm_check_request(KVM_REQ_APIC_PAGE_RELOAD, vcpu))
|
||||||
kvm_vcpu_reload_apic_access_page(vcpu);
|
kvm_vcpu_reload_apic_access_page(vcpu);
|
||||||
|
if (kvm_check_request(KVM_REQ_HV_CRASH, vcpu)) {
|
||||||
|
vcpu->run->exit_reason = KVM_EXIT_SYSTEM_EVENT;
|
||||||
|
vcpu->run->system_event.type = KVM_SYSTEM_EVENT_CRASH;
|
||||||
|
r = 0;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (kvm_check_request(KVM_REQ_EVENT, vcpu) || req_int_win) {
|
if (kvm_check_request(KVM_REQ_EVENT, vcpu) || req_int_win) {
|
||||||
|
|
|
@ -139,6 +139,7 @@ static inline bool is_error_page(struct page *page)
|
||||||
#define KVM_REQ_DISABLE_IBS 24
|
#define KVM_REQ_DISABLE_IBS 24
|
||||||
#define KVM_REQ_APIC_PAGE_RELOAD 25
|
#define KVM_REQ_APIC_PAGE_RELOAD 25
|
||||||
#define KVM_REQ_SMI 26
|
#define KVM_REQ_SMI 26
|
||||||
|
#define KVM_REQ_HV_CRASH 27
|
||||||
|
|
||||||
#define KVM_USERSPACE_IRQ_SOURCE_ID 0
|
#define KVM_USERSPACE_IRQ_SOURCE_ID 0
|
||||||
#define KVM_IRQFD_RESAMPLE_IRQ_SOURCE_ID 1
|
#define KVM_IRQFD_RESAMPLE_IRQ_SOURCE_ID 1
|
||||||
|
|
|
@ -317,6 +317,7 @@ struct kvm_run {
|
||||||
struct {
|
struct {
|
||||||
#define KVM_SYSTEM_EVENT_SHUTDOWN 1
|
#define KVM_SYSTEM_EVENT_SHUTDOWN 1
|
||||||
#define KVM_SYSTEM_EVENT_RESET 2
|
#define KVM_SYSTEM_EVENT_RESET 2
|
||||||
|
#define KVM_SYSTEM_EVENT_CRASH 3
|
||||||
__u32 type;
|
__u32 type;
|
||||||
__u64 flags;
|
__u64 flags;
|
||||||
} system_event;
|
} system_event;
|
||||||
|
|
Loading…
Reference in New Issue