Boris Shingarov has submitted this change. (
https://gem5-review.googlesource.com/c/public/gem5/+/30994 )
Change subject: mem: Optionally share the backing store
......................................................................
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...@gmail.com>
Maintainer: Jason Lowe-Power <power...@gmail.com>
Tested-by: kokoro <noreply+kok...@google.com>
---
M src/mem/physical.cc
M src/mem/physical.hh
M src/sim/System.py
M src/sim/system.cc
4 files changed, 32 insertions(+), 6 deletions(-)
Approvals:
Jason Lowe-Power: Looks good to me, approved; Looks good to me, approved
kokoro: Regressions pass
diff --git a/src/mem/physical.cc b/src/mem/physical.cc
index 4bd812c..a03f200 100644
--- a/src/mem/physical.cc
+++ b/src/mem/physical.cc
@@ -71,8 +71,10 @@
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 @@
// 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 @@
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");
diff --git a/src/mem/physical.hh b/src/mem/physical.hh
index 88a5cda..9d4ff9a 100644
--- a/src/mem/physical.hh
+++ b/src/mem/physical.hh
@@ -127,6 +127,8 @@
// 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 @@
*/
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.
diff --git a/src/sim/System.py b/src/sim/System.py
index 61fbe0e..e028f48 100644
--- a/src/sim/System.py
+++ b/src/sim/System.py
@@ -78,6 +78,10 @@
# 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")
diff --git a/src/sim/system.cc b/src/sim/system.cc
index 7841ec0..4e3416e 100644
--- a/src/sim/system.cc
+++ b/src/sim/system.cc
@@ -213,7 +213,8 @@
#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),
--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/30994
To unsubscribe, or for help writing mail filters, visit
https://gem5-review.googlesource.com/settings
Gerrit-Project: public/gem5
Gerrit-Branch: develop
Gerrit-Change-Id: I98c948a32a15049a4515e6c02a14595fb5fe379f
Gerrit-Change-Number: 30994
Gerrit-PatchSet: 7
Gerrit-Owner: Boris Shingarov <shinga...@gmail.com>
Gerrit-Reviewer: Andreas Sandberg <andreas.sandb...@arm.com>
Gerrit-Reviewer: Boris Shingarov <shinga...@gmail.com>
Gerrit-Reviewer: Gabe Black <gabebl...@google.com>
Gerrit-Reviewer: Jason Lowe-Power <power...@gmail.com>
Gerrit-Reviewer: kokoro <noreply+kok...@google.com>
Gerrit-MessageType: merged
_______________________________________________
gem5-dev mailing list -- gem5-dev@gem5.org
To unsubscribe send an email to gem5-dev-le...@gem5.org
%(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s