26 messages in com.xensource.lists.xen-ia64-develRe: [Xen-ia64-devel] [patch 05/14] ia...
FromSent OnAttachments
Simon Horman14 Jul 2008 02:21 
Simon Horman14 Jul 2008 02:21.patch
Simon Horman14 Jul 2008 02:21.patch
Simon Horman14 Jul 2008 02:21.patch
Simon Horman14 Jul 2008 02:21.patch
Simon Horman14 Jul 2008 02:21.patch
Simon Horman14 Jul 2008 02:21.patch
Simon Horman14 Jul 2008 02:21.patch
Simon Horman14 Jul 2008 02:21.patch
Simon Horman14 Jul 2008 02:21.patch
Simon Horman14 Jul 2008 02:21.patch
Simon Horman14 Jul 2008 02:21.patch
Simon Horman14 Jul 2008 02:21.patch
Simon Horman14 Jul 2008 02:21.patch
Simon Horman14 Jul 2008 02:21.patch
Isaku Yamahata14 Jul 2008 03:37 
Isaku Yamahata14 Jul 2008 03:38 
Isaku Yamahata14 Jul 2008 03:43 
Simon Horman14 Jul 2008 04:34 
Simon Horman14 Jul 2008 05:21 
Simon Horman14 Jul 2008 05:28 
Simon Horman14 Jul 2008 05:29 
Simon Horman14 Jul 2008 05:30 
Simon Horman14 Jul 2008 05:30 
Isaku Yamahata14 Jul 2008 19:26 
Simon Horman14 Jul 2008 19:38 
Subject:Re: [Xen-ia64-devel] [patch 05/14] ia64: kexec: Unpin shared_info, mapped_regs and VPD TR in ia64_do_tlb_purge
From:Simon Horman (hor@verge.net.au)
Date:07/14/2008 05:28:33 AM
List:com.xensource.lists.xen-ia64-devel

GET_VA_VCPU_VHPT_MADDR(r2,r3) does not give the value of the VHPT pinned into the TLB. I believe that this is because current is changed between pinning and calling play_dead, though I am not sure of the exact scemantics.

In any case, by recording the pinned value in a percpu variable, and unpinning this value, the TR entry is removed and all is well.

Cc: Isaku Yamahata <yama@valinux.co.jp> Signed-off-by: Simon Horman <hor@verge.net.au>

---

Mon, 21 Apr 2008 11:50:41 +1000 * Also save the vhpt when it is set in vmx_load_all_rr() and vmx_vcpu_set_rr()

Wed, 07 May 2008 17:51:57 +1000 * Move definition of inserted_vhpt up to top regionreg.c

Thu, 10 Jul 2008 10:16:37 +1000 * vmx_load_all_rr() and vmx_vcpu_set_rr() set the VHPT to vcpu->arch.vhpt.hash not __va_ul(vcpu_vhpt_maddr(v)). So save the former in __get_cpu_var(inserted_vhpt) rather than the latter.

This is done regarless of if VHPT_ENABLED is set or not, so the unpinning in ia64_do_tlb_purge should be done unconditionally.

Mon Jul 14 21:46:56 EST 2008 * Cast value saved in __get_cpu_var(inserted_vhpt to unsigned long to avoid warnings. Thanks to Yamahata-san

Index: xen-unstable.hg/xen/arch/ia64/linux-xen/mca_asm.S =================================================================== --- xen-unstable.hg.orig/xen/arch/ia64/linux-xen/mca_asm.S 2008-07-14
16:20:58.000000000 +1000 +++ xen-unstable.hg/xen/arch/ia64/linux-xen/mca_asm.S 2008-07-14
16:21:12.000000000 +1000 @@ -321,8 +321,13 @@ ia64_do_tlb_purge: ;; #ifdef XEN // 5. VHPT -#if VHPT_ENABLED - GET_VA_VCPU_VHPT_MADDR(r2,r3);; + // GET_VA_VCPU_VHPT_MADDR() may not give the + // value of the VHPT currently pinned into the TLB + GET_THIS_PADDR(r2, inserted_vhpt);; + ;; + cmp.eq p7,p0=r2,r0 + ;; +(p7) br.cond.sptk .vhpt_not_mapped dep r16=0,r2,0,IA64_GRANULE_SHIFT mov r18=IA64_GRANULE_SHIFT<<2 ;; @@ -330,7 +335,7 @@ ia64_do_tlb_purge: ;; srlz.d ;; -#endif +.vhpt_not_mapped: #endif // Now branch away to caller. br.sptk.many b1 Index: xen-unstable.hg/xen/arch/ia64/xen/regionreg.c =================================================================== --- xen-unstable.hg.orig/xen/arch/ia64/xen/regionreg.c 2008-07-14
16:20:58.000000000 +1000 +++ xen-unstable.hg/xen/arch/ia64/xen/regionreg.c 2008-07-14 16:21:12.000000000
+1000 @@ -15,6 +15,7 @@ #include <asm/regionreg.h> #include <asm/vhpt.h> #include <asm/vcpu.h> +#include <asm/percpu.h>

/* Defined in xemasm.S */ extern void ia64_new_rr7(unsigned long rid, void *shared_info, void
*shared_arch_info, unsigned long shared_info_va, unsigned long va_vhpt); @@ -47,6 +48,8 @@ extern void ia64_new_rr7(unsigned long r static unsigned int domain_rid_bits_default = IA64_MIN_IMPL_RID_BITS; integer_param("dom_rid_bits", domain_rid_bits_default);

+DEFINE_PER_CPU(unsigned long, inserted_vhpt); + #if 0 // following already defined in include/asm-ia64/gcc_intrin.h // it should probably be ifdef'd out from there to ensure all region @@ -260,6 +263,9 @@ int set_one_rr(unsigned long rr, unsigne if (!PSCB(v,metaphysical_mode)) set_rr(rr,newrrv.rrval); } else if (rreg == 7) { +#if VHPT_ENABLED + __get_cpu_var(inserted_vhpt) = __va_ul(vcpu_vhpt_maddr(v)); +#endif ia64_new_rr7(vmMangleRID(newrrv.rrval),v->domain->shared_info, v->arch.privregs, v->domain->arch.shared_info_va, __va_ul(vcpu_vhpt_maddr(v))); Index: xen-unstable.hg/xen/arch/ia64/vmx/vmx_vcpu.c =================================================================== --- xen-unstable.hg.orig/xen/arch/ia64/vmx/vmx_vcpu.c 2008-07-14
16:21:10.000000000 +1000 +++ xen-unstable.hg/xen/arch/ia64/vmx/vmx_vcpu.c 2008-07-14 16:22:43.000000000
+1000 @@ -199,6 +199,7 @@ void vmx_vcpu_set_rr_fast(VCPU *vcpu, u6 void vmx_switch_rr7(unsigned long rid, void *guest_vhpt, void *pal_vaddr, void *shared_arch_info) { + __get_cpu_var(inserted_vhpt) = (unsigned long)guest_vhpt; __vmx_switch_rr7(rid, guest_vhpt, pal_vaddr, shared_arch_info); }

Index: xen-unstable.hg/xen/include/asm-ia64/regionreg.h =================================================================== --- xen-unstable.hg.orig/xen/include/asm-ia64/regionreg.h 2008-07-14
16:20:58.000000000 +1000 +++ xen-unstable.hg/xen/include/asm-ia64/regionreg.h 2008-07-14
16:21:12.000000000 +1000 @@ -36,6 +36,7 @@ typedef union ia64_rr { #define RR_RID(arg) (((arg) & 0x0000000000ffffff) << 8) #define RR_RID_MASK 0x00000000ffffff00L

+DECLARE_PER_CPU(unsigned long, inserted_vhpt);

int set_one_rr(unsigned long rr, unsigned long val);