From: Gleb Natapov <gleb@redhat.com>
To: "Zhang, Yang Z" <yang.z.zhang@intel.com>
Cc: "kvm@vger.kernel.org" <kvm@vger.kernel.org>,
"mtosatti@redhat.com" <mtosatti@redhat.com>
Subject: Re: [PATCH v2 5/6] x86: Enable ack interrupt on vmexit
Date: Sun, 25 Nov 2012 15:30:41 +0200 [thread overview]
Message-ID: <20121125133041.GD17625@redhat.com> (raw)
In-Reply-To: <A9667DDFB95DB7438FA9D7D576C3D87E2C6DA3@SHSMSX101.ccr.corp.intel.com>
On Fri, Nov 23, 2012 at 05:41:49AM +0000, Zhang, Yang Z wrote:
> Gleb Natapov wrote on 2012-11-22:
> > On Wed, Nov 21, 2012 at 04:09:38PM +0800, Yang Zhang wrote:
> >> Ack interrupt on vmexit is required by Posted Interrupt. With it,
> >> when external interrupt caused vmexit, the cpu will acknowledge the
> >> interrupt controller and save the interrupt's vector in vmcs.
> >>
> >> There are several approaches to enable it. This patch uses a simply
> >> way: re-generate an interrupt via self ipi.
> >>
> >> Signed-off-by: Yang Zhang <yang.z.zhang@intel.com>
> >> ---
> >> arch/x86/kvm/vmx.c | 11 ++++++++++-
> >> 1 files changed, 10 insertions(+), 1 deletions(-)
> >> diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
> >> index 7949d21..f6ef090 100644
> >> --- a/arch/x86/kvm/vmx.c
> >> +++ b/arch/x86/kvm/vmx.c
> >> @@ -2525,7 +2525,8 @@ static __init int setup_vmcs_config(struct
> > vmcs_config *vmcs_conf)
> >> #ifdef CONFIG_X86_64
> >> min |= VM_EXIT_HOST_ADDR_SPACE_SIZE;
> >> #endif
> >> - opt = VM_EXIT_SAVE_IA32_PAT | VM_EXIT_LOAD_IA32_PAT;
> >> + opt = VM_EXIT_SAVE_IA32_PAT | VM_EXIT_LOAD_IA32_PAT |
> >> + VM_EXIT_ACK_INTR_ON_EXIT;
> > Always? Do it only if posted interrupts are actually available
> > and going to be used.
>
> Right.
> But the currently interrupt handler path is too long:
> vm exit -> KVM vmexit handler(interrupt disabled) -> KVM re-enable interrupt -> cpu ack the interrupt and interrupt deliver through the host IDT
> This will bring extra cost for interrupt belongs to guest. After enable "acknowledge interrupt on exit", we can inject the interrupt right way after vm exit if the interrupt is for the guest(This patch doesn't do this).
>
> Since we only want to enable "acknowledge interrupt on exit" for Posted Interrupt, probably, we can enable it when PI is available.
>
> >> if (adjust_vmx_controls(min, opt, MSR_IA32_VMX_EXIT_CTLS,
> >> &_vmexit_control) < 0)
> >> return -EIO;
> >> @@ -4457,6 +4458,14 @@ static int handle_exception(struct kvm_vcpu *vcpu)
> >>
> >> static int handle_external_interrupt(struct kvm_vcpu *vcpu)
> >> {
> >> + unsigned int vector;
> >> +
> >> + vector = vmcs_read32(VM_EXIT_INTR_INFO);
> >> + vector &= INTR_INFO_VECTOR_MASK;
> > Valid bit is guarantied to be set here?
> >
> >> +
> >> + apic_eoi();
> > This is way to late. handle_external_interrupt() is called longs after
> > preemption and local irqs are enabled. vcpu process may be scheduled out
> > and apic_eoi() will not be called for a long time leaving interrupt
> > stuck in ISR and blocking other interrupts.
>
> I will move it to vmx_complete_atomic_exit().
>
> >> + apic->send_IPI_self(vector);
> > For level interrupt this is not needed, no?
>
> If we enable "ack interrupt on exit" only when apicv is available, then all interrupt is edge(interrupt remapping will setup all remap entries to deliver edge interrupt. interrupt remapping is required by x2apic, x2apic is required by PI)
Why x2apic is required by PI? Is this architectural? Cannot find it in SDM.
If interrupts will be delivered without self ipi like Avi suggests then
level will not be the issue.
>
> /*
> * Trigger mode in the IRTE will always be edge, and for IO-APIC,
> the
> * actual level or edge trigger will be setup in the IO-APIC
> * RTE. This will help simplify level triggered irq migration.
> * For more details, see the comments (in io_apic.c) explainig
> IO-APIC
> * irq migration in the presence of interrupt-remapping.
> */
>
> >> +
> >> ++vcpu->stat.irq_exits;
> >> return 1;
> >> }
> >> --
> >> 1.7.1
> >
> > --
> > Gleb.
>
>
> Best regards,
> Yang
>
> --
> 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
--
Gleb.
next prev parent reply other threads:[~2012-11-25 13:30 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-11-21 8:09 [PATCH v2 0/6] x86, apicv: Add APIC virtualizatin support Yang Zhang
2012-11-21 8:09 ` [PATCH v2 1/6] x86: PIT connects to pin 2 of IOAPIC Yang Zhang
2012-11-28 10:50 ` Gleb Natapov
2012-11-21 8:09 ` [PATCH v2 2/6] x86, apicv: add APICv register virtualization support Yang Zhang
2012-11-21 8:09 ` [PATCH v2 3/6] x86, apicv: add virtual interrupt delivery support Yang Zhang
2012-11-22 13:57 ` Gleb Natapov
2012-11-23 11:46 ` Zhang, Yang Z
2012-11-25 8:53 ` Gleb Natapov
2012-11-21 8:09 ` [PATCH v2 4/6] x86, apicv: add virtual x2apic support Yang Zhang
2012-11-21 8:09 ` [PATCH v2 5/6] x86: Enable ack interrupt on vmexit Yang Zhang
2012-11-22 15:22 ` Gleb Natapov
2012-11-23 5:41 ` Zhang, Yang Z
2012-11-25 13:30 ` Gleb Natapov [this message]
2012-11-25 12:55 ` Avi Kivity
2012-11-25 13:03 ` Gleb Natapov
2012-11-25 13:11 ` Avi Kivity
2012-11-26 5:44 ` Zhang, Yang Z
2012-11-26 9:17 ` Gleb Natapov
2012-11-21 8:09 ` [PATCH v2 6/6] x86, apicv: Add Posted Interrupt supporting Yang Zhang
2012-11-25 12:39 ` Gleb Natapov
2012-11-26 3:51 ` Zhang, Yang Z
2012-11-26 10:01 ` Gleb Natapov
2012-11-26 12:29 ` Zhang, Yang Z
2012-11-26 13:48 ` Gleb Natapov
2012-11-27 3:38 ` Zhang, Yang Z
2012-11-27 9:16 ` Gleb Natapov
2012-11-27 11:10 ` Zhang, Yang Z
2012-11-27 11:31 ` Veruca Salt
2012-11-27 11:46 ` Gleb Natapov
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=20121125133041.GD17625@redhat.com \
--to=gleb@redhat.com \
--cc=kvm@vger.kernel.org \
--cc=mtosatti@redhat.com \
--cc=yang.z.zhang@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 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).