summaryrefslogtreecommitdiff
path: root/viengoos
diff options
context:
space:
mode:
authorNeal H. Walfield <neal@gnu.org>2009-02-16 05:35:53 +0100
committerNeal H. Walfield <neal@gnu.org>2009-02-16 05:35:53 +0100
commit9af34e63adeda0004857d0d32a90d1272ce07d50 (patch)
tree2272f010286c6b10582bd4f0623378c607e949fd /viengoos
parent47e21c7acbdd593dac1482a5238315355c853e38 (diff)
Fix the pager.
Diffstat (limited to 'viengoos')
-rw-r--r--viengoos/object.c12
-rw-r--r--viengoos/pager.c28
2 files changed, 24 insertions, 16 deletions
diff --git a/viengoos/object.c b/viengoos/object.c
index df944f0..946800e 100644
--- a/viengoos/object.c
+++ b/viengoos/object.c
@@ -385,6 +385,18 @@ memory_object_alloc (struct activity *activity,
odesc->version = version;
odesc->oid = oid;
+ if (type != vg_cap_page && type != vg_cap_rpage)
+ /* XXX: We (almost) never modify data pages in the kernel
+ directly--the exception is the utcb. All other objects we do,
+ however. As we do not track user and dirty bits for kernel
+ accesses, we mark these dirty up front. In almost all cases,
+ they will become dirty anyways, so we lose very little in
+ practice. */
+ {
+ odesc->dirty = odesc->user_dirty = 1;
+ odesc->referenced = odesc->user_referenced = 1;
+ }
+
/* Add to OBJECTS. */
bool had_value;
hurd_ihash_value_t old_value;
diff --git a/viengoos/pager.c b/viengoos/pager.c
index 26a6696..4838c7c 100644
--- a/viengoos/pager.c
+++ b/viengoos/pager.c
@@ -32,18 +32,19 @@ int pager_min_alloc_before_next_collect;
static void
is_clean (struct object_desc *desc)
{
-#ifdef USE_L4
-#ifndef NDEBUG
+ assert (! desc->recently_dirty);
+ assert (! desc->recently_referenced);
+
struct vg_object *object = object_desc_to_object (desc);
- l4_fpage_t result = l4_unmap_fpage (l4_fpage ((uintptr_t) object,
- PAGESIZE));
- assertx (! l4_was_written (result) && ! l4_was_referenced (result),
+ vm_object_revoke (desc, MEM_RWX);
+
+ assertx (! desc->recently_dirty && && ! desc->recently_referenced,
"The %s " VG_OID_FMT "(at %p) has status bits set (%s %s)",
vg_cap_type_string (desc->type), VG_OID_PRINTF (desc->oid), object,
- l4_was_written (result) ? "dirty" : "",
- l4_was_referenced (result) ? "refed" : "");
+ desc->recently_dirty ? "dirty" : "",
+ desc->recently_referenced ? "refed" : "");
- if (! desc->dirty)
+ if (! desc->dirty && ! desc->recently_dirty)
{
uint64_t *p = (uint64_t *) object;
uint64_t i;
@@ -51,19 +52,14 @@ is_clean (struct object_desc *desc)
for (i = 0; i < PAGESIZE / sizeof (i); i ++, p ++)
if (*p != 0)
{
- debug (0, "%p[%lld*%d]==%llx",
- object, i, sizeof (i), *p);
+ printf ("%"PRIx64": %016"PRIx64"\n", p, *p);
clean = false;
}
- assertx (clean,
- "The %s " VG_OID_FMT "(at %p) is dirty!",
+ if (! clean)
+ panic ("The %s " VG_OID_FMT "(at %p) is dirty!",
vg_cap_type_string (desc->type), VG_OID_PRINTF (desc->oid),
object);
}
-#endif
-#else
-#warning is_clean: Implement me.
-#endif
}
/* Reclaim GOAL pages from VICTIM. (Reclaim means either schedule for