Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Persistent Checkpointing (#2184) #3918

Closed
wants to merge 5 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 25 additions & 11 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -556,17 +556,26 @@ endforeach(generated_file)

add_custom_target(Generated DEPENDS ${GENERATED_FILES})

add_custom_command(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/rr_trace.capnp.c++"
"${CMAKE_CURRENT_BINARY_DIR}/rr_trace.capnp.h"
COMMAND capnp compile
"--src-prefix=${CMAKE_CURRENT_SOURCE_DIR}/src"
"-oc++:${CMAKE_CURRENT_BINARY_DIR}"
"${CMAKE_CURRENT_SOURCE_DIR}/src/rr_trace.capnp"
DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/src/rr_trace.capnp")
set_source_files_properties("${CMAKE_CURRENT_BINARY_DIR}/rr_trace.capnp.c++"
PROPERTIES GENERATED true)
set_source_files_properties("${CMAKE_CURRENT_BINARY_DIR}/rr_trace.capnp.h"
PROPERTIES GENERATED true HEADER_FILE_ONLY true)

set(CAPNP_FILES
rr_trace
rr_pcp
)

# Compile capnproto files
foreach(capnp_file ${CAPNP_FILES})
add_custom_command(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${capnp_file}.capnp.c++"
"${CMAKE_CURRENT_BINARY_DIR}/${capnp_file}.capnp.h"
COMMAND capnp compile
"--src-prefix=${CMAKE_CURRENT_SOURCE_DIR}/src"
"-oc++:${CMAKE_CURRENT_BINARY_DIR}"
"${CMAKE_CURRENT_SOURCE_DIR}/src/${capnp_file}.capnp"
DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/src/${capnp_file}.capnp")
set_source_files_properties("${CMAKE_CURRENT_BINARY_DIR}/${capnp_file}.capnp.c++"
PROPERTIES GENERATED true)
set_source_files_properties("${CMAKE_CURRENT_BINARY_DIR}/${capnp_file}.capnp.h"
PROPERTIES GENERATED true HEADER_FILE_ONLY true)
endforeach()

if (${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch64")
set(BLAKE_ARCH_DIR third-party/blake2/neon)
Expand All @@ -578,12 +587,14 @@ set(RR_SOURCES
src/AddressSpace.cc
src/AutoRemoteSyscalls.cc
src/BuildidCommand.cc
src/CheckpointInfo.cc
src/Command.cc
src/CompressedReader.cc
src/CompressedWriter.cc
src/ContextSwitchEvent.cc
src/CPUFeaturesCommand.cc
src/CPUIDBugDetector.cc
src/CreateCheckpointsCommand.cc
src/DiversionSession.cc
src/DumpCommand.cc
src/Dwarf.cc
Expand Down Expand Up @@ -621,6 +632,7 @@ set(RR_SOURCES
src/PackCommand.cc
src/PerfCounters.cc
src/PerfCounterBuffers.cc
src/PersistentCheckpointing.cc
src/PidFdMonitor.cc
src/processor_trace_check.cc
src/ProcFdDirMonitor.cc
Expand Down Expand Up @@ -660,6 +672,7 @@ set(RR_SOURCES
src/WaitManager.cc
src/WaitStatus.cc
${CMAKE_CURRENT_BINARY_DIR}/rr_trace.capnp.c++
${CMAKE_CURRENT_BINARY_DIR}/rr_pcp.capnp.c++
${BLAKE_ARCH_DIR}/blake2b.c
)

Expand Down Expand Up @@ -1499,6 +1512,7 @@ set(TESTS_WITH_PROGRAM
# check_session_leaks
checkpoint_dying_threads
checkpoint_mixed_mode
checkpoint_persistent_shmem
checksum_sanity
check_lost_interrupts
clone_file_range
Expand Down
5 changes: 5 additions & 0 deletions src/AddressSpace.cc
Original file line number Diff line number Diff line change
Expand Up @@ -554,6 +554,11 @@ void AddressSpace::save_auxv(Task* t) {
save_interpreter_base(t, saved_auxv());
}

void AddressSpace::restore_auxv(Task* t, std::vector<uint8_t>&& auxv) {
saved_auxv_ = std::move(auxv);
save_interpreter_base(t, saved_auxv());
}

void AddressSpace::save_interpreter_base(Task* t, std::vector<uint8_t> auxv) {
saved_interpreter_base_ = read_interpreter_base(auxv);
save_ld_path(t, saved_interpreter_base());
Expand Down
20 changes: 20 additions & 0 deletions src/AddressSpace.h
Original file line number Diff line number Diff line change
Expand Up @@ -662,6 +662,14 @@ class AddressSpace : public HasTaskSet {
* Dies if no shm size is registered for the address.
*/
size_t get_shm_size(remote_ptr<void> addr) { return shm_sizes[addr]; }

/**
* Check if `map` is shared memory
*/
bool has_shm_at(const KernelMapping& map) const {
return shm_sizes.find(map.start()) != std::cend(shm_sizes);
}

void remove_shm_size(remote_ptr<void> addr) { shm_sizes.erase(addr); }

/**
Expand Down Expand Up @@ -795,6 +803,9 @@ class AddressSpace : public HasTaskSet {
const std::vector<uint8_t>& saved_auxv() { return saved_auxv_; }
void save_auxv(Task* t);

/* Used when restoring persistent checkpoints. */
void restore_auxv(Task* t, std::vector<uint8_t>&& auxv);

remote_ptr<void> saved_interpreter_base() { return saved_interpreter_base_; }
void save_interpreter_base(Task* t, std::vector<uint8_t> auxv);

Expand Down Expand Up @@ -873,6 +884,15 @@ class AddressSpace : public HasTaskSet {

bool legacy_breakpoint_mode() { return stopping_breakpoint_table_ != nullptr; }
remote_code_ptr do_breakpoint_fault_addr() { return do_breakpoint_fault_addr_; }

void set_breakpoint_fault_addr(remote_code_ptr addr) {
do_breakpoint_fault_addr_ = addr;
}

void set_uses_syscall_buffer(bool uses_syscall_buffer = true) {
syscallbuf_enabled_ = uses_syscall_buffer;
}

remote_code_ptr stopping_breakpoint_table() { return stopping_breakpoint_table_; }
int stopping_breakpoint_table_entry_size() { return stopping_breakpoint_table_entry_size_; }

Expand Down
9 changes: 8 additions & 1 deletion src/BpfMapMonitor.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,19 @@ class BpfMapMonitor : public FileMonitor {
public:
BpfMapMonitor(uint64_t key_size, uint64_t value_size) : key_size_(key_size), value_size_(value_size) {}

virtual Type type() override { return BpfMap; }
virtual Type type() const override { return BpfMap; }

uint64_t key_size() const { return key_size_; }
uint64_t value_size() const { return value_size_; }

private:
virtual void serialize_type(
pcp::FileMonitor::Builder& builder) const noexcept override {
auto bpf = builder.initBpf();
bpf.setKeySize(key_size_);
bpf.setValueSize(value_size_);
}

uint64_t key_size_;
uint64_t value_size_;
};
Expand Down
Loading
Loading