ruby: Fix CacheMemory allocate leak
authorJoel Hestness <jthestness@gmail.com>
Tue, 29 Sep 2015 14:28:26 +0000 (09:28 -0500)
committerJoel Hestness <jthestness@gmail.com>
Tue, 29 Sep 2015 14:28:26 +0000 (09:28 -0500)
If a cache entry permission was previously set to NotPresent, but the entry was
not deleted, a following cache allocation can cause the entry to be leaked by
setting the entry pointer to a newly allocated entry. To eliminate this
possibility, check if the new entry is different from the old one, and if so,
delete the old one.

src/mem/ruby/structures/CacheMemory.cc

index b0e54ec9972ffd1996cd0643f46c1c57732ccfd6..6e4022ea6653e5f595a1c7df018501caf8c47e01 100644 (file)
@@ -263,6 +263,13 @@ CacheMemory::allocate(Addr address, AbstractCacheEntry *entry, bool touch)
     std::vector<AbstractCacheEntry*> &set = m_cache[cacheSet];
     for (int i = 0; i < m_cache_assoc; i++) {
         if (!set[i] || set[i]->m_Permission == AccessPermission_NotPresent) {
+            if (set[i] && (set[i] != entry)) {
+                warn_once("This protocol contains a cache entry handling bug: "
+                    "Entries in the cache should never be NotPresent! If\n"
+                    "this entry (%#x) is not tracked elsewhere, it will memory "
+                    "leak here. Fix your protocol to eliminate these!",
+                    address);
+            }
             set[i] = entry;  // Init entry
             set[i]->m_Address = address;
             set[i]->m_Permission = AccessPermission_Invalid;