diff options
author | Neal H. Walfield <neal@gnu.org> | 2009-02-16 05:35:53 +0100 |
---|---|---|
committer | Neal H. Walfield <neal@gnu.org> | 2009-02-16 05:35:53 +0100 |
commit | 9af34e63adeda0004857d0d32a90d1272ce07d50 (patch) | |
tree | 2272f010286c6b10582bd4f0623378c607e949fd /viengoos | |
parent | 47e21c7acbdd593dac1482a5238315355c853e38 (diff) |
Fix the pager.
Diffstat (limited to 'viengoos')
-rw-r--r-- | viengoos/object.c | 12 | ||||
-rw-r--r-- | viengoos/pager.c | 28 |
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 |