All of lore.kernel.org
 help / color / mirror / Atom feed
From: Sheng Yang <yasker@gmail.com>
To: Jan Kiszka <jan.kiszka@siemens.com>
Cc: kvm@vger.kernel.org, avi@redhat.com, jiajun.xu@intel.com,
	sheng@linux.intel.com
Subject: Re: [PATCH 1/2] KVM: x86: Fix and refactor NMI watchdog emulation
Date: Mon, 20 Oct 2008 20:10:45 +0800	[thread overview]
Message-ID: <20081020121045.GD30536@yukikaze> (raw)
In-Reply-To: <20081020082001.754042528@mchn012c.ww002.siemens.net>

On Mon, Oct 20, 2008 at 10:20:02AM +0200, Jan Kiszka wrote:
> This patch refactors the NMI watchdog delivery patch, consolidating
> tests and providing a proper API for delivering watchdog events.
> 
> An included micro-optimization is to check only for apic_hw_enabled in
> kvm_apic_local_deliver (the test for LVT mask is covering the
> soft-disabled case already).

Oh... Please ignore my comments on the other patch for software enable bit.
:) (But I think this kind of optimization is reducing the readability a
little as well... It's easy to get curious about why only hardware enable is
OK)

Others seems OK to me.

> 
> Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
Acked-by: Sheng Yang <sheng@linux.intel.com>

--
regards
Yang, Sheng
> ---
>  arch/x86/kvm/i8254.c |   15 +++++++++------
>  arch/x86/kvm/irq.h   |    2 +-
>  arch/x86/kvm/lapic.c |   20 ++++++++++----------
>  3 files changed, 20 insertions(+), 17 deletions(-)
> 
> Index: b/arch/x86/kvm/i8254.c
> ===================================================================
> --- a/arch/x86/kvm/i8254.c
> +++ b/arch/x86/kvm/i8254.c
> @@ -610,15 +610,18 @@ static void __inject_pit_timer_intr(stru
>  	mutex_unlock(&kvm->lock);
>  
>  	/*
> -	 * Provides NMI watchdog support in IOAPIC mode.
> -	 * The route is: PIT -> PIC -> LVT0 in NMI mode,
> -	 * timer IRQs will continue to flow through the IOAPIC.
> +	 * Provides NMI watchdog support via Virtual Wire mode.
> +	 * The route is: PIT -> PIC -> LVT0 in NMI mode.
> +	 *
> +	 * Note: Our Virtual Wire implementation is simplified, only
> +	 * propagating PIT interrupts to all VCPUs when they have set
> +	 * LVT0 to NMI delivery. Other PIC interrupts are just sent to
> +	 * VCPU0, and only if its LVT0 is in EXTINT mode.
>  	 */
>  	for (i = 0; i < KVM_MAX_VCPUS; ++i) {
>  		vcpu = kvm->vcpus[i];
> -		if (!vcpu)
> -			continue;
> -		kvm_apic_local_deliver(vcpu, APIC_LVT0);
> +		if (vcpu)
> +			kvm_apic_nmi_wd_deliver(vcpu);
>  	}
>  }
>  
> Index: b/arch/x86/kvm/irq.h
> ===================================================================
> --- a/arch/x86/kvm/irq.h
> +++ b/arch/x86/kvm/irq.h
> @@ -87,7 +87,7 @@ void kvm_pic_reset(struct kvm_kpic_state
>  void kvm_timer_intr_post(struct kvm_vcpu *vcpu, int vec);
>  void kvm_inject_pending_timer_irqs(struct kvm_vcpu *vcpu);
>  void kvm_inject_apic_timer_irqs(struct kvm_vcpu *vcpu);
> -int kvm_apic_local_deliver(struct kvm_vcpu *vcpu, int lvt_type);
> +void kvm_apic_nmi_wd_deliver(struct kvm_vcpu *vcpu);
>  void __kvm_migrate_apic_timer(struct kvm_vcpu *vcpu);
>  void __kvm_migrate_pit_timer(struct kvm_vcpu *vcpu);
>  void __kvm_migrate_timers(struct kvm_vcpu *vcpu);
> Index: b/arch/x86/kvm/lapic.c
> ===================================================================
> --- a/arch/x86/kvm/lapic.c
> +++ b/arch/x86/kvm/lapic.c
> @@ -975,14 +975,12 @@ int apic_has_pending_timer(struct kvm_vc
>  	return 0;
>  }
>  
> -int kvm_apic_local_deliver(struct kvm_vcpu *vcpu, int lvt_type)
> +static int kvm_apic_local_deliver(struct kvm_lapic *apic, int lvt_type)
>  {
> -	struct kvm_lapic *apic = vcpu->arch.apic;
> +	u32 reg = apic_get_reg(apic, lvt_type);
>  	int vector, mode, trig_mode;
> -	u32 reg;
>  
> -	if (apic && apic_enabled(apic)) {
> -		reg = apic_get_reg(apic, lvt_type);
> +	if (apic_hw_enabled(apic) && !(reg & APIC_LVT_MASKED)) {
>  		vector = reg & APIC_VECTOR_MASK;
>  		mode = reg & APIC_MODE_MASK;
>  		trig_mode = reg & APIC_LVT_LEVEL_TRIGGER;
> @@ -991,9 +989,12 @@ int kvm_apic_local_deliver(struct kvm_vc
>  	return 0;
>  }
>  
> -static inline int __inject_apic_timer_irq(struct kvm_lapic *apic)
> +void kvm_apic_nmi_wd_deliver(struct kvm_vcpu *vcpu)
>  {
> -	return kvm_apic_local_deliver(apic->vcpu, APIC_LVTT);
> +	struct kvm_lapic *apic = vcpu->arch.apic;
> +
> +	if (apic)
> +		kvm_apic_local_deliver(apic, APIC_LVT0);
>  }
>  
>  static enum hrtimer_restart apic_timer_fn(struct hrtimer *data)
> @@ -1088,9 +1089,8 @@ void kvm_inject_apic_timer_irqs(struct k
>  {
>  	struct kvm_lapic *apic = vcpu->arch.apic;
>  
> -	if (apic && apic_lvt_enabled(apic, APIC_LVTT) &&
> -		atomic_read(&apic->timer.pending) > 0) {
> -		if (__inject_apic_timer_irq(apic))
> +	if (apic && atomic_read(&apic->timer.pending) > 0) {
> +		if (kvm_apic_local_deliver(apic, APIC_LVTT))
>  			atomic_dec(&apic->timer.pending);
>  	}
>  }
> 
> --
> To unsubscribe from this list: send the line "unsubscribe kvm" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

  reply	other threads:[~2008-10-20 12:10 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-10-20  8:20 [PATCH 0/2] KVM: x86: Fix and optimize in-kernel NMI watchdog support - v2 Jan Kiszka
2008-10-20  8:20 ` [PATCH 1/2] KVM: x86: Fix and refactor NMI watchdog emulation Jan Kiszka
2008-10-20 12:10   ` Sheng Yang [this message]
2008-10-20  8:20 ` [PATCH 2/2] KVM: x86: Optimize NMI watchdog delivery Jan Kiszka
2008-10-20 12:10   ` Sheng Yang
2008-10-22 10:25 ` [PATCH 0/2] KVM: x86: Fix and optimize in-kernel NMI watchdog support - v2 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=20081020121045.GD30536@yukikaze \
    --to=yasker@gmail.com \
    --cc=avi@redhat.com \
    --cc=jan.kiszka@siemens.com \
    --cc=jiajun.xu@intel.com \
    --cc=kvm@vger.kernel.org \
    --cc=sheng@linux.intel.com \
    /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.