aboutsummaryrefslogtreecommitdiffstats
path: root/xen
diff options
context:
space:
mode:
authoriap10@tetris.cl.cam.ac.uk <iap10@tetris.cl.cam.ac.uk>2004-05-19 21:56:34 +0000
committeriap10@tetris.cl.cam.ac.uk <iap10@tetris.cl.cam.ac.uk>2004-05-19 21:56:34 +0000
commit77fc412d7a080bf359ec490354e5e65b2753178d (patch)
treee9f11e6cb84a4d197edb4ff0723e915b3250ac32 /xen
parentba0805e639d30c031417ab91ccde71792e41be4b (diff)
downloadxen-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.c34
-rw-r--r--xen/include/hypervisor-ifs/dom0_ops.h1
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. */