From: "Denis V. Lunev" <den@openvz.org>
Cc: kvm@vger.kernel.org, Gleb Natapov <gleb@kernel.org>,
qemu-devel@nongnu.org, Paolo Bonzini <pbonzini@redhat.com>,
Andrey Smetanin <asmetanin@virtuozzo.com>,
"Denis V. Lunev" <den@openvz.org>
Subject: [Qemu-devel] [PATCH 09/11] kvm/x86: distingiush hyper-v guest crash notification
Date: Mon, 22 Jun 2015 19:05:06 +0300 [thread overview]
Message-ID: <1434989108-20924-10-git-send-email-den@openvz.org> (raw)
In-Reply-To: <1434989108-20924-1-git-send-email-den@openvz.org>
From: Andrey Smetanin <asmetanin@virtuozzo.com>
Previous patches allowes userspace to setup Hyper-V crash ctl msr.
This msr should expose HV_X64_MSR_CRASH_CTL_NOTIFY value to Hyper-V
guest to allow to send crash data. Unfortunately Hyper-V guest notifies
hardware about crash by writing the same HV_X64_MSR_CRASH_CTL_NOTIFY value
into crash ctl msr. Thus both user space and guest writes inside ctl msr the
same value and this patch distingiush the moment of actual guest crash
by checking host initiated value from msr info.
Signed-off-by: Andrey Smetanin <asmetanin@virtuozzo.com>
Signed-off-by: Denis V. Lunev <den@openvz.org>
CC: Paolo Bonzini <pbonzini@redhat.com>
CC: Gleb Natapov <gleb@kernel.org>
---
arch/x86/kvm/hyperv.c | 17 +++++++++--------
arch/x86/kvm/hyperv.h | 2 +-
arch/x86/kvm/x86.c | 3 ++-
3 files changed, 12 insertions(+), 10 deletions(-)
diff --git a/arch/x86/kvm/hyperv.c b/arch/x86/kvm/hyperv.c
index 6b18015..f49502a 100644
--- a/arch/x86/kvm/hyperv.c
+++ b/arch/x86/kvm/hyperv.c
@@ -54,12 +54,12 @@ static int kvm_hv_msr_get_crash_ctl(struct kvm_vcpu *vcpu, u64 *pdata)
return 0;
}
-static int kvm_hv_msr_set_crash_ctl(struct kvm_vcpu *vcpu, u64 data)
+static int kvm_hv_msr_set_crash_ctl(struct kvm_vcpu *vcpu, u64 data, bool host)
{
struct kvm_arch_hyperv *hv = &vcpu->kvm->arch.hyperv;
hv->hv_crash_ctl = data;
- if ((data & HV_X64_MSR_CRASH_CTL_NOTIFY)) {
+ if ((data & HV_X64_MSR_CRASH_CTL_NOTIFY) && !host) {
vcpu_debug(vcpu, "hv crash (0x%llx 0x%llx 0x%llx 0x%llx "
"0x%llx)\n", hv->hv_crash_param[0],
hv->hv_crash_param[1],
@@ -99,7 +99,8 @@ static int kvm_hv_msr_get_crash_data(struct kvm_vcpu *vcpu,
return 0;
}
-static int kvm_hv_set_msr_pw(struct kvm_vcpu *vcpu, u32 msr, u64 data)
+static int kvm_hv_set_msr_pw(struct kvm_vcpu *vcpu,
+ u32 msr, u64 data, bool host)
{
struct kvm *kvm = vcpu->kvm;
struct kvm_arch_hyperv *hv = &kvm->arch.hyperv;
@@ -156,7 +157,7 @@ static int kvm_hv_set_msr_pw(struct kvm_vcpu *vcpu, u32 msr, u64 data)
msr - HV_X64_MSR_CRASH_P0,
data);
case HV_X64_MSR_CRASH_CTL:
- return kvm_hv_msr_set_crash_ctl(vcpu, data);
+ return kvm_hv_msr_set_crash_ctl(vcpu, data, host);
default:
vcpu_unimpl(vcpu, "Hyper-V unimpl wrmsr: 0x%x data 0x%llx\n",
msr, data);
@@ -165,7 +166,7 @@ static int kvm_hv_set_msr_pw(struct kvm_vcpu *vcpu, u32 msr, u64 data)
return 0;
}
-static int kvm_hv_set_msr(struct kvm_vcpu *vcpu, u32 msr, u64 data)
+static int kvm_hv_set_msr(struct kvm_vcpu *vcpu, u32 msr, u64 data, bool host)
{
struct kvm_vcpu_arch_hyperv *hv = &vcpu->arch.hyperv;
@@ -278,17 +279,17 @@ static int kvm_hv_get_msr(struct kvm_vcpu *vcpu, u32 msr, u64 *pdata)
return 0;
}
-int kvm_hv_set_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 data)
+int kvm_hv_set_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 data, bool host)
{
if (kvm_hv_msr_partition_wide(msr)) {
int r;
mutex_lock(&vcpu->kvm->lock);
- r = kvm_hv_set_msr_pw(vcpu, msr, data);
+ r = kvm_hv_set_msr_pw(vcpu, msr, data, host);
mutex_unlock(&vcpu->kvm->lock);
return r;
} else
- return kvm_hv_set_msr(vcpu, msr, data);
+ return kvm_hv_set_msr(vcpu, msr, data, host);
}
int kvm_hv_get_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 *pdata)
diff --git a/arch/x86/kvm/hyperv.h b/arch/x86/kvm/hyperv.h
index 39aee93..dc49527 100644
--- a/arch/x86/kvm/hyperv.h
+++ b/arch/x86/kvm/hyperv.h
@@ -22,7 +22,7 @@
#ifndef __ARCH_X86_KVM_HYPERV_H__
#define __ARCH_X86_KVM_HYPERV_H__
-int kvm_hv_set_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 data);
+int kvm_hv_set_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 data, bool host);
int kvm_hv_get_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 *pdata);
bool kvm_hv_hypercall_enabled(struct kvm *kvm);
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index 111fa83..db4eecb 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -2210,7 +2210,8 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
case HV_X64_MSR_GUEST_OS_ID ... HV_X64_MSR_SINT15:
case HV_X64_MSR_CRASH_P0 ... HV_X64_MSR_CRASH_P4:
case HV_X64_MSR_CRASH_CTL:
- return kvm_hv_set_msr_common(vcpu, msr, data);
+ return kvm_hv_set_msr_common(vcpu, msr, data,
+ msr_info->host_initiated);
break;
case MSR_IA32_BBL_CR_CTL3:
/* Drop writes to this legacy MSR -- see rdmsr
--
1.9.1
next prev parent reply other threads:[~2015-06-22 16:05 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-06-22 16:04 [Qemu-devel] [PATCH v2 0/11] HyperV equivalent of pvpanic driver Denis V. Lunev
2015-06-22 16:04 ` [Qemu-devel] [PATCH 01/11] kvm/x86: move Hyper-V MSR's/hypercall code into hyperv.c file Denis V. Lunev
2015-06-25 10:25 ` Denis V. Lunev
2015-06-25 10:26 ` Paolo Bonzini
2015-06-22 16:04 ` [Qemu-devel] [PATCH 02/11] kvm: introduce vcpu_debug = kvm_debug + vcpu context Denis V. Lunev
2015-06-22 16:05 ` [Qemu-devel] [PATCH 03/11] kvm: add hyper-v crash msrs constants Denis V. Lunev
2015-06-22 16:05 ` [Qemu-devel] [PATCH 04/11] kvm/x86: added hyper-v crash msrs into kvm hyperv context Denis V. Lunev
2015-06-22 16:05 ` [Qemu-devel] [PATCH 05/11] kvm: added KVM_REQ_HV_CRASH value to notify qemu about Hyper-V crash Denis V. Lunev
2015-06-22 16:05 ` [Qemu-devel] [PATCH 06/11] kvm/x86: mark hyper-v crash msrs as partition wide Denis V. Lunev
2015-06-22 16:05 ` [Qemu-devel] [PATCH 07/11] kvm/x86: added hyper-v crash data and ctl msr's get/set'ers Denis V. Lunev
2015-06-22 23:52 ` Peter Hornyack
2015-06-23 9:47 ` Denis V. Lunev
2015-06-23 9:51 ` Paolo Bonzini
2015-06-23 10:08 ` Denis V. Lunev
2015-06-23 10:30 ` Paolo Bonzini
2015-06-22 16:05 ` [Qemu-devel] [PATCH 08/11] kvm/x86: add sending hyper-v crash notification to user space Denis V. Lunev
2015-06-22 16:05 ` Denis V. Lunev [this message]
2015-06-22 16:09 ` [Qemu-devel] [PATCH 09/11] kvm/x86: distingiush hyper-v guest crash notification Paolo Bonzini
2015-06-22 23:55 ` Peter Hornyack
2015-06-23 9:52 ` Paolo Bonzini
2015-06-22 16:05 ` [Qemu-devel] [PATCH 10/11] qemu/kvm: kvm hyper-v based guest crash event handling Denis V. Lunev
2015-06-22 16:15 ` Paolo Bonzini
2015-06-22 16:17 ` Paolo Bonzini
2015-06-22 16:05 ` [Qemu-devel] [PATCH 11/11] qemu/kvm: mark in cpu state that hyper-v crash occured Denis V. Lunev
2015-06-22 16:23 ` Andreas Färber
2015-06-22 16:27 ` Paolo Bonzini
2015-06-22 16:33 ` Andreas Färber
2015-06-22 16:35 ` Denis V. Lunev
2015-06-22 16:36 ` Paolo Bonzini
2015-06-22 17:46 ` Andreas Färber
2015-06-23 9:53 ` Paolo Bonzini
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1434989108-20924-10-git-send-email-den@openvz.org \
--to=den@openvz.org \
--cc=asmetanin@virtuozzo.com \
--cc=gleb@kernel.org \
--cc=kvm@vger.kernel.org \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).