Skip to content

Commit 3b27b8d

Browse files
authored
Merge pull request #61 from lrowe/madvise-chunks
madvise in 1MB chunks when loading snapshot state to avoid kernel cap.
2 parents 91e03f5 + f787081 commit 3b27b8d

File tree

1 file changed

+5
-2
lines changed

1 file changed

+5
-2
lines changed

lib/tinykvm/machine_state.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -143,14 +143,17 @@ bool Machine::load_snapshot_state()
143143

144144
void* current = state.current;
145145
// Load populate pages
146+
madvise(this->memory.ptr, kernel_end_address(), MADV_WILLNEED | MADV_RANDOM);
147+
static const uint64_t step = 1024*1024;
146148
for (unsigned i = 0; i < state.num_access_ranges; i++) {
147149
ColdStartAccessedRange* range = state.next<ColdStartAccessedRange>(current);
148150
if (range->start >= MemoryBanks::ARENA_BASE_ADDRESS || range->start < kernel_end_address())
149151
continue;
150152
try {
151153
//printf("Populating pages from 0x%lX -> 0x%lX\n", range->start, range->end);
152-
char* page = this->memory.get_userpage_at(range->start);
153-
madvise(page, range->end - range->start, MADV_WILLNEED | MADV_RANDOM);
154+
for (uint64_t start = range->start; start < range->end; start += step) {
155+
madvise(this->memory.ptr + start, std::min(range->end - start, step), MADV_WILLNEED | MADV_RANDOM);
156+
}
154157
} catch (const std::exception& e) {
155158
fprintf(stderr, "Failed to access page at 0x%lX: %s\n", range->start, e.what());
156159
continue;

0 commit comments

Comments
 (0)