struct lru_item lru_head;
struct process *victim;
+int victim_swap_blocks;
void process_init(int n, int spare) {
int i;
}
static bool do_swap_out(int swap_out) {
-#ifndef INDIRECT_CORE
int victim_core_blocks;
-#endif /* ! INDIRECT_CORE */
int blocks, swap_base, core_base;
long size;
#ifndef INDIRECT_CORE
if (swap_out > 0) {
if (victim) {
// calculate amount to swap out
-#ifndef INDIRECT_CORE
-#ifdef INDIRECT_SWAP
- blocks = swap_block_pool.avail;
- if (blocks == 0)
- return false;
- if (blocks > swap_out)
- blocks = swap_out;
-#endif /* INDIRECT_SWAP */
victim_core_blocks =
- victim->core_item.limit - victim->core_item.base;
-#ifndef INDIRECT_SWAP
- blocks = swap_out < victim_core_blocks ? swap_out : victim_core_blocks;
-#else /* INDIRECT_SWAP */
- if (blocks > victim_core_blocks)
- blocks = victim_core_blocks;
-#endif /* INDIRECT_SWAP */
-#else /* INDIRECT_CORE */
+#ifndef INDIRECT_CORE
+ victim->core_item.limit - victim->core_item.base;
+#else
+ victim->core_item.limit - victim->core_item.base - victim_swap_blocks;
+#endif
#ifndef INDIRECT_SWAP
blocks = swap_out < victim_core_blocks ? swap_out : victim_core_blocks;
-#else /* INDIRECT_SWAP */
+#else
blocks = swap_block_pool.avail;
if (blocks == 0)
return false;
if (blocks > victim_core_blocks)
blocks = victim_core_blocks;
#endif /* INDIRECT_SWAP */
-#endif /* INDIRECT_CORE */
printf("existing victim %d, swap out %d of %d\n", (int)(victim - processes), blocks, victim_core_blocks);
// increase swap allocation
// loop for the case of no existing victim
do {
// calculate amount to swap out
-#ifdef INDIRECT_SWAP
- blocks = swap_block_pool.avail;
- if (blocks == 0)
- return false;
- if (blocks > swap_out)
- blocks = swap_out;
-#endif /* INDIRECT_SWAP */
assert(lru_head.prev != &lru_head);
victim = (struct process *)lru_head.prev;
+ victim_swap_blocks = 0;
victim_core_blocks =
victim->core_item.limit - victim->core_item.base;
#ifndef INDIRECT_SWAP
blocks = swap_out < victim_core_blocks ? swap_out : victim_core_blocks;
#else /* INDIRECT_SWAP */
+ blocks = swap_block_pool.avail;
+ if (blocks == 0)
+ {
+ victim = NULL;
+ return false;
+ }
+ if (blocks > swap_out)
+ blocks = swap_out;
if (blocks > victim_core_blocks)
blocks = victim_core_blocks;
#endif /* INDIRECT_SWAP */
printf("new victim %d, swap out %d of %d\n", (int)(victim - processes), blocks, victim_core_blocks);
- // add to swap pool
- victim_swap_blocks = 0;
-
// remove from LRU list
victim->lru_item.prev->next = victim->lru_item.next;
victim->lru_item.next->prev = victim->lru_item.prev;
}
// victim, take over the dedicated pool items
-#ifndef INDIRECT_CORE
process_core_blocks =
+#ifndef INDIRECT_CORE
victim->core_item.limit - victim->core_item.base;
#else /* INDIRECT_CORE */
- process_core_blocks = victim_core_blocks;
+ victim->core_item.limit - victim->core_item.base - victim_swap_blocks;
#endif /* INDIRECT_CORE */
process_swap_blocks = victim_swap_blocks;
victim = NULL;
block_pool_free(
&core_block_pool,
core_table_mem + core_base,
- victim_core_blocks
+ victim->core_item.limit - core_base
);
#endif /* INDIRECT_CORE */
victim = NULL;
swap_size = swap_blocks << BLOCK_SHIFT;
#ifndef INDIRECT_CORE
core_base = victim->core_item.base;
- core_blocks = victim->core_item.limit - core_base;
#else /* INDIRECT_CORE */
core_base = victim->core_item.base + swap_blocks;
- core_blocks = victim_core_blocks;
#endif /* INDIRECT_CORE */
+ core_blocks = victim->core_item.limit - core_base;
core_size = victim->size - swap_size;
}
else { // fully in swap
swap_size = swap_blocks << BLOCK_SHIFT;
#ifndef INDIRECT_CORE
core_base = victim->core_item.base;
- core_blocks = victim->core_item.limit - core_base;
#else /* INDIRECT_CORE */
core_base = victim->core_item.base + swap_blocks;
- core_blocks = victim_core_blocks;
#endif /* INDIRECT_CORE */
+ core_blocks = victim->core_item.limit - core_base;
core_size = victim->size - swap_size;
}
else { // fully in swap