bitkeeper revision 1.918 (40ad05295f3vfOtWjADTgFv05BpG9w)
authoriap10@labyrinth.cl.cam.ac.uk <iap10@labyrinth.cl.cam.ac.uk>
Thu, 20 May 2004 19:21:13 +0000 (19:21 +0000)
committeriap10@labyrinth.cl.cam.ac.uk <iap10@labyrinth.cl.cam.ac.uk>
Thu, 20 May 2004 19:21:13 +0000 (19:21 +0000)
migrate improvements

tools/xc/lib/xc_linux_save.c
tools/xc/py/Xc.c
xen/common/dom0_ops.c
xen/common/domain.c

index 857007fd3ee8513ee0fe8bb38a7c6cd1b0a2950f..2d31b3dae2f405c7e009d42f7207c167f2c87b0c 100644 (file)
@@ -93,51 +93,44 @@ long long tvdelta( struct timeval *new, struct timeval *old )
        (new->tv_usec - old->tv_usec);
 }
 
-int track_cpu_usage_dom0( int xc_handle, int print )
+int track_cpu_usage( int xc_handle, u64 domid, int pages, int print )
 {
     static struct timeval wall_last;
-    static long long      cpu_last;
+    static long long      d0_cpu_last;
+    static long long      d1_cpu_last;
 
     struct timeval        wall_now;
-    long long             cpu_now, wall_delta, cpu_delta;
+    long long             wall_delta;
+    long long             d0_cpu_now, d0_cpu_delta;
+    long long             d1_cpu_now, d1_cpu_delta;
 
-    gettimeofday(&wall_now, NULL);
-
-    cpu_now = xc_domain_get_cpu_usage( xc_handle, 0 )/1000;
-
-    wall_delta = tvdelta(&wall_now,&wall_last)/1000;
-    cpu_delta  = (cpu_now - cpu_last)/1000;
-
-    if(print)
-       printf("Dom0  : wall delta %lldms, cpu delta %lldms    : %d%%\n",
-          wall_delta, cpu_delta, (cpu_delta*100)/wall_delta);
 
-    cpu_last  = cpu_now;
-    wall_last = wall_now;      
+    gettimeofday(&wall_now, NULL);
 
-    return 0;
-}
+    d0_cpu_now = xc_domain_get_cpu_usage( xc_handle, 0 )/1000;
+    d1_cpu_now = xc_domain_get_cpu_usage( xc_handle, domid )/1000;
 
-int track_cpu_usage_target( int xc_handle, u64 domid, int print )
-{
-    static struct timeval wall_last;
-    static long long      cpu_last;
-
-    struct timeval        wall_now;
-    long long             cpu_now, wall_delta, cpu_delta;
+    if ( d0_cpu_now == -1 || d1_cpu_now == -1 )        
+    {
+       printf("ARRHHH!!\n");
+    }
 
-    gettimeofday(&wall_now, NULL);
+    wall_delta = tvdelta(&wall_now,&wall_last)/1000;
 
-    cpu_now = xc_domain_get_cpu_usage( xc_handle, domid )/1000;
+    if ( wall_delta == 0 ) wall_delta = 1;
 
-    wall_delta = tvdelta(&wall_now,&wall_last)/1000;
-    cpu_delta  = (cpu_now - cpu_last)/1000;
+    d0_cpu_delta  = (d0_cpu_now - d0_cpu_last)/1000;
+    d1_cpu_delta  = (d1_cpu_now - d1_cpu_last)/1000;
 
     if(print)
-       printf("Target: wall delta %lldms, cpu delta %lldms    : %d%%\n",
-          wall_delta, cpu_delta, (cpu_delta*100)/wall_delta);
-
-    cpu_last  = cpu_now;
+       printf("interval %lldms, dom0 used %lldms (%d%%), target used %lldms (%d%%), b/w %dMb/s\n",
+              wall_delta, 
+              d0_cpu_delta, (int)((d0_cpu_delta*100)/wall_delta),
+              d1_cpu_delta, (int)((d1_cpu_delta*100)/wall_delta),
+              (int)((pages*PAGE_SIZE*8)/(wall_delta*1000)));
+
+    d0_cpu_last  = d0_cpu_now;
+    d1_cpu_last  = d1_cpu_now;
     wall_last = wall_now;      
 
     return 0;
@@ -422,8 +415,7 @@ int xc_linux_save(int xc_handle,
         goto out;
     }
 
-    track_cpu_usage_dom0(xc_handle, 0);
-    track_cpu_usage_target( xc_handle, domid, 0);
+    track_cpu_usage( xc_handle, domid, 0, 0);
 
     /* Now write out each data page, canonicalising page tables as we go... */
     
@@ -657,9 +649,7 @@ int xc_linux_save(int xc_handle,
        verbose_printf("\b\b\b\b100%% (pages sent= %d, skipped= %d )\n", 
                       sent_this_iter, skip_this_iter );
 
-       track_cpu_usage_dom0(xc_handle, 1);
-       track_cpu_usage_target( xc_handle, domid, 1);
-
+       track_cpu_usage( xc_handle, domid, sent_this_iter, 1);
        
        if ( last_iter )
        {
index 8a6e3b22efa92a9878fd8baa3a84afe83066d65f..8641259c63054e0a9d22c1af7f11fc26d5521e6c 100644 (file)
@@ -318,6 +318,10 @@ static PyObject *pyxc_linux_save(PyObject *self,
 
        if ( xc_linux_save(xc->xc_handle, dom, flags, writerfn, gfd) == 0 )
        {
+           /* kill domain. We don't want to do this for checkpointing, but
+              if we don't do it here I think people will hurt themselves
+              by accident... */
+           xc_domain_destroy( xc->xc_handle, dom, 1 );
            gzclose(gfd);
            close(fd);
 
index 780e76e638f2e38226aad9a0e200a4608e322b54..586a3a127087ebc88f92668f8e8516310b292614 100644 (file)
@@ -113,7 +113,6 @@ long do_dom0_op(dom0_op_t *u_dom0_op)
        if( ret == 0 && op->u.stopdomain.sync == 1 )
        {
            extern long do_block( void );
-           printk("T\n");
            do_block(); // Yuk...
        }
     }
index 52becabf5c0cc29d3543a5aeb5eb2ba020b39f99..894bb7ba054aeab41fe5e4056cbe243bfa6b711c 100644 (file)
@@ -271,7 +271,6 @@ void stop_domain(void)
        kick Dom0 */
     {
        struct task_struct *p;
-       printk("S\n");
        guest_schedule_to_run( p = find_domain_by_id(0ULL) );
        put_task_struct(p);
     }