From: iap10@tetris.cl.cam.ac.uk Date: Wed, 19 May 2004 21:56:34 +0000 (+0000) Subject: bitkeeper revision 1.911.1.2 (40abd812eI8191scOuEXdi7E2VKxGQ) X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~18204^2~3 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=77fc412d7a080bf359ec490354e5e65b2753178d;p=xen.git bitkeeper revision 1.911.1.2 (40abd812eI8191scOuEXdi7E2VKxGQ) 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 --- diff --git a/tools/examples/xc_dom_control.py b/tools/examples/xc_dom_control.py index 877afa53d1..2da4ddaf7b 100755 --- a/tools/examples/xc_dom_control.py +++ b/tools/examples/xc_dom_control.py @@ -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 ) diff --git a/tools/xc/lib/xc_linux_save.c b/tools/xc/lib/xc_linux_save.c index ceb5f02e15..64625c53f6 100644 --- a/tools/xc/lib/xc_linux_save.c +++ b/tools/xc/lib/xc_linux_save.c @@ -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; diff --git a/xen/common/shadow.c b/xen/common/shadow.c index 216c3deda1..f82502d2b4 100644 --- a/xen/common/shadow.c +++ b/xen/common/shadow.c @@ -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;itot_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); } diff --git a/xen/include/hypervisor-ifs/dom0_ops.h b/xen/include/hypervisor-ifs/dom0_ops.h index 879a728bd4..113f6bb02b 100644 --- a/xen/include/hypervisor-ifs/dom0_ops.h +++ b/xen/include/hypervisor-ifs/dom0_ops.h @@ -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. */ diff --git a/xenolinux-2.4.26-sparse/arch/xen/drivers/network/network.c b/xenolinux-2.4.26-sparse/arch/xen/drivers/network/network.c index fbe5c4ecf6..e6c340685a 100644 --- a/xenolinux-2.4.26-sparse/arch/xen/drivers/network/network.c +++ b/xenolinux-2.4.26-sparse/arch/xen/drivers/network/network.c @@ -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; }