Skip to content

Commit 45fc316

Browse files
committed
Add support for limiting working memory during kwm reset
1 parent a04ed3c commit 45fc316

File tree

1 file changed

+14
-6
lines changed

1 file changed

+14
-6
lines changed

lib/tinykvm/memory.cpp

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -57,12 +57,20 @@ bool vMemory::fork_reset(const Machine& main_vm, const MachineOptions& options)
5757
// from the master VM to this forked VM. This is a gamble
5858
// that it's cheaper to copy than the TLB flushes that happen
5959
// from the mov cr3.
60-
/// XXX: TODO: If we are resetting with a lower working memory than
61-
/// what is currently allocated, we cannot re-use the memory banks
62-
/// anymore and we have to do a full reset. Although, we could have
63-
/// a rule that says if you are above the limit, it just means you
64-
/// have nowhere to go. If you need one more page, a fault will be
65-
/// triggered which again triggers a full reset. Oh well.
60+
if (options.reset_free_work_mem != 0) {
61+
// When reset_free_work_mem is non-zero, we will compare the
62+
// memory bank working memory usage against the limit.
63+
// If the limit is exceeded, we will return true to indicate
64+
// that a full reset is to be performed, which will release
65+
// memory back to the system, keeping memory usage in check.
66+
const uint64_t used = this->machine.banked_memory_pages() *
67+
vMemory::PageSize();
68+
if (used > uint64_t(options.reset_free_work_mem)) {
69+
//fprintf(stderr, "Freeing %zu bytes of work memory\n", used);
70+
this->banks.reset(options);
71+
return true;
72+
}
73+
}
6674
try {
6775
foreach_page(*this, [&](uint64_t addr, uint64_t& entry, uint64_t page_size) {
6876
// If the page is writable, we will restore the original

0 commit comments

Comments
 (0)