File dirty.h
-
namespace faabric
-
namespace util
-
class DirtyTracker
Subclassed by faabric::util::NoneDirtyTracker, faabric::util::SegfaultDirtyTracker, faabric::util::SoftPTEDirtyTracker, faabric::util::UffdDirtyTracker
Public Functions
-
inline DirtyTracker(const std::string &modeIn)
-
virtual void clearAll() = 0
-
virtual std::string getType() = 0
-
virtual void startTracking(std::span<uint8_t> region) = 0
-
virtual void stopTracking(std::span<uint8_t> region) = 0
-
virtual std::vector<char> getDirtyPages(std::span<uint8_t> region) = 0
-
virtual void startThreadLocalTracking(std::span<uint8_t> region) = 0
-
virtual void stopThreadLocalTracking(std::span<uint8_t> region) = 0
-
virtual std::vector<char> getThreadLocalDirtyPages(std::span<uint8_t> region) = 0
-
virtual std::vector<char> getBothDirtyPages(std::span<uint8_t> region) = 0
Protected Attributes
-
const std::string mode
-
inline DirtyTracker(const std::string &modeIn)
-
class NoneDirtyTracker : public faabric::util::DirtyTracker
Public Functions
-
NoneDirtyTracker(const std::string &modeIn)
-
virtual void clearAll() override
-
inline virtual std::string getType() override
-
virtual void startTracking(std::span<uint8_t> region) override
-
virtual void stopTracking(std::span<uint8_t> region) override
-
virtual std::vector<char> getDirtyPages(std::span<uint8_t> region) override
-
virtual void startThreadLocalTracking(std::span<uint8_t> region) override
-
virtual void stopThreadLocalTracking(std::span<uint8_t> region) override
-
virtual std::vector<char> getThreadLocalDirtyPages(std::span<uint8_t> region) override
-
virtual std::vector<char> getBothDirtyPages(std::span<uint8_t> region) override
Private Members
-
std::vector<char> dirtyPages
-
NoneDirtyTracker(const std::string &modeIn)
-
class SegfaultDirtyTracker : public faabric::util::DirtyTracker
Public Functions
-
SegfaultDirtyTracker(const std::string &modeIn)
-
virtual void clearAll() override
-
inline virtual std::string getType() override
-
virtual void startTracking(std::span<uint8_t> region) override
-
virtual void stopTracking(std::span<uint8_t> region) override
-
virtual std::vector<char> getDirtyPages(std::span<uint8_t> region) override
-
virtual void startThreadLocalTracking(std::span<uint8_t> region) override
-
virtual void stopThreadLocalTracking(std::span<uint8_t> region) override
-
virtual std::vector<char> getThreadLocalDirtyPages(std::span<uint8_t> region) override
-
virtual std::vector<char> getBothDirtyPages(std::span<uint8_t> region) override
Public Static Functions
-
static void handler(int sig, siginfo_t *info, void *ucontext) noexcept
-
SegfaultDirtyTracker(const std::string &modeIn)
-
class SoftPTEDirtyTracker : public faabric::util::DirtyTracker
Public Functions
-
SoftPTEDirtyTracker(const std::string &modeIn)
-
~SoftPTEDirtyTracker()
-
virtual void clearAll() override
-
inline virtual std::string getType() override
-
virtual void startTracking(std::span<uint8_t> region) override
-
virtual void stopTracking(std::span<uint8_t> region) override
-
virtual std::vector<char> getDirtyPages(std::span<uint8_t> region) override
-
virtual void startThreadLocalTracking(std::span<uint8_t> region) override
-
virtual void stopThreadLocalTracking(std::span<uint8_t> region) override
-
virtual std::vector<char> getThreadLocalDirtyPages(std::span<uint8_t> region) override
-
virtual std::vector<char> getBothDirtyPages(std::span<uint8_t> region) override
Private Functions
-
void resetPTEs()
-
SoftPTEDirtyTracker(const std::string &modeIn)
-
class UffdDirtyTracker : public faabric::util::DirtyTracker
- #include <dirty.h>
Dirty tracking implementation using userfaultfd to write-protect pages, then handle the resulting userspace events when they are written to.
The dirty tracking mode can be one of four options:
uffd - uses the
SIGBUShandler to catch events triggered by accessing missing pages in demand-zero paged memory.uffd-wp - same as
uffdbut adds write-protected events to catch subsequent writes to write-protected pages.uffd-thread - same as
uffd, but using a background event thread to handle events. This has the benefit of distinguishing between read and write missing page events.uffd-thread-wp - same as
uffd-thread, but adds write-protected events.
See the docs for more info on these different approaches: https://www.kernel.org/doc/html/latest/admin-guide/mm/userfaultfd.html
Public Functions
-
UffdDirtyTracker(const std::string &modeIn)
-
~UffdDirtyTracker()
-
virtual void clearAll() override
-
inline virtual std::string getType() override
-
virtual void startTracking(std::span<uint8_t> region) override
-
virtual void stopTracking(std::span<uint8_t> region) override
-
virtual std::vector<char> getDirtyPages(std::span<uint8_t> region) override
-
virtual void startThreadLocalTracking(std::span<uint8_t> region) override
-
virtual void stopThreadLocalTracking(std::span<uint8_t> region) override
-
virtual std::vector<char> getThreadLocalDirtyPages(std::span<uint8_t> region) override
-
virtual std::vector<char> getBothDirtyPages(std::span<uint8_t> region) override
Public Static Functions
-
static void sigbusHandler(int sig, siginfo_t *info, void *ucontext) noexcept
Private Static Functions
-
static void initUffd()
-
static void stopUffd()
-
static void registerRegion(std::span<uint8_t> region)
-
static void writeProtectRegion(std::span<uint8_t> region)
-
static void removeWriteProtect(std::span<uint8_t> region, bool throwEx)
-
static bool zeroRegion(std::span<uint8_t> region)
-
static void deregisterRegion(std::span<uint8_t> region)
-
static void eventThreadEntrypoint()
-
class DirtyTracker
-
namespace util