mem: Cancel cache retry event when blocking port
authorRene de Jong <rene.dejong@arm.com>
Tue, 26 Mar 2013 18:46:51 +0000 (14:46 -0400)
committerRene de Jong <rene.dejong@arm.com>
Tue, 26 Mar 2013 18:46:51 +0000 (14:46 -0400)
This patch solves the corner case scenario where the sendRetryEvent could be
scheduled twice, when an io device stresses the IOcache in the system. This
should not be possible in the cache system.

src/mem/cache/base.cc

index 476c086ed07831f6191172697f5192dd81d17695..85265b61e2b7b9090c44d7cfa5bee1eaa97ba918 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012 ARM Limited
+ * Copyright (c) 2012-2013 ARM Limited
  * All rights reserved.
  *
  * The license below extends only to copyright in the software and shall
@@ -88,6 +88,13 @@ BaseCache::CacheSlavePort::setBlocked()
     assert(!blocked);
     DPRINTF(CachePort, "Cache port %s blocking new requests\n", name());
     blocked = true;
+    // if we already scheduled a retry in this cycle, but it has not yet
+    // happened, cancel it
+    if (sendRetryEvent.scheduled()) {
+       owner.deschedule(sendRetryEvent);
+       DPRINTF(CachePort, "Cache port %s deschedule retry\n", name());
+       mustSendRetry = true;
+    }
 }
 
 void