|
2 | 2 | #include <catch2/matchers/catch_matchers_string.hpp> |
3 | 3 |
|
4 | 4 | #include <tinykvm/machine.hpp> |
5 | | -#include <linux/kvm.h> |
6 | 5 | extern std::vector<uint8_t> build_and_load(const std::string& code); |
7 | 6 | static const uint64_t MAX_MEMORY = 8ul << 20; /* 8MB */ |
8 | 7 | static const uint64_t MAX_COWMEM = 3ul << 20; /* 3MB */ |
@@ -605,6 +604,8 @@ int func2() { |
605 | 604 | REQUIRE(machine2.is_forkable()); |
606 | 605 | REQUIRE(!machine2.is_forked()); |
607 | 606 |
|
| 607 | + /// -- full resets -- /// |
| 608 | + |
608 | 609 | auto fork1 = tinykvm::Machine { machine1, { |
609 | 610 | .max_cow_mem = MAX_COWMEM, |
610 | 611 | .split_hugepages = true |
@@ -637,4 +638,41 @@ int func2() { |
637 | 638 | .split_hugepages = true |
638 | 639 | }); |
639 | 640 | } |
| 641 | + |
| 642 | + /// -- keep working memory resets -- /// |
| 643 | + |
| 644 | + auto fork3 = tinykvm::Machine { machine1, { |
| 645 | + .max_cow_mem = MAX_COWMEM, |
| 646 | + .split_hugepages = true |
| 647 | + } }; |
| 648 | + |
| 649 | + for (int i = 0; i < 100; i++) |
| 650 | + { |
| 651 | + fork3.run(4.0f); |
| 652 | + REQUIRE(fork3.return_value() == 666); |
| 653 | + |
| 654 | + fork3.reset_to(machine1, { |
| 655 | + .max_cow_mem = 4ul << 20, |
| 656 | + .split_hugepages = true, |
| 657 | + .reset_keep_all_work_memory = true |
| 658 | + }); |
| 659 | + } |
| 660 | + |
| 661 | + auto fork4 = tinykvm::Machine { machine2, { |
| 662 | + .max_cow_mem = MAX_COWMEM, |
| 663 | + .split_hugepages = true |
| 664 | + } }; |
| 665 | + |
| 666 | + for (int i = 0; i < 100; i++) |
| 667 | + { |
| 668 | + fork4.setup_linux({"fork"}, env); |
| 669 | + fork4.run(4.0f); |
| 670 | + REQUIRE(fork4.return_value() == 666); |
| 671 | + |
| 672 | + fork4.reset_to(machine2, { |
| 673 | + .max_cow_mem = 4ul << 20, |
| 674 | + .split_hugepages = true, |
| 675 | + .reset_keep_all_work_memory = true |
| 676 | + }); |
| 677 | + } |
640 | 678 | } |
0 commit comments