bitkeeper revision 1.911.1.2 (40abd812eI8191scOuEXdi7E2VKxGQ)
authoriap10@tetris.cl.cam.ac.uk <iap10@tetris.cl.cam.ac.uk>
Wed, 19 May 2004 21:56:34 +0000 (21:56 +0000)
committeriap10@tetris.cl.cam.ac.uk <iap10@tetris.cl.cam.ac.uk>
Wed, 19 May 2004 21:56:34 +0000 (21:56 +0000)
When flushing network buffers, don't put the pages back in the psuedo-physical
map, so we don't have to send junk pages.
Add shadow_control_op_peek

tools/examples/xc_dom_control.py
tools/xc/lib/xc_linux_save.c
xen/common/shadow.c
xen/include/hypervisor-ifs/dom0_ops.h
xenolinux-2.4.26-sparse/arch/xen/drivers/network/network.c

index 877afa53d19497cb0cdb7a010036e150d695ffc9..2da4ddaf7be64495edf3613766df6dcda5049fd7 100755 (executable)
@@ -136,11 +136,13 @@ elif cmd == 'suspend':
         pid = int(fd.readline())
         os.kill(pid, signal.SIGTERM)
 
+    """
     xc.domain_stop( dom=dom )
-    
+    XXX
     while not xc.domain_getinfo( first_dom=dom, max_doms=1 )[0]['stopped']:
        print "Sleep..."
        time.sleep(0.001);
+    """
 
     rc = xc.linux_save( dom=dom, state_file=file, progress=1)
     if rc == 0 : xc.domain_destroy( dom=dom, force=1 )
index ceb5f02e15a0c4f9f33780239f3c21e519824ef7..64625c53f66f0d681e0510021dba4a0c341d7626 100644 (file)
@@ -140,8 +140,9 @@ int xc_linux_save(int xc_handle,
     /* bitmap of pages left to send */
     unsigned long *to_send, *to_fix;
 
-//live=0;
-
+    int needed_to_fix = 0;
+    int total_sent    = 0;
+    
     if ( mlock(&ctxt, sizeof(ctxt) ) )
     {
         PERROR("Unable to mlock ctxt");
@@ -422,6 +423,7 @@ int xc_linux_save(int xc_handle,
 
                if ( last_iter && test_bit(n, to_fix ) && !test_bit(n, to_send ))
                {
+                   needed_to_fix++;
                    DPRINTF("Fix! iter %d, pfn %lx. mfn %lx\n",
                               iter,n,pfn_type[batch]);
                }
@@ -567,9 +569,18 @@ int xc_linux_save(int xc_handle,
        munmap(region_base, batch*PAGE_SIZE);
 
     skip: 
-       
+
+       total_sent += sent_this_iter;
+
        verbose_printf("\b\b\b\b100%% (%d pages)\n", sent_this_iter );
        
+       if ( last_iter )
+       {
+           verbose_printf("Total pages sent= %d (%.2fx)\n", 
+                          total_sent, ((float)total_sent)/nr_pfns );
+           verbose_printf("(of which %d were fixups)\n", needed_to_fix  );
+       }       
+
        if ( debug && last_iter )
        {
            int minusone = -1;
index 216c3deda1992aebf478eed6ef67fc377cacf75c..f82502d2b4121e3157d42e6324594c3bd3833589 100644 (file)
@@ -350,6 +350,38 @@ static int shadow_mode_table_op( struct task_struct *p,
 
                break;
     }
+
+    case DOM0_SHADOW_CONTROL_OP_PEEK:
+    {
+               int i;
+       
+               if( p->tot_pages > sc->pages || 
+                       !sc->dirty_bitmap || !p->mm.shadow_dirty_bitmap )
+               {
+                       rc = -EINVAL;
+                       goto out;
+               }
+       
+               sc->pages = p->tot_pages;
+       
+#define chunk (8*1024) // do this in 1KB chunks for L1 cache
+       
+               for(i=0;i<p->tot_pages;i+=chunk)
+               {
+                       int bytes = ((  ((p->tot_pages-i) > (chunk))?
+                                                       (chunk):(p->tot_pages-i) ) + 7) / 8;
+           
+                       copy_to_user( sc->dirty_bitmap + (i/(8*sizeof(unsigned long))),
+                                                 p->mm.shadow_dirty_bitmap +(i/(8*sizeof(unsigned long))),
+                                                 bytes );          
+               }
+
+               break;
+    }
+
+       default:
+               BUG();
+
     }
 
 
@@ -386,7 +418,7 @@ int shadow_mode_control( struct task_struct *p, dom0_shadow_control_t *sc )
         if(p->mm.shadow_mode) shadow_mode_disable(p);
         shadow_mode_enable(p, SHM_logdirty);
     } 
-    else if ( p->mm.shadow_mode && cmd >= DOM0_SHADOW_CONTROL_OP_FLUSH && cmd<=DOM0_SHADOW_CONTROL_OP_CLEAN )
+    else if ( p->mm.shadow_mode && cmd >= DOM0_SHADOW_CONTROL_OP_FLUSH && cmd<=DOM0_SHADOW_CONTROL_OP_PEEK )
     {
         rc = shadow_mode_table_op(p, sc);
     }
index 879a728bd4a0d7c03f196650f48105eb9ab845c3..113f6bb02b59d956f46f09e53969a580898ec753 100644 (file)
@@ -238,6 +238,7 @@ typedef struct dom0_sched_id_st
 #define DOM0_SHADOW_CONTROL_OP_ENABLE_LOGDIRTY 2
 #define DOM0_SHADOW_CONTROL_OP_FLUSH       10
 #define DOM0_SHADOW_CONTROL_OP_CLEAN       11
+#define DOM0_SHADOW_CONTROL_OP_PEEK        12
 typedef struct dom0_shadow_control_st
 {
     /* IN variables. */
index fbe5c4ecf605bd9aaa9c338abc3d542ee8cb9ef8..e6c340685ae57433711ed31fec75bbdd29c183c4 100644 (file)
@@ -381,6 +381,10 @@ xc_linux_save  */
                /* With live migrate, we even get these...  Disable for now. */
                 // printk(KERN_ALERT "bad buffer on RX ring!(%d)\n", rx->status);
             }
+           else
+               phys_to_machine_mapping[virt_to_phys(skb->head) >> PAGE_SHIFT] =
+                   0x80000004; // disown this page -- it was a flush
+
             dev_kfree_skb_any(skb);
             continue;
         }