Fix SHADOW_OP_ENABLE_LOGDIRTY and SHADOW_OP_CLEAN hypercall.
Live migation doesn't work because the VHPT is not flushed.
Signed-off-by: Kouya Shimura <kouya@xxxxxxxxxxxxxx>
# HG changeset patch
# User Kouya Shimura <kouya@xxxxxxxxxxxxxx>
# Date 1202293305 -32400
# Node ID 6b89a0f027c2b438d1f369cce0bc670cda1390d9
# Parent e83d2b840e88223a92f8473b23ae57876e298fc8
Live migation doesn't work because the VHPT is not flushed.
diff -r e83d2b840e88 -r 6b89a0f027c2 xen/arch/ia64/xen/domain.c
--- a/xen/arch/ia64/xen/domain.c Tue Feb 05 09:36:48 2008 -0700
+++ b/xen/arch/ia64/xen/domain.c Wed Feb 06 19:21:45 2008 +0900
@@ -1785,7 +1785,7 @@ int shadow_mode_control(struct domain *d
v->arch.shadow_bitmap = d->arch.shadow_bitmap;
/* Flush vhtp and tlb to enable dirty bit
virtualization. */
- domain_flush_tlb_vhpt(d);
+ flush_tlb_for_log_dirty(d);
}
break;
@@ -1824,6 +1824,7 @@ int shadow_mode_control(struct domain *d
memset((uint8_t *)d->arch.shadow_bitmap + i, 0, size);
}
+ flush_tlb_for_log_dirty(d);
break;
}
diff -r e83d2b840e88 -r 6b89a0f027c2 xen/arch/ia64/xen/vhpt.c
--- a/xen/arch/ia64/xen/vhpt.c Tue Feb 05 09:36:48 2008 -0700
+++ b/xen/arch/ia64/xen/vhpt.c Wed Feb 06 19:21:45 2008 +0900
@@ -521,6 +521,30 @@ void domain_flush_tlb_vhpt(struct domain
cpus_clear (d->domain_dirty_cpumask);
}
+void flush_tlb_for_log_dirty(struct domain *d)
+{
+ struct vcpu *v;
+
+ /* NB. There is no race because all vcpus are paused. */
+ if (is_hvm_domain(d)) {
+ for_each_vcpu (d, v) {
+ /* XXX: local_flush_tlb_all is called redundantly */
+ thash_purge_all(v);
+ }
+ smp_call_function((void (*)(void *))local_flush_tlb_all,
+ NULL, 1, 1);
+ } else if (HAS_PERVCPU_VHPT(d)) {
+ for_each_vcpu (d, v) {
+ vcpu_purge_tr_entry(&PSCBX(v,dtlb));
+ vcpu_purge_tr_entry(&PSCBX(v,itlb));
+ vcpu_vhpt_flush(v);
+ }
+ on_each_cpu((void (*)(void *))local_flush_tlb_all, NULL, 1, 1);
+ } else
+ on_each_cpu((void (*)(void *))flush_tlb_vhpt_all, d, 1, 1);
+ cpus_clear (d->domain_dirty_cpumask);
+}
+
void flush_tlb_mask(cpumask_t mask)
{
int cpu;
diff -r e83d2b840e88 -r 6b89a0f027c2 xen/include/asm-ia64/tlbflush.h
--- a/xen/include/asm-ia64/tlbflush.h Tue Feb 05 09:36:48 2008 -0700
+++ b/xen/include/asm-ia64/tlbflush.h Wed Feb 06 19:21:45 2008 +0900
@@ -34,6 +34,9 @@ void domain_flush_vtlb_track_entry(struc
/* Flush vhpt and mTLB on every dirty cpus. */
void domain_flush_tlb_vhpt(struct domain *d);
+/* Flush vhpt and mTLB for log-dirty mode. */
+void flush_tlb_for_log_dirty(struct domain *d);
+
/* Flush v-tlb on cpus set in mask for current domain. */
void flush_tlb_mask(cpumask_t mask);
_______________________________________________
Xen-ia64-devel mailing list
Xen-ia64-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ia64-devel
|