[IA64] add memory barrier to domain_flush_vtlb_range()
authorawilliam@xenbuild.aw <awilliam@xenbuild.aw>
Fri, 9 Jun 2006 16:35:38 +0000 (10:35 -0600)
committerawilliam@xenbuild.aw <awilliam@xenbuild.aw>
Fri, 9 Jun 2006 16:35:38 +0000 (10:35 -0600)
add memory barrier to domain_flush_vtlb_range().
vtlb purge must be visible before vhpt invalidation.
added some BUG_ON().

Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
xen/arch/ia64/xen/vcpu.c
xen/arch/ia64/xen/vhpt.c

index 10e9ab3bc30c74778ffbf54397739f4a98fc5c44..54b5257f4d081491b19c05ca23eee7eb182fdfac 100644 (file)
@@ -2016,6 +2016,8 @@ IA64FAULT vcpu_itc_i(VCPU *vcpu, UINT64 pte, UINT64 itir, UINT64 ifa)
 
 IA64FAULT vcpu_ptc_l(VCPU *vcpu, UINT64 vadr, UINT64 log_range)
 {
+       BUG_ON(vcpu != current);
+
        /* Purge TC  */
        vcpu_purge_tr_entry(&PSCBX(vcpu,dtlb));
        vcpu_purge_tr_entry(&PSCBX(vcpu,itlb));
@@ -2082,6 +2084,7 @@ IA64FAULT vcpu_ptr_d(VCPU *vcpu,UINT64 vadr,UINT64 log_range)
        unsigned long rid, rr;
        int i;
        TR_ENTRY *trp;
+       BUG_ON(vcpu != current);
 
        rr = PSCB(vcpu,rrs)[region];
        rid = rr & RR_RID_MASK;
@@ -2110,6 +2113,7 @@ IA64FAULT vcpu_ptr_i(VCPU *vcpu,UINT64 vadr,UINT64 log_range)
        unsigned long rid, rr;
        int i;
        TR_ENTRY *trp;
+       BUG_ON(vcpu != current);
 
        rr = PSCB(vcpu,rrs)[region];
        rid = rr & RR_RID_MASK;
index f54e2a832ed477942238b0e4661c7394462ac521..0d037fdb2575f8f0434314d0cfcf3d5f04cb713c 100644 (file)
@@ -202,10 +202,14 @@ void domain_flush_vtlb_range (struct domain *d, u64 vadr, u64 addr_range)
                   FIXME: clear only if match.  */
                vcpu_purge_tr_entry(&PSCBX(v,dtlb));
                vcpu_purge_tr_entry(&PSCBX(v,itlb));
+       }
+       smp_mb();
 
+       for_each_vcpu (d, v) {
                /* Invalidate VHPT entries.  */
                cpu_flush_vhpt_range (v->processor, vadr, addr_range);
        }
+       // ptc.ga has release semantics.
 
        /* ptc.ga  */
        ia64_global_tlb_purge(vadr,vadr+addr_range,PAGE_SHIFT);