Program Listing for File Uffd.hpp¶
↰ Return to documentation for file (umap/Uffd.hpp)
//////////////////////////////////////////////////////////////////////////////
// Copyright 2017-2020 Lawrence Livermore National Security, LLC and other
// UMAP Project Developers. See the top-level LICENSE file for details.
//
// SPDX-License-Identifier: LGPL-2.1-only
//////////////////////////////////////////////////////////////////////////////
#ifndef _UMAP_Uffd_HPP
#define _UMAP_Uffd_HPP
#include <algorithm> // sort()
#include <cassert> // assert()
#include <cstdint> // uint64_t
#include <iomanip>
#include <iostream>
#include <vector> // We all have lists to manage
#include <errno.h> // strerror()
#include <fcntl.h> // O_CLOEXEC
#include <linux/userfaultfd.h> // ioctl(UFFDIO_*)
#include <poll.h> // poll()
#include <string.h> // strerror()
#include <sys/ioctl.h> // ioctl()
#include <sys/syscall.h> // syscall()
#include <unistd.h> // syscall()
#include "umap/config.h"
//
// The UFFDIO_COPY_MODE_WP is only defined in later versions of Linux (>5.0)
//
#ifndef UFFDIO_COPY_MODE_WP
#define UMAP_RO_MODE
#endif
#include "umap/RegionDescriptor.hpp"
#include "umap/RegionManager.hpp"
#include "umap/WorkerPool.hpp"
namespace Umap {
class RegionManager;
class PageEvent {
public:
PageEvent(void* paddr, bool iswrite);
};
class Uffd : public WorkerPool {
public:
Uffd( void );
~Uffd( void);
void process_page(bool iswrite, char* addr );
void register_region( RegionDescriptor* region );
void unregister_region( RegionDescriptor* region );
void enable_write_protect( void* );
void disable_write_protect( void* );
void copy_in_page(char* data, void* page_address);
void copy_in_page_and_write_protect(char* data, void* page_address);
private:
RegionManager& m_rm;
uint64_t m_max_fault_events;
uint64_t m_page_size;
Buffer* m_buffer;
int m_uffd_fd;
int m_pipe[2];
std::vector<uffd_msg> m_events;
void uffd_handler( void );
void ThreadEntry( void );
void check_uffd_compatibility( void );
};
} // end of namespace Umap
#endif // _UMAP_Uffd_HPP