From: Avi Kivity <avi-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
To: Balaji Rao <balajirrao-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
Subject: Re: [RFC] nmi watchdog in kvm
Date: Wed, 30 Jan 2008 12:43:58 +0200 [thread overview]
Message-ID: <47A054EE.6010408@qumranet.com> (raw)
In-Reply-To: <200801281348.41010.balajirrao-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
Balaji Rao wrote:
> Hello,
>
> I was trying to enable the use of nmi watchdog within a linux guest running in kvm. I have done it
> by allowing direct access to perfmon msrs using the MSR_BITMAP field in vmcs region.
>
> Most of the times the NMI Watchdog Test in the guest fails, but with a finite number of NMI's
> received by the guest. But randomly it does work! Whenever it fails, i get this vmwrite error :
>
> vmwrite error: reg 4016 value 80000202 (err 164061)
>
> I have a few questions.
>
> 1. How are NMI's supposed to be delivered to the guest ? I did this by adding a new op to
> kvm_x86_ops.
>
That's fine. ops are there to be extended.
> 2. How am I supposed to handle perfmon MSRs ? Direct access may pose problems during migration. But
> am not sure how costly emulation by abstraction would be..
> I have not yet considered saving the MSRS upon vmexits to allow multiple VMs use the MSRs. I think i
> can do them easily when i get this working.
>
I don't think there's a sane way to emulate the non-architectural
perfmon counters. It may be possible to do so for the architectural
ones, but I'm not sure. So pass-through (with saving and restoring) is
the only option.
> Here's the code. Please tell me what dumb mistake I am doing.
>
>
> diff --git a/arch/x86/kernel/cpu/perfctr-watchdog.c b/arch/x86/kernel/cpu/perfctr-watchdog.c
> index c02541e..276048a 100644
> --- a/arch/x86/kernel/cpu/perfctr-watchdog.c
> +++ b/arch/x86/kernel/cpu/perfctr-watchdog.c
> @@ -342,7 +342,7 @@ static const struct wd_ops k7_wd_ops = {
> #define P6_EVNTSEL_INT (1 << 20)
> #define P6_EVNTSEL_OS (1 << 17)
> #define P6_EVNTSEL_USR (1 << 16)
> -#define P6_EVENT_CPU_CLOCKS_NOT_HALTED 0x79
> +#define P6_EVENT_CPU_CLOCKS_NOT_HALTED 0x3C
> #define P6_NMI_EVENT P6_EVENT_CPU_CLOCKS_NOT_HALTED
>
What's this?
>
> static int setup_p6_watchdog(unsigned nmi_hz)
> diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c
> index 2cbee94..73e9361 100644
> --- a/arch/x86/kvm/lapic.c
> +++ b/arch/x86/kvm/lapic.c
> @@ -25,6 +25,8 @@
> #include <linux/hrtimer.h>
> #include <linux/io.h>
> #include <linux/module.h>
> +#include <linux/kdebug.h>
> +#include <linux/notifier.h>
> #include <asm/processor.h>
> #include <asm/msr.h>
> #include <asm/page.h>
> @@ -740,9 +742,12 @@ static void apic_mmio_write(struct kvm_io_device *this,
> apic_set_reg(apic, APIC_ICR2, val & 0xff000000);
> break;
>
> + case APIC_LVTPC:
> + /* Enable PC NMI*/
> + if (val == APIC_DM_NMI)
> + apic_write(APIC_LVTPC,val);
>
You're writing to the precious host apic here.
- need to disallow if the host is using it
- need to prevent illegal values
- need to use some sort of perfmon api rather than directly banging on
the apic
> @@ -790,6 +795,18 @@ static int apic_mmio_range(struct kvm_io_device *this, gpa_t addr)
> return ret;
> }
>
> +static int nmi_notify(struct notifier_block *self,unsigned long val, void *data) {
> +
> + struct kvm *kvm;
> + kvm = list_entry(vm_list.next, struct kvm, vm_list);
> + kvm_x86_ops->inject_nmi(kvm->vcpus[0]);
> + return NOTIFY_STOP;
> +}
>
You're not guaranteed to be in vcpu context here, that's what's causing
the vmwrite errors.
Enabling on guest entry and disabling on guest exit is critical, both
for accuracy and correctness.
--
error compiling committee.c: too many arguments to function
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
next prev parent reply other threads:[~2008-01-30 10:43 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-01-28 8:18 [RFC] nmi watchdog in kvm Balaji Rao
[not found] ` <200801281348.41010.balajirrao-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2008-01-28 10:57 ` Ingo Molnar
2008-01-28 12:29 ` Joerg Roedel
[not found] ` <20080128122925.GA11803-5C7GfCeVMHo@public.gmane.org>
2008-01-28 14:42 ` Balaji Rao
[not found] ` <200801282012.26225.balajirrao-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2008-01-28 15:00 ` Joerg Roedel
[not found] ` <20080128150032.GF6960-5C7GfCeVMHo@public.gmane.org>
2008-01-28 16:30 ` Balaji Rao
2008-01-30 10:43 ` Avi Kivity [this message]
[not found] ` <47A054EE.6010408-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2008-01-30 14:22 ` Balaji Rao
[not found] ` <200801301952.57604.balajirrao-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2008-01-30 14:39 ` Avi Kivity
[not found] ` <47A08C24.8040505-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2008-01-30 15:02 ` Balaji Rao
[not found] ` <200801302032.01603.balajirrao-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2008-01-30 15:13 ` Avi Kivity
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=47A054EE.6010408@qumranet.com \
--to=avi-atkuwr5tajbwk0htik3j/w@public.gmane.org \
--cc=balajirrao-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org \
--cc=kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.