diff options
author | neal <neal> | 2008-06-23 19:14:38 +0000 |
---|---|---|
committer | neal <neal> | 2008-06-23 19:14:38 +0000 |
commit | 4a2e079910d11373f05213a753d360b2558ee7f2 (patch) | |
tree | 8706c1bff9636df554a6ccbbba5b1a9476ac95c9 /viengoos/pager.c | |
parent | 914b94ee60a44bb0ffc7a92a2e3011bf72034d01 (diff) |
2008-06-23 Neal H. Walfield <neal@gnu.org>
* activity.h (struct activity): Add field priorities_count.
* activity.c (activity_destroy): Update it.
* object.c (object_desc_claim): Likewise.
* pager.c (reclaim_from): Likewise.
Diffstat (limited to 'viengoos/pager.c')
-rw-r--r-- | viengoos/pager.c | 62 |
1 files changed, 53 insertions, 9 deletions
diff --git a/viengoos/pager.c b/viengoos/pager.c index 205f3cb..50816be 100644 --- a/viengoos/pager.c +++ b/viengoos/pager.c @@ -62,17 +62,33 @@ reclaim_from (struct activity *victim, int goal) { int count = 0; int laundry_count = 0; + int discarded = 0; /* XXX: Implement group dealloc. */ /* First try objects with a priority lower than LRU. */ - debug (0, "Goal: %d (now: avail: %d, laundry: %d)", - goal, available_list_count (&available), - laundry_list_count (&laundry)); + assertx (victim->priorities_count + + activity_lru_list_count (&victim->active) + + activity_lru_list_count (&victim->inactive) + + eviction_list_count (&victim->eviction_dirty) + == victim->frames_local, + "%d + %d + %d + %d != %d!", + victim->priorities_count, + activity_lru_list_count (&victim->active), + activity_lru_list_count (&victim->inactive), + eviction_list_count (&victim->eviction_dirty), + victim->frames_local); + + debug (5, "Reclaiming %d from " OID_FMT ", %d frames " + "(global: avail: %d, laundry: %d)", + goal, OID_PRINTF (object_oid ((struct object *) victim)), + victim->frames_local, + available_list_count (&available), laundry_list_count (&laundry)); struct object_desc *desc; - struct object_desc *next = hurd_btree_priorities_first (&victim->priorities); + struct object_desc *next + = hurd_btree_priorities_first (&victim->priorities); while (((desc = next)) && count < goal) { assert (! desc->eviction_candidate); @@ -88,6 +104,7 @@ reclaim_from (struct activity *victim, int goal) object_desc_flush (desc, false); hurd_btree_priorities_detach (&victim->priorities, desc); + victim->priorities_count --; desc->eviction_candidate = true; @@ -106,6 +123,9 @@ reclaim_from (struct activity *victim, int goal) available_list_queue (&available, desc); eviction_list_queue (&victim->eviction_clean, desc); + + if (desc->policy.discardable) + discarded ++; } count ++; @@ -148,6 +168,9 @@ reclaim_from (struct activity *victim, int goal) eviction_list_push (&victim->eviction_clean, inactive); available_list_queue (&available, inactive); + + if (desc->policy.discardable) + discarded ++; } inactive->eviction_candidate = true; @@ -191,6 +214,9 @@ reclaim_from (struct activity *victim, int goal) available_list_queue (&available, desc); eviction_list_queue (&victim->eviction_clean, desc); + + if (desc->policy.discardable) + discarded ++; } count ++; @@ -214,6 +240,7 @@ reclaim_from (struct activity *victim, int goal) object_desc_flush (desc, false); hurd_btree_priorities_detach (&victim->priorities, desc); + victim->priorities_count --; desc->eviction_candidate = true; @@ -232,6 +259,9 @@ reclaim_from (struct activity *victim, int goal) available_list_queue (&available, desc); eviction_list_queue (&victim->eviction_clean, desc); + + if (desc->policy.discardable) + discarded ++; } count ++; @@ -244,12 +274,26 @@ reclaim_from (struct activity *victim, int goal) struct activity *ancestor = victim; activity_for_each_ancestor (ancestor, ({ ancestor->frames_total -= count; })); + debug (5, "Reclaimed from " OID_FMT ": goal: %d; %d frames; " + DEBUG_BOLD ("%d in laundry, %d made available (%d discarded)") " " + "(now: avail: %d, laundry: %d)", + OID_PRINTF (object_oid ((struct object *) victim)), goal, + victim->frames_local, + laundry_count, count - laundry_count, discarded, + available_list_count (&available), laundry_list_count (&laundry)); + + assertx (victim->priorities_count + + activity_lru_list_count (&victim->active) + + activity_lru_list_count (&victim->inactive) + + eviction_list_count (&victim->eviction_dirty) + == victim->frames_local, + "%d + %d + %d + %d != %d!", + victim->priorities_count, + activity_lru_list_count (&victim->active), + activity_lru_list_count (&victim->inactive), + eviction_list_count (&victim->eviction_dirty), + victim->frames_local); - debug (0, "Goal: %d: %d in laundry, %d made available " - DEBUG_BOLD ("(now: avail: %d, laundry: %d)"), - goal, laundry_count, count - laundry_count, - available_list_count (&available), - laundry_list_count (&laundry)); /* We should never have selected a task from which we can free nothing! */ assert (count > 0); |