diff options
author | iap10@tetris.cl.cam.ac.uk <iap10@tetris.cl.cam.ac.uk> | 2004-05-19 21:56:34 +0000 |
---|---|---|
committer | iap10@tetris.cl.cam.ac.uk <iap10@tetris.cl.cam.ac.uk> | 2004-05-19 21:56:34 +0000 |
commit | 77fc412d7a080bf359ec490354e5e65b2753178d (patch) | |
tree | e9f11e6cb84a4d197edb4ff0723e915b3250ac32 /xen | |
parent | ba0805e639d30c031417ab91ccde71792e41be4b (diff) | |
download | xen-77fc412d7a080bf359ec490354e5e65b2753178d.tar.gz xen-77fc412d7a080bf359ec490354e5e65b2753178d.tar.bz2 xen-77fc412d7a080bf359ec490354e5e65b2753178d.zip |
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
Diffstat (limited to 'xen')
-rw-r--r-- | xen/common/shadow.c | 34 | ||||
-rw-r--r-- | xen/include/hypervisor-ifs/dom0_ops.h | 1 |
2 files changed, 34 insertions, 1 deletions
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;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); } 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. */ |