loop_entry:
// calculate transfer parameters
- swap_base = victim->swap_item.base + victim_swap_blocks;
+ victim_core_blocks -= blocks;
+ victim_swap_blocks += blocks;
+ swap_base = victim->swap_item.limit - victim_swap_blocks;
#ifndef INDIRECT_CORE
- core_base = victim->core_item.base;
+ core_base = victim->core_item.limit - blocks;
#else /* INDIRECT_CORE */
- core_base = victim->core_item.base + victim_swap_blocks;
+ core_base = victim->core_item.limit - victim_swap_blocks;
#endif /* INDIRECT_CORE */
- victim_core_blocks -= blocks;
- victim_swap_blocks += blocks;
size = (long)blocks << BLOCK_SHIFT;
// transfer data to swap
&core_table,
&victim->core_item,
victim_core_blocks,
- POOL_ALLOC_MODE_LAST_FIT |
POOL_ALLOC_MODE_MOVEABLE |
POOL_ALLOC_MODE_REALLOC
)
&core_table,
&process->core_item,
process_core_blocks + blocks,
- POOL_ALLOC_MODE_LAST_FIT |
POOL_ALLOC_MODE_MOVEABLE |
POOL_ALLOC_MODE_REALLOC
)
loop_entry_full:
// calculate transfer parameters
- process_core_blocks += blocks;
- process_swap_blocks -= blocks;
- swap_base = process->swap_item.base + process_swap_blocks;
+ swap_base = process->swap_item.limit - process_swap_blocks;
#ifndef INDIRECT_CORE
- core_base = process->core_item.base;
+ core_base = process->core_item.limit - blocks;
#else /* INDIRECT_CORE */
- core_base = process->core_item.base + process_swap_blocks;
+ core_base = process->core_item.limit - process_swap_blocks;
#endif /* INDIRECT_CORE */
+ process_core_blocks += blocks;
+ process_swap_blocks -= blocks;
size = (long)blocks << BLOCK_SHIFT;
// transfer data to core
else if (process == victim) {
// victim, remove from core and swap pools
#ifdef INDIRECT_SWAP
- swap_base = victim->swap_item.base;
+ swap_base = victim->swap_item.limit - victim_swap_blocks;
block_pool_free(
&swap_block_pool,
swap_table_mem + swap_base,
#ifndef INDIRECT_CORE
pool_free(&core_table, &victim->core_item);
#else /* INDIRECT_CORE */
- core_base = victim->core_item.base + victim_swap_blocks;
+ core_base = victim->core_item.base;
block_pool_free(
&core_block_pool,
core_table_mem + core_base,
- victim->core_item.limit - core_base
+ victim->core_item.limit - core_base - victim_swap_blocks
);
#endif /* INDIRECT_CORE */
victim = NULL;
long i, addr;
long long hash;
- printf("core_hash_init %d %ld(%d) %ld(%d) %ld(%d)\n", process, base, (int)(base >> BLOCK_SHIFT), size, (int)((size + (BLOCK_SIZE - 1)) >> BLOCK_SHIFT), offset, (int)(offset >> BLOCK_SHIFT));
+ //printf("core_hash_init %d %ld(%d) %ld(%d) %ld(%d)\n", process, base, (int)(base >> BLOCK_SHIFT), size, (int)((size + (BLOCK_SIZE - 1)) >> BLOCK_SHIFT), offset, (int)(offset >> BLOCK_SHIFT));
for (i = 0L; i < size; ++i) {
addr = base + i;
#ifdef INDIRECT_CORE
long i, addr;
long long hash;
- printf("core_hash_verify %d %ld(%d) %ld(%d) %ld(%d)\n", process, base, (int)(base >> BLOCK_SHIFT), size, (int)((size + (BLOCK_SIZE - 1)) >> BLOCK_SHIFT), offset, (int)(offset >> BLOCK_SHIFT));
+ //printf("core_hash_verify %d %ld(%d) %ld(%d) %ld(%d)\n", process, base, (int)(base >> BLOCK_SHIFT), size, (int)((size + (BLOCK_SIZE - 1)) >> BLOCK_SHIFT), offset, (int)(offset >> BLOCK_SHIFT));
for (i = 0L; i < size; ++i) {
addr = base + i;
#ifdef INDIRECT_CORE
}
}
-void swap_hash_verify(int process, long base, long size) {
+void swap_hash_verify(int process, long base, long size, long offset) {
long i, addr;
long long hash;
- printf("swap_hash_verify %d %ld(%d) %ld(%d)\n", process, base, (int)(base >> BLOCK_SHIFT), size, (int)((size + (BLOCK_SIZE - 1)) >> BLOCK_SHIFT));
+ //printf("swap_hash_verify %d %ld(%d) %ld(%d) %ld(%d)\n", process, base, (int)(base >> BLOCK_SHIFT), size, (int)((size + (BLOCK_SIZE - 1)) >> BLOCK_SHIFT), offset, (int)(offset >> BLOCK_SHIFT));
for (i = 0L; i < size; ++i) {
addr = base + i;
#ifdef INDIRECT_SWAP
(swap_table_mem[addr >> BLOCK_SHIFT] << BLOCK_SHIFT) |
(addr & (BLOCK_SIZE - 1));
#endif /* INDIRECT_SWAP */
- hash = process * 17 + i * 29;
+ hash = process * 17 + (i + offset) * 29;
hash = (hash & 0xffffffffLL) + (hash >> 32);
hash = (hash & 0xffffLL) + (hash >> 16);
hash = (hash & 0xffLL) + (hash >> 8);
void core_copy(long src_base, long dest_base, long size) {
long i;
- printf("core_copy %ld(%d) %ld(%d) %ld(%d)\n", src_base, (int)(src_base >> BLOCK_SHIFT), dest_base, (int)(dest_base >> BLOCK_SHIFT), size, (int)((size + (BLOCK_SIZE - 1)) >> BLOCK_SHIFT));
+ //printf("core_copy %ld(%d) %ld(%d) %ld(%d)\n", src_base, (int)(src_base >> BLOCK_SHIFT), dest_base, (int)(dest_base >> BLOCK_SHIFT), size, (int)((size + (BLOCK_SIZE - 1)) >> BLOCK_SHIFT));
for (i = 0L; i < size; ++i) {
core_block_mem[dest_base + i] = core_block_mem[src_base + i];
core_block_mem[src_base + i] = 0xaa;
void core_copy_up(long src_limit, long dest_limit, long size) {
long i;
- printf("core_copy_up %ld(%d) %ld(%d) %ld(%d)\n", src_limit, (int)(src_limit >> BLOCK_SHIFT), dest_limit, (int)(dest_limit >> BLOCK_SHIFT), size, (int)((size + (BLOCK_SIZE - 1)) >> BLOCK_SHIFT));
+ //printf("core_copy_up %ld(%d) %ld(%d) %ld(%d)\n", src_limit, (int)(src_limit >> BLOCK_SHIFT), dest_limit, (int)(dest_limit >> BLOCK_SHIFT), size, (int)((size + (BLOCK_SIZE - 1)) >> BLOCK_SHIFT));
size = -size;
for (i = -1L; i >= size; --i) {
core_block_mem[dest_limit + i] = core_block_mem[src_limit + i];
void swap_copy(long src_base, long dest_base, long size) {
long i;
- printf("swap_copy %ld(%d) %ld(%d) %ld(%d)\n", src_base, (int)(src_base >> BLOCK_SHIFT), dest_base, (int)(dest_base >> BLOCK_SHIFT), size, (int)((size + (BLOCK_SIZE - 1)) >> BLOCK_SHIFT));
+ //printf("swap_copy %ld(%d) %ld(%d) %ld(%d)\n", src_base, (int)(src_base >> BLOCK_SHIFT), dest_base, (int)(dest_base >> BLOCK_SHIFT), size, (int)((size + (BLOCK_SIZE - 1)) >> BLOCK_SHIFT));
for (i = 0; i < size; ++i) {
swap_block_mem[dest_base + i] = swap_block_mem[src_base + i];
swap_block_mem[src_base + i] = 0xaa;
void swap_copy_up(long src_limit, long dest_limit, long size) {
long i;
- printf("swap_copy_up %ld(%d) %ld(%d) %ld(%d)\n", src_limit, (int)(src_limit >> BLOCK_SHIFT), dest_limit, (int)(dest_limit >> BLOCK_SHIFT), size, (int)((size + (BLOCK_SIZE - 1)) >> BLOCK_SHIFT));
+ //printf("swap_copy_up %ld(%d) %ld(%d) %ld(%d)\n", src_limit, (int)(src_limit >> BLOCK_SHIFT), dest_limit, (int)(dest_limit >> BLOCK_SHIFT), size, (int)((size + (BLOCK_SIZE - 1)) >> BLOCK_SHIFT));
size = -size;
for (i = -1; i >= size; --i) {
swap_block_mem[dest_limit + i] = swap_block_mem[src_limit + i];
void core_to_swap_copy(long src_base, long dest_base, long size) {
long i;
- printf("core_to_swap_copy %ld(%d) %ld(%d) %ld(%d)\n", src_base, (int)(src_base >> BLOCK_SHIFT), dest_base, (int)(dest_base >> BLOCK_SHIFT), size, (int)((size + (BLOCK_SIZE - 1)) >> BLOCK_SHIFT));
+ //printf("core_to_swap_copy %ld(%d) %ld(%d) %ld(%d)\n", src_base, (int)(src_base >> BLOCK_SHIFT), dest_base, (int)(dest_base >> BLOCK_SHIFT), size, (int)((size + (BLOCK_SIZE - 1)) >> BLOCK_SHIFT));
for (i = 0; i < size; ++i)
rassert(swap_block_mem[dest_base + i] == 0xaa);
memcpy(swap_block_mem + dest_base, core_block_mem + src_base, size);
void swap_to_core_copy(long src_base, long dest_base, long size) {
long i;
- printf("swap_to_core_copy %ld(%d) %ld(%d) %ld(%d)\n", src_base, (int)(src_base >> BLOCK_SHIFT), dest_base, (int)(dest_base >> BLOCK_SHIFT), size, (int)((size + (BLOCK_SIZE - 1)) >> BLOCK_SHIFT));
+ //printf("swap_to_core_copy %ld(%d) %ld(%d) %ld(%d)\n", src_base, (int)(src_base >> BLOCK_SHIFT), dest_base, (int)(dest_base >> BLOCK_SHIFT), size, (int)((size + (BLOCK_SIZE - 1)) >> BLOCK_SHIFT));
for (i = 0; i < size; ++i)
rassert(core_block_mem[dest_base + i] == 0xaa);
memcpy(core_block_mem + dest_base, swap_block_mem + src_base, size);
}
if (processes[test.process].lru_item.prev != NULL) { // fully in core
assert(processes + test.process != victim);
- swap_base = -1;
- swap_blocks = 0;
- swap_size = 0L;
core_base = processes[test.process].core_item.base;
core_blocks = processes[test.process].core_item.limit - core_base;
core_size = processes[test.process].size;
+ swap_base = -1;
+ swap_blocks = 0;
+ swap_size = 0L;
}
else {
if (processes + test.process == victim) { // victim
- swap_base = victim->swap_item.base;
- swap_blocks = victim_swap_blocks;
- swap_size = swap_blocks << BLOCK_SHIFT;
-#ifndef INDIRECT_CORE
core_base = victim->core_item.base;
+#ifndef INDIRECT_CORE
+ core_blocks = victim->core_item.limit - core_base;
#else /* INDIRECT_CORE */
- core_base = victim->core_item.base + swap_blocks;
+ core_blocks = victim->core_item.limit - core_base - victim_swap_blocks;
#endif /* INDIRECT_CORE */
- core_blocks = victim->core_item.limit - core_base;
- core_size = victim->size - swap_size;
+ core_size = core_blocks << BLOCK_SHIFT;
+ swap_base = victim->swap_item.limit - victim_swap_blocks;
+ swap_blocks = victim_swap_blocks;
+ swap_size = victim->size - core_size;
}
else { // fully in swap
- swap_base = processes[test.process].swap_item.base;
- swap_blocks = processes[test.process].swap_item.limit - swap_base;
- swap_size = processes[test.process].size;
core_base = -1;
core_blocks = 0;
core_size = 0L;
+ swap_base = processes[test.process].swap_item.base;
+ swap_blocks = processes[test.process].swap_item.limit - swap_base;
+ swap_size = processes[test.process].size;
}
}
rassert(core_blocks + swap_blocks == actual_old_blocks);
test.process,
(long)core_base << BLOCK_SHIFT,
core_size,
- swap_size
+ 0
);
swap_hash_verify(
test.process,
(long)swap_base << BLOCK_SHIFT,
- swap_size
+ swap_size,
+ core_size
);
process_free(processes + test.process);
processes[test.process].size = -1L;
else {
if (processes[i].lru_item.prev != NULL) { // fully in core
assert(processes + i != victim);
- swap_base = -1;
- swap_blocks = 0;
- swap_size = 0L;
core_base = processes[i].core_item.base;
core_blocks = processes[i].core_item.limit - core_base;
core_size = processes[i].size;
+ swap_base = -1;
+ swap_blocks = 0;
+ swap_size = 0L;
}
else {
if (processes + i == victim) { // victim
- swap_base = victim->swap_item.base;
- swap_blocks = victim_swap_blocks;
- swap_size = swap_blocks << BLOCK_SHIFT;
-#ifndef INDIRECT_CORE
core_base = victim->core_item.base;
+#ifndef INDIRECT_CORE
+ core_blocks = victim->core_item.limit - core_base;
#else /* INDIRECT_CORE */
- core_base = victim->core_item.base + swap_blocks;
+ core_blocks = victim->core_item.limit - core_base - victim_swap_blocks;
#endif /* INDIRECT_CORE */
- core_blocks = victim->core_item.limit - core_base;
- core_size = victim->size - swap_size;
+ core_size = core_blocks << BLOCK_SHIFT;
+ swap_base = victim->swap_item.limit - victim_swap_blocks;
+ swap_blocks = victim_swap_blocks;
+ swap_size = victim->size - core_size;
}
else { // fully in swap
- swap_base = processes[i].swap_item.base;
- swap_blocks = processes[i].swap_item.limit - swap_base;
- swap_size = processes[i].size;
core_base = -1;
core_blocks = 0;
core_size = 0L;
+ swap_base = processes[i].swap_item.base;
+ swap_blocks = processes[i].swap_item.limit - swap_base;
+ swap_size = processes[i].size;
}
}
rassert(
i,
(long)core_base << BLOCK_SHIFT,
core_size,
- swap_size
+ 0
);
#ifdef INDIRECT_CORE
block_pool_free(
swap_hash_verify(
i,
(long)swap_base << BLOCK_SHIFT,
- swap_size
+ swap_size,
+ core_size
);
#ifdef INDIRECT_SWAP
block_pool_free(