From mboxrd@z Thu Jan 1 00:00:00 1970 From: Olaf Hering Subject: Re: [PATCH] x86/hvm: implement save/restore for posted interrupts Date: Sat, 2 Aug 2014 12:59:56 +0200 Message-ID: <20140802105956.GA16174@aepfle.de> References: <1404400159-27346-1-git-send-email-olaf@aepfle.de> <20140716142844.GA13820@aepfle.de> <20140717071101.GA3046@aepfle.de> <20140728065232.GA6519@aepfle.de> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: Content-Disposition: inline In-Reply-To: List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: "Zhang, Yang Z" Cc: "Tian, Kevin" , Keir Fraser , "Nakajima, Jun" , "Dong, Eddie" , "xen-devel@lists.xen.org" , "Xu, Dongxiao" , Jan Beulich List-Id: xen-devel@lists.xenproject.org On Tue, Jul 29, Zhang, Yang Z wrote: > Olaf Hering wrote on 2014-07-28: > > On Fri, Jul 25, Tian, Kevin wrote: > >> btw, did you run any workload cross save/restore? does it only > >> happen with xen-platform-pci device? > > Yes, only with xen-platform-pci. And in my testing only when the > > interface provided by netfront is up (ip link set up dev eth0). > Hi Olaf, can you try the following patch? I expect this patch will fix the issue. No, that did not help. I tried it on top of Xen 4.2 from sles11sp3 update channel. Olaf > diff --git a/xen/arch/x86/hvm/vmx/vmx.c b/xen/arch/x86/hvm/vmx/vmx.c > index f6409d6..f0a371b 100644 > --- a/xen/arch/x86/hvm/vmx/vmx.c > +++ b/xen/arch/x86/hvm/vmx/vmx.c > @@ -1517,6 +1517,8 @@ static void vmx_process_isr(int isr, struct vcpu *v) > { > unsigned long status; > u8 old; > + int vector; > + struct vlapic *s = vcpu_vlapic(v); > > if ( isr < 0 ) > isr = 0; > @@ -1530,6 +1532,14 @@ static void vmx_process_isr(int isr, struct vcpu *v) > status |= isr << VMX_GUEST_INTR_STATUS_SVI_OFFSET; > __vmwrite(GUEST_INTR_STATUS, status); > } > + for ( vector = 0; vector < NR_VECTORS; vector++ ) > + if (vlapic_test_vector(vector, &s->regs->data[APIC_ISR])) > + set_bit(vector, v->arch.hvm_vmx.eoi_exit_bitmap); > + > + __vmwrite(0x201c, v->arch.hvm_vmx.eoi_exit_bitmap[0]); > + __vmwrite(0x201e, v->arch.hvm_vmx.eoi_exit_bitmap[1]); > + __vmwrite(0x2020, v->arch.hvm_vmx.eoi_exit_bitmap[2]); > + __vmwrite(0x2022, v->arch.hvm_vmx.eoi_exit_bitmap[3]); > vmx_vmcs_exit(v); > } > > diff --git a/xen/include/asm-x86/hvm/vlapic.h b/xen/include/asm-x86/hvm/vlapic.h > index 66f0aff..2a83a1e 100644 > --- a/xen/include/asm-x86/hvm/vlapic.h > +++ b/xen/include/asm-x86/hvm/vlapic.h > @@ -58,6 +58,8 @@ > > #define VEC_POS(v) ((v) % 32) > #define REG_POS(v) (((v) / 32) * 0x10) > +#define vlapic_test_vector(vec, bitmap) \ > + test_bit(VEC_POS(vec), (uint32_t *)((bitmap) + REG_POS(vec))) > #define vlapic_test_and_set_vector(vec, bitmap) \ > test_and_set_bit(VEC_POS(vec), (uint32_t *)((bitmap) + REG_POS(vec))) > #define vlapic_test_and_clear_vector(vec, bitmap)