summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mem/XBar.py8
-rwxr-xr-xsrc/mem/snoop_filter.cc4
-rwxr-xr-xsrc/mem/snoop_filter.hh5
3 files changed, 16 insertions, 1 deletions
diff --git a/src/mem/XBar.py b/src/mem/XBar.py
index a445b5e37..8614519b3 100644
--- a/src/mem/XBar.py
+++ b/src/mem/XBar.py
@@ -112,6 +112,9 @@ class SnoopFilter(SimObject):
system = Param.System(Parent.any, "System that the crossbar belongs to.")
+ # Sanity check on max capacity to track, adjust if needed.
+ max_capacity = Param.MemorySize('8MB', "Maximum capacity of snoop filter")
+
# We use a coherent crossbar to connect multiple masters to the L2
# caches. Normally this crossbar would be part of the cache itself.
class L2XBar(CoherentXBar):
@@ -125,6 +128,11 @@ class L2XBar(CoherentXBar):
response_latency = 1
snoop_response_latency = 1
+ # Use a snoop-filter by default, and set the latency to zero as
+ # the lookup is assumed to overlap with the frontend latency of
+ # the crossbar
+ snoop_filter = SnoopFilter(lookup_latency = 0)
+
# One of the key coherent crossbar instances is the system
# interconnect, tying together the CPU clusters, GPUs, and any I/O
# coherent masters, and DRAM controllers.
diff --git a/src/mem/snoop_filter.cc b/src/mem/snoop_filter.cc
index f6e6ef1b4..9b005cbc5 100755
--- a/src/mem/snoop_filter.cc
+++ b/src/mem/snoop_filter.cc
@@ -184,6 +184,10 @@ SnoopFilter::lookupSnoop(const Packet* cpkt)
auto sf_it = cachedLocations.find(line_addr);
bool is_hit = (sf_it != cachedLocations.end());
+ panic_if(!is_hit && (cachedLocations.size() >= maxEntryCount),
+ "snoop filter exceeded capacity of %d cache blocks\n",
+ maxEntryCount);
+
// If the snoop filter has no entry and its an uncacheable
// request, do not create a new snoop filter entry, simply return
// a NULL portlist.
diff --git a/src/mem/snoop_filter.hh b/src/mem/snoop_filter.hh
index b1e33dc8f..be3018e6e 100755
--- a/src/mem/snoop_filter.hh
+++ b/src/mem/snoop_filter.hh
@@ -90,7 +90,8 @@ class SnoopFilter : public SimObject {
SnoopFilter (const SnoopFilterParams *p) :
SimObject(p), reqLookupResult(cachedLocations.end()), retryItem{0, 0},
- linesize(p->system->cacheLineSize()), lookupLatency(p->lookup_latency)
+ linesize(p->system->cacheLineSize()), lookupLatency(p->lookup_latency),
+ maxEntryCount(p->max_capacity / p->system->cacheLineSize())
{
}
@@ -254,6 +255,8 @@ class SnoopFilter : public SimObject {
const unsigned linesize;
/** Latency for doing a lookup in the filter */
const Cycles lookupLatency;
+ /** Max capacity in terms of cache blocks tracked, for sanity checking */
+ const unsigned maxEntryCount;
/** Statistics */
Stats::Scalar totRequests;