diff -r 85ac67b53235 -r c64bbbe67e13 src/mem/XBar.py --- a/src/mem/XBar.py Fri Aug 21 16:47:48 2015 +0100 +++ b/src/mem/XBar.py Fri Aug 21 16:47:57 2015 +0100 @@ -112,6 +112,9 @@ 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('16MB', "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 @@ 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 -r 85ac67b53235 -r c64bbbe67e13 src/mem/snoop_filter.hh --- a/src/mem/snoop_filter.hh Fri Aug 21 16:47:48 2015 +0100 +++ b/src/mem/snoop_filter.hh Fri Aug 21 16:47:57 2015 +0100 @@ -90,7 +90,8 @@ 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 @@ 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; diff -r 85ac67b53235 -r c64bbbe67e13 src/mem/snoop_filter.cc --- a/src/mem/snoop_filter.cc Fri Aug 21 16:47:48 2015 +0100 +++ b/src/mem/snoop_filter.cc Fri Aug 21 16:47:57 2015 +0100 @@ -184,6 +184,10 @@ 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.