mem, config: Selective use of snoop filter
authorStephan Diestelhorst <stephan.diestelhorst@arm.com>
Fri, 27 May 2016 16:05:58 +0000 (17:05 +0100)
committerStephan Diestelhorst <stephan.diestelhorst@arm.com>
Fri, 27 May 2016 16:05:58 +0000 (17:05 +0100)
Disable the default snoop filter in the SystemXBar so that the
typical membus does not have a snoop filter by default. Instead,
add the snoop filter only when there are caches added to the system
(with the caches / l2cache options).

The underlying problem is that the snoop filter grows without
bounds (for now) if there are no caches to tell it that lines have
been evicted. This causes slow regression runs for all the atomic
regressions. This patch fixes this behaviour.

--HG--
extra : source : f97c20511828209757440839ed48d741d02d428f

configs/common/CacheConfig.py
tests/configs/base_config.py

index 1a2c87828057d3f03d3f1ef1340e00535899ee0d..e4114355f07aa93d19412a40e7a8b049e8fe7cff 100644 (file)
@@ -153,6 +153,11 @@ def config_cache(options, system):
         else:
             system.cpu[i].connectAllPorts(system.membus)
 
+        # Add a snoop filter to the membus if there are caches above it
+        if (options.l2cache or options.caches) and \
+        (system.membus.snoop_filter == NULL):
+            system.membus.snoop_filter = SnoopFilter()
+
     return system
 
 # ExternalSlave provides a "port", but when that port connects to a cache,
index 3f28ada5dd2dd347668bf8f2252650cc51259335..185c0002038b03fece8b1de272e26d7cba4ab1f8 100644 (file)
@@ -126,6 +126,9 @@ class BaseSystem(object):
             cpu.createInterruptController()
             cpu.connectAllPorts(sha_bus if sha_bus != None else system.membus,
                                 system.membus)
+            # System has caches before the membus -> add snoop filter
+            if sha_bus and system.membus.snoop_filter == NULL:
+                system.membus.snoop_filter = SnoopFilter()
 
     def init_kvm(self, system):
         """Do KVM-specific system initialization.
@@ -149,6 +152,9 @@ class BaseSystem(object):
             self.init_kvm(system)
 
         sha_bus = self.create_caches_shared(system)
+        # System has caches before the membus -> add snoop filter
+        if sha_bus and system.membus.snoop_filter == NULL:
+            system.membus.snoop_filter = SnoopFilter()
         for cpu in system.cpu:
             self.init_cpu(system, cpu, sha_bus)