[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] Questions about sh_prefetch and log_dirty



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?

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?

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);
> }

-- 
Tim Deegan <Tim.Deegan@xxxxxxxxxx>
Principal Software Engineer, Citrix Systems (R&D) Ltd.
[Company #02300071, SL9 0DZ, UK.]

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.