mem: Optionally share the backing store
authorBoris Shingarov <shingarov@labware.com>
Sun, 8 Mar 2020 16:37:16 +0000 (12:37 -0400)
committerBoris Shingarov <shingarov@gmail.com>
Wed, 8 Jul 2020 17:42:25 +0000 (17:42 +0000)
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>
src/mem/physical.cc
src/mem/physical.hh
src/sim/System.py
src/sim/system.cc

index 4bd812c2125bad8bd63e25e3da2fde93fcb05328..a03f20053fd2786752bfc2352c94542a510680e8 100644 (file)
@@ -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");
index 88a5cda1ff085610e18b356a1c3e8bc4ea044cc4..9d4ff9a7b74d8e6e72ecee174550e67bbc3efbbd 100644 (file)
@@ -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.
index 61fbe0e020393456c01e67f0f95acb7fbe0e83a3..e028f48b8375a098c14cd7a0d759e88d038c52d1 100644 (file)
@@ -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")
index 7841ec0338195ebab74dca16438485fca83eda0b..4e3416e5b0b42b8cc09d7b474baa6662494c53c5 100644 (file)
@@ -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),