Tim Deegan wrote:
Hi,
At 13:56 +0100 on 25 Jun (1245938205), David Knight wrote:
I made a mistake when I explain my problem. My code can successfully
migrate the domU TO MODIFIED Xen. But when a domU is migrated
from Modified Xen to a Unmodified Xen. The clock is frozen.
OK, that makes much more sense. It's the log-dirty code in the Xen
you're migratin from that will cause the problems.
Here is my code, most of it is just a copy of sh_prefetch();
You've done some pretty odd things to it. Why did you remove all the
comments, for example? Why did you replace all the array indirections
with pointer arithmetic?
Would pointer arithmetic become a problem? anyway, I didn't get any
warning during compilation.
Anyway, the main thing that stands out is that you don't handle the OOS
optimization at all. Are you running a very old version of Xen?
I am running XEN 3.3.1, our optimization is mainly for PV guest, so I
remove OOS code. I know
there will be problem when using HVM.
Cheers,
Tim.
static void sh_prebuild(struct vcpu *v, walk_t gw,
shadow_l1e_t *ptr_sl1e, mfn_t sl1mfn, unsigned int countl, unsigned int countr)
{
int i, distr,distl;
gfn_t gfn;
mfn_t gmfn;
guest_l1e_t *gl1p = NULL, gl1e;
shadow_l1e_t sl1e;
u32 gflags;
p2m_type_t p2mt;
struct page_info *pg;
distl = ((unsigned long)ptr_sl1e & ~PAGE_MASK) / sizeof sl1e;
distr = (PAGE_SIZE - ((unsigned long)ptr_sl1e & ~PAGE_MASK)) / sizeof sl1e;
if ( distl > countl )
distl = countl;
if ( distr > countr + 1 )
distr = countr + 1;
if ( !mfn_valid(gw.l1mfn) )
return;
gl1p = sh_map_domain_page(gw.l1mfn);
gl1p += guest_l1_table_offset(gw.va);
ptr_sl1e -= distl;
distl = 0-distl;
for ( i = distl; i < distr ; i++ )
{
if ( i == 0 )
{
ptr_sl1e += 1;
continue;
}
if ( ptr_sl1e->l1 != 0 )
break;
if ( mfn_valid(gw.l1mfn) )
{
gl1e = *(gl1p + i);
gflags = guest_l1e_get_flags(gl1e);
if ( (gflags & _PAGE_PRESENT)
&& (!(gflags & _PAGE_ACCESSED)
|| ((gflags & _PAGE_RW) && !(gflags & _PAGE_DIRTY))) )
break;
}
else
{
ASSERT(guest_l2e_get_flags(gw.l2e) & _PAGE_PSE);
gl1e = guest_l1e_from_gfn(
_gfn(gfn_x(guest_l1e_get_gfn(gw.l1e)) + i),
guest_l1e_get_flags(gw.l1e));
}
gfn = guest_l1e_get_gfn(gl1e);
gmfn = gfn_to_mfn(v->domain, gfn, &p2mt);
pg = mfn_to_page(gmfn);
if ( mfn_valid(gmfn)
&& ((pg->u.inuse.type_info & PGT_type_mask)==PGT_writable_page) )
{
l1e_propagate_from_guest(v, gl1e, gmfn, &sl1e, ft_demand_write, p2mt);
(void) shadow_set_l1e(v, ptr_sl1e, sl1e, sl1mfn);
}
ptr_sl1e += 1;
}
if ( gl1p != NULL )
sh_unmap_domain_page(gl1p);
}
|