[IA64] fix domain_flush_vtlb_all()
authorawilliam@xenbuild2.aw <awilliam@xenbuild2.aw>
Fri, 12 Jan 2007 00:03:25 +0000 (17:03 -0700)
committerawilliam@xenbuild2.aw <awilliam@xenbuild2.aw>
Fri, 12 Jan 2007 00:03:25 +0000 (17:03 -0700)
It might called by another domain's vcpu.

Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
xen/arch/ia64/xen/mm.c
xen/arch/ia64/xen/vhpt.c
xen/include/asm-ia64/tlbflush.h

index b560abf5f8e0f439eeed82244b954054e111f7ca..aec322870c6e437a7d91cf2531c69290d06ecf31 100644 (file)
@@ -972,7 +972,7 @@ ioports_deny_access(struct domain *d, unsigned long fp, unsigned long lp)
         // clear pte
         old_pte = ptep_get_and_clear(mm, mpaddr, pte);
     }
-    domain_flush_vtlb_all();
+    domain_flush_vtlb_all(d);
     return 0;
 }
 
@@ -1730,7 +1730,7 @@ domain_page_flush_and_put(struct domain* d, unsigned long mpaddr,
 #ifndef CONFIG_XEN_IA64_TLB_TRACK
     //XXX sledgehammer.
     //    flush finer range.
-    domain_flush_vtlb_all();
+    domain_flush_vtlb_all(d);
     put_page(page);
 #else
     switch (tlb_track_search_and_remove(d->arch.tlb_track,
@@ -1749,7 +1749,7 @@ domain_page_flush_and_put(struct domain* d, unsigned long mpaddr,
          * queue the page and flush vTLB only once.
          * I.e. The caller must call dfree_flush() explicitly.
          */
-        domain_flush_vtlb_all();
+        domain_flush_vtlb_all(d);
         put_page(page);
         break;
     case TLB_TRACK_NOT_FOUND:
@@ -1783,7 +1783,7 @@ domain_page_flush_and_put(struct domain* d, unsigned long mpaddr,
          * So we abondaned to track virtual addresses.
          * full vTLB flush is necessary.
          */
-        domain_flush_vtlb_all();
+        domain_flush_vtlb_all(d);
         put_page(page);
         break;
     case TLB_TRACK_AGAIN:
index 0ba1f93a9bf5f8b8d42cb38ea0657609ac34fa12..c8846efc45614e94a592ddd578c88e7a767bd3af 100644 (file)
@@ -258,12 +258,13 @@ static void __vcpu_flush_vtlb_all(void *vcpu)
        vcpu_flush_vtlb_all((struct vcpu*)vcpu);
 }
 
-void domain_flush_vtlb_all (void)
+// caller must incremented reference count to d somehow.
+void domain_flush_vtlb_all(struct domain* d)
 {
        int cpu = smp_processor_id ();
        struct vcpu *v;
 
-       for_each_vcpu (current->domain, v) {
+       for_each_vcpu(d, v) {
                if (!test_bit(_VCPUF_initialised, &v->vcpu_flags))
                        continue;
 
index 49ff463b113901086f1553ee9ee19abfcc44e44f..a659f6a0e417d52935159ccb4908dd0312209aaa 100644 (file)
@@ -17,7 +17,7 @@ void vcpu_flush_vtlb_all(struct vcpu *v);
 void vcpu_flush_tlb_vhpt_range (u64 vadr, u64 log_range);
 
 /* Global all flush of vTLB  */
-void domain_flush_vtlb_all (void);
+void domain_flush_vtlb_all(struct domain *d);
 
 /* Global range-flush of vTLB.  */
 void domain_flush_vtlb_range (struct domain *d, u64 vadr, u64 addr_range);