From mboxrd@z Thu Jan 1 00:00:00 1970 From: Konrad Rzeszutek Wilk Subject: Re: [PATCH v5 14/17] vmx: Properly handle notification event when vCPU is running Date: Wed, 12 Aug 2015 13:02:19 -0400 Message-ID: <20150812170219.GJ17650@l.oracle.com> References: <1439346938-31824-1-git-send-email-feng.wu@intel.com> <1439346938-31824-15-git-send-email-feng.wu@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: Content-Disposition: inline In-Reply-To: <1439346938-31824-15-git-send-email-feng.wu@intel.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: Feng Wu Cc: Andrew Cooper , Kevin Tian , Keir Fraser , Jan Beulich , xen-devel@lists.xen.org List-Id: xen-devel@lists.xenproject.org On Wed, Aug 12, 2015 at 10:35:35AM +0800, Feng Wu wrote: > When a vCPU is running in Root mode and a notification event > has been injected to it. we need to set VCPU_KICK_SOFTIRQ for > the current cpu, so the pending interrupt in PIRR will be > synced to vIRR before VM-Exit in time. > > CC: Kevin Tian > CC: Keir Fraser > CC: Jan Beulich > CC: Andrew Cooper > Signed-off-by: Feng Wu > Acked-by: Kevin Tian > --- > v4: > - Coding style. > > v3: > - Make pi_notification_interrupt() static > > xen/arch/x86/hvm/vmx/vmx.c | 47 +++++++++++++++++++++++++++++++++++++++++++++- > 1 file changed, 46 insertions(+), 1 deletion(-) > > diff --git a/xen/arch/x86/hvm/vmx/vmx.c b/xen/arch/x86/hvm/vmx/vmx.c > index e80d888..c8a4371 100644 > --- a/xen/arch/x86/hvm/vmx/vmx.c > +++ b/xen/arch/x86/hvm/vmx/vmx.c > @@ -2033,6 +2033,51 @@ static void pi_wakeup_interrupt(struct cpu_user_regs *regs) > this_cpu(irq_count)++; > } > > +/* Handle VT-d posted-interrupt when VCPU is running. */ > +static void pi_notification_interrupt(struct cpu_user_regs *regs) > +{ > + /* > + * We get here when a vCPU is running in root-mode (such as via hypercall, > + * or any other reasons which can result in VM-Exit), and before vCPU is > + * back to non-root, external interrupts from an assigned device happen > + * and a notification event is delivered to this logical CPU. > + * > + * we need to set VCPU_KICK_SOFTIRQ for the current cpu, just like > + * __vmx_deliver_posted_interrupt(). So the pending interrupt in PIRR will > + * be synced to vIRR before VM-Exit in time. > + * > + * Please refer to the following code fragments from > + * xen/arch/x86/hvm/vmx/entry.S: > + * > + * .Lvmx_do_vmentry > + * > + * ...... > + * point 1 > + * > + * cmp %ecx,(%rdx,%rax,1) > + * jnz .Lvmx_process_softirqs > + * > + * ...... > + * > + * je .Lvmx_launch > + * > + * ...... > + * > + * .Lvmx_process_softirqs: > + * sti > + * call do_softirq > + * jmp .Lvmx_do_vmentry > + * > + * If VT-d engine issues a notification event at point 1 above, it cannot > + * be delivered to the guest during this VM-entry without raising the > + * softirq in this notification handler. > + */ > + raise_softirq(VCPU_KICK_SOFTIRQ); > + > + ack_APIC_irq(); > + this_cpu(irq_count)++; Most (except the AMD?) have ack_APIC_irq() and such done at the start of the functions. Is there a particular need to diverge? > +} > + > const struct hvm_function_table * __init start_vmx(void) > { > set_in_cr4(X86_CR4_VMXE); > @@ -2071,7 +2116,7 @@ const struct hvm_function_table * __init start_vmx(void) > > if ( cpu_has_vmx_posted_intr_processing ) > { > - alloc_direct_apic_vector(&posted_intr_vector, event_check_interrupt); > + alloc_direct_apic_vector(&posted_intr_vector, pi_notification_interrupt); > > if ( iommu_intpost ) > alloc_direct_apic_vector(&pi_wakeup_vector, pi_wakeup_interrupt); > -- > 2.1.0 > > > _______________________________________________ > Xen-devel mailing list > Xen-devel@lists.xen.org > http://lists.xen.org/xen-devel