mem: Optionally share the backing store
This patch adds the ability for a host-OS process external to gem5 to access the backing store via POSIX shared memory. The new param shared_backstore of the System object is the filename of the shared memory (i.e., the first argument to shm_open()). Change-Id: I98c948a32a15049a4515e6c02a14595fb5fe379f Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/30994 Reviewed-by: Jason Lowe-Power <power.jg@gmail.com> Maintainer: Jason Lowe-Power <power.jg@gmail.com> Tested-by: kokoro <noreply+kokoro@google.com>
This commit is contained in:
committed by
Boris Shingarov
parent
cc3e12b504
commit
f7e5985e7b
@@ -71,8 +71,10 @@ using namespace std;
|
||||
|
||||
PhysicalMemory::PhysicalMemory(const string& _name,
|
||||
const vector<AbstractMemory*>& _memories,
|
||||
bool mmap_using_noreserve) :
|
||||
_name(_name), size(0), mmapUsingNoReserve(mmap_using_noreserve)
|
||||
bool mmap_using_noreserve,
|
||||
const std::string& shared_backstore) :
|
||||
_name(_name), size(0), mmapUsingNoReserve(mmap_using_noreserve),
|
||||
sharedBackstore(shared_backstore)
|
||||
{
|
||||
if (mmap_using_noreserve)
|
||||
warn("Not reserving swap space. May cause SIGSEGV on actual usage\n");
|
||||
@@ -192,7 +194,23 @@ PhysicalMemory::createBackingStore(AddrRange range,
|
||||
// perform the actual mmap
|
||||
DPRINTF(AddrRanges, "Creating backing store for range %s with size %d\n",
|
||||
range.to_string(), range.size());
|
||||
int map_flags = MAP_ANON | MAP_PRIVATE;
|
||||
|
||||
int shm_fd;
|
||||
int map_flags;
|
||||
|
||||
if (sharedBackstore.empty()) {
|
||||
shm_fd = -1;
|
||||
map_flags = MAP_ANON | MAP_PRIVATE;
|
||||
} else {
|
||||
DPRINTF(AddrRanges, "Sharing backing store as %s\n",
|
||||
sharedBackstore.c_str());
|
||||
shm_fd = shm_open(sharedBackstore.c_str(), O_CREAT | O_RDWR, 0666);
|
||||
if (shm_fd == -1)
|
||||
panic("Shared memory failed");
|
||||
if (ftruncate(shm_fd, range.size()))
|
||||
panic("Setting size of shared memory failed");
|
||||
map_flags = MAP_SHARED;
|
||||
}
|
||||
|
||||
// to be able to simulate very large memories, the user can opt to
|
||||
// pass noreserve to mmap
|
||||
@@ -202,7 +220,7 @@ PhysicalMemory::createBackingStore(AddrRange range,
|
||||
|
||||
uint8_t* pmem = (uint8_t*) mmap(NULL, range.size(),
|
||||
PROT_READ | PROT_WRITE,
|
||||
map_flags, -1, 0);
|
||||
map_flags, shm_fd, 0);
|
||||
|
||||
if (pmem == (uint8_t*) MAP_FAILED) {
|
||||
perror("mmap");
|
||||
|
||||
@@ -127,6 +127,8 @@ class PhysicalMemory : public Serializable
|
||||
// Let the user choose if we reserve swap space when calling mmap
|
||||
const bool mmapUsingNoReserve;
|
||||
|
||||
const std::string sharedBackstore;
|
||||
|
||||
// The physical memory used to provide the memory in the simulated
|
||||
// system
|
||||
std::vector<BackingStoreEntry> backingStore;
|
||||
@@ -158,7 +160,8 @@ class PhysicalMemory : public Serializable
|
||||
*/
|
||||
PhysicalMemory(const std::string& _name,
|
||||
const std::vector<AbstractMemory*>& _memories,
|
||||
bool mmap_using_noreserve);
|
||||
bool mmap_using_noreserve,
|
||||
const std::string& shared_backstore);
|
||||
|
||||
/**
|
||||
* Unmap all the backing store we have used.
|
||||
|
||||
@@ -78,6 +78,10 @@ class System(SimObject):
|
||||
# I/O bridge or cache
|
||||
mem_ranges = VectorParam.AddrRange([], "Ranges that constitute main memory")
|
||||
|
||||
shared_backstore = Param.String("", "backstore's shmem segment filename, "
|
||||
"use to directly address the backstore from another host-OS process. "
|
||||
"Leave this empty to unset the MAP_SHARED flag.")
|
||||
|
||||
cache_line_size = Param.Unsigned(64, "Cache line size in bytes")
|
||||
|
||||
redirect_paths = VectorParam.RedirectPath([], "Path redirections")
|
||||
|
||||
@@ -213,7 +213,8 @@ System::System(Params *p)
|
||||
#else
|
||||
kvmVM(nullptr),
|
||||
#endif
|
||||
physmem(name() + ".physmem", p->memories, p->mmap_using_noreserve),
|
||||
physmem(name() + ".physmem", p->memories, p->mmap_using_noreserve,
|
||||
p->shared_backstore),
|
||||
memoryMode(p->mem_mode),
|
||||
_cacheLineSize(p->cache_line_size),
|
||||
workItemsBegin(0),
|
||||
|
||||
Reference in New Issue
Block a user